mirror of
https://github.com/vector-im/element-ios.git
synced 2024-09-29 07:42:40 +00:00
Merge branch 'develop' into element_3629
This commit is contained in:
commit
4f6109e604
43 changed files with 2352 additions and 180 deletions
|
@ -760,10 +760,6 @@
|
|||
EC3B066A24AC6ADE000DF9BF /* CrossSigningSetupBannerCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = EC3B066624AC6ADD000DF9BF /* CrossSigningSetupBannerCell.xib */; };
|
||||
EC3B066B24AC6ADE000DF9BF /* CrossSigningBannerPreferences.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC3B066724AC6ADD000DF9BF /* CrossSigningBannerPreferences.swift */; };
|
||||
EC3B066C24AC6ADE000DF9BF /* CrossSigningSetupBannerCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC3B066824AC6ADD000DF9BF /* CrossSigningSetupBannerCell.swift */; };
|
||||
EC6078762507B07E00EA75C1 /* DirectoryRoomTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC6078742507B07E00EA75C1 /* DirectoryRoomTableViewCell.swift */; };
|
||||
EC6078772507B07E00EA75C1 /* DirectoryRoomTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = EC6078752507B07E00EA75C1 /* DirectoryRoomTableViewCell.xib */; };
|
||||
EC60787B2507B0D200EA75C1 /* DirectoryNetworkTableHeaderFooterView.xib in Resources */ = {isa = PBXBuildFile; fileRef = EC6078792507B0D200EA75C1 /* DirectoryNetworkTableHeaderFooterView.xib */; };
|
||||
EC60787D2507D30200EA75C1 /* DirectoryNetworkTableHeaderFooterView.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC60787C2507D30200EA75C1 /* DirectoryNetworkTableHeaderFooterView.swift */; };
|
||||
EC619C1924DAD96000663A80 /* UIScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC619C1824DAD96000663A80 /* UIScrollView.swift */; };
|
||||
EC711B4624A63B13008F830C /* MXRecoveryService.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC711B4524A63B13008F830C /* MXRecoveryService.swift */; };
|
||||
EC711B7424A63B37008F830C /* SecretsSetupRecoveryKeyViewModelType.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC711B4A24A63B36008F830C /* SecretsSetupRecoveryKeyViewModelType.swift */; };
|
||||
|
@ -833,7 +829,6 @@
|
|||
EC85D72B2477DCF2002C44C9 /* KeyVerificationManuallyVerifyCoordinatorType.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC85D7232477DCF2002C44C9 /* KeyVerificationManuallyVerifyCoordinatorType.swift */; };
|
||||
EC85D72C2477DCF2002C44C9 /* KeyVerificationManuallyVerifyViewState.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC85D7242477DCF2002C44C9 /* KeyVerificationManuallyVerifyViewState.swift */; };
|
||||
EC85D7302477DD33002C44C9 /* JitsiWidgetData.m in Sources */ = {isa = PBXBuildFile; fileRef = EC85D72F2477DD33002C44C9 /* JitsiWidgetData.m */; };
|
||||
EC85D7342477DD54002C44C9 /* SectionHeaderView.m in Sources */ = {isa = PBXBuildFile; fileRef = EC85D7322477DD54002C44C9 /* SectionHeaderView.m */; };
|
||||
EC85D7372477DD97002C44C9 /* LocalContactsSectionHeaderContainerView.m in Sources */ = {isa = PBXBuildFile; fileRef = EC85D7352477DD97002C44C9 /* LocalContactsSectionHeaderContainerView.m */; };
|
||||
EC85D73A2477DDB8002C44C9 /* DirectorySectionHeaderContainerView.m in Sources */ = {isa = PBXBuildFile; fileRef = EC85D7392477DDB8002C44C9 /* DirectorySectionHeaderContainerView.m */; };
|
||||
EC85D73E2477DDD0002C44C9 /* PushNotificationService.m in Sources */ = {isa = PBXBuildFile; fileRef = EC85D73D2477DDD0002C44C9 /* PushNotificationService.m */; };
|
||||
|
@ -859,19 +854,48 @@
|
|||
ECB101332477CFDB00CF8C11 /* UITableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECB1012F2477CFDB00CF8C11 /* UITableViewCell.swift */; };
|
||||
ECB101362477D00700CF8C11 /* UniversalLink.m in Sources */ = {isa = PBXBuildFile; fileRef = ECB101352477D00700CF8C11 /* UniversalLink.m */; };
|
||||
ECDC15F224AF41D2003437CF /* FormattedBodyParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECDC15F124AF41D2003437CF /* FormattedBodyParser.swift */; };
|
||||
ECF57A64250A17FC004BBF9D /* MXThirdPartyProtocolInstance.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECF57A63250A17FC004BBF9D /* MXThirdPartyProtocolInstance.swift */; };
|
||||
ECF57A71250A2E40004BBF9D /* ShowDirectoryViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = ECF57A66250A2E40004BBF9D /* ShowDirectoryViewController.storyboard */; };
|
||||
ECF57A72250A2E40004BBF9D /* ShowDirectoryViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECF57A67250A2E40004BBF9D /* ShowDirectoryViewModel.swift */; };
|
||||
ECF57A73250A2E40004BBF9D /* ShowDirectoryViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECF57A68250A2E40004BBF9D /* ShowDirectoryViewController.swift */; };
|
||||
ECF57A74250A2E40004BBF9D /* ShowDirectoryViewState.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECF57A69250A2E40004BBF9D /* ShowDirectoryViewState.swift */; };
|
||||
ECF57A75250A2E40004BBF9D /* ShowDirectoryCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECF57A6A250A2E40004BBF9D /* ShowDirectoryCoordinator.swift */; };
|
||||
ECF57A76250A2E40004BBF9D /* ShowDirectoryCoordinatorType.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECF57A6B250A2E40004BBF9D /* ShowDirectoryCoordinatorType.swift */; };
|
||||
ECF57A77250A2E40004BBF9D /* ShowDirectoryViewModelType.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECF57A6C250A2E40004BBF9D /* ShowDirectoryViewModelType.swift */; };
|
||||
ECF57A78250A2E40004BBF9D /* ShowDirectoryViewAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECF57A6D250A2E40004BBF9D /* ShowDirectoryViewAction.swift */; };
|
||||
ECF57A7F250A3190004BBF9D /* RoomsDirectoryCoordinatorType.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECF57A7C250A318F004BBF9D /* RoomsDirectoryCoordinatorType.swift */; };
|
||||
ECF57A80250A3190004BBF9D /* RoomsDirectoryCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECF57A7D250A3190004BBF9D /* RoomsDirectoryCoordinator.swift */; };
|
||||
ECF57A81250A3190004BBF9D /* RoomsDirectoryCoordinatorBridgePresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECF57A7E250A3190004BBF9D /* RoomsDirectoryCoordinatorBridgePresenter.swift */; };
|
||||
ECF57A83250A3FB2004BBF9D /* DirectoryRoomTableViewCellVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECF57A82250A3FB2004BBF9D /* DirectoryRoomTableViewCellVM.swift */; };
|
||||
ECF57A4425090C23004BBF9D /* CreateRoomCoordinatorBridgePresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECF57A3825090C23004BBF9D /* CreateRoomCoordinatorBridgePresenter.swift */; };
|
||||
ECF57A4525090C23004BBF9D /* CreateRoomCoordinatorType.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECF57A3925090C23004BBF9D /* CreateRoomCoordinatorType.swift */; };
|
||||
ECF57A4625090C23004BBF9D /* CreateRoomCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECF57A3A25090C23004BBF9D /* CreateRoomCoordinator.swift */; };
|
||||
ECF57A4725090C23004BBF9D /* EnterNewRoomDetailsViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = ECF57A3C25090C23004BBF9D /* EnterNewRoomDetailsViewController.storyboard */; };
|
||||
ECF57A4825090C23004BBF9D /* EnterNewRoomDetailsCoordinatorType.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECF57A3D25090C23004BBF9D /* EnterNewRoomDetailsCoordinatorType.swift */; };
|
||||
ECF57A4925090C23004BBF9D /* EnterNewRoomDetailsViewState.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECF57A3E25090C23004BBF9D /* EnterNewRoomDetailsViewState.swift */; };
|
||||
ECF57A4A25090C23004BBF9D /* EnterNewRoomDetailsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECF57A3F25090C23004BBF9D /* EnterNewRoomDetailsViewController.swift */; };
|
||||
ECF57A4B25090C23004BBF9D /* EnterNewRoomDetailsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECF57A4025090C23004BBF9D /* EnterNewRoomDetailsViewModel.swift */; };
|
||||
ECF57A4C25090C23004BBF9D /* EnterNewRoomDetailsViewAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECF57A4125090C23004BBF9D /* EnterNewRoomDetailsViewAction.swift */; };
|
||||
ECF57A4D25090C23004BBF9D /* EnterNewRoomDetailsCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECF57A4225090C23004BBF9D /* EnterNewRoomDetailsCoordinator.swift */; };
|
||||
ECF57A4E25090C23004BBF9D /* EnterNewRoomDetailsViewModelType.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECF57A4325090C23004BBF9D /* EnterNewRoomDetailsViewModelType.swift */; };
|
||||
ECF57A50250913E4004BBF9D /* MXKTableViewCellWithLabelAndSwitch.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECF57A4F250913E4004BBF9D /* MXKTableViewCellWithLabelAndSwitch.swift */; };
|
||||
ECF57A5525091B4D004BBF9D /* RoomCreationParameters.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECF57A5425091B4D004BBF9D /* RoomCreationParameters.swift */; };
|
||||
ECF57A5725091ECC004BBF9D /* MXKTableViewCellWithTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECF57A5625091ECC004BBF9D /* MXKTableViewCellWithTextView.swift */; };
|
||||
ECF57A5A250925AC004BBF9D /* TextFieldTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECF57A58250925AC004BBF9D /* TextFieldTableViewCell.swift */; };
|
||||
ECF57A5B250925AC004BBF9D /* TextFieldTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = ECF57A59250925AC004BBF9D /* TextFieldTableViewCell.xib */; };
|
||||
ECF57A5E2509265A004BBF9D /* InsettedTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECF57A5D2509265A004BBF9D /* InsettedTextField.swift */; };
|
||||
ECF57A6225093B04004BBF9D /* SectionHeaderView.m in Sources */ = {isa = PBXBuildFile; fileRef = ECF57A6025093B04004BBF9D /* SectionHeaderView.m */; };
|
||||
ECF57A85250A64F0004BBF9D /* PlaceholderedTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECF57A84250A64F0004BBF9D /* PlaceholderedTextView.swift */; };
|
||||
ECF57A87250A6872004BBF9D /* TextViewTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECF57A86250A6872004BBF9D /* TextViewTableViewCell.swift */; };
|
||||
ECF57A89250A687B004BBF9D /* TextViewTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = ECF57A88250A687B004BBF9D /* TextViewTableViewCell.xib */; };
|
||||
ECFBD5C9250A7AAF00DD5F5A /* RoomsDirectoryCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECFBD5B5250A7AAE00DD5F5A /* RoomsDirectoryCoordinator.swift */; };
|
||||
ECFBD5CA250A7AAF00DD5F5A /* ShowDirectoryViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = ECFBD5B7250A7AAF00DD5F5A /* ShowDirectoryViewController.storyboard */; };
|
||||
ECFBD5CB250A7AAF00DD5F5A /* DirectoryRoomTableViewCellVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECFBD5BA250A7AAF00DD5F5A /* DirectoryRoomTableViewCellVM.swift */; };
|
||||
ECFBD5CC250A7AAF00DD5F5A /* DirectoryRoomTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECFBD5BB250A7AAF00DD5F5A /* DirectoryRoomTableViewCell.swift */; };
|
||||
ECFBD5CD250A7AAF00DD5F5A /* DirectoryRoomTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = ECFBD5BC250A7AAF00DD5F5A /* DirectoryRoomTableViewCell.xib */; };
|
||||
ECFBD5CE250A7AAF00DD5F5A /* DirectoryNetworkTableHeaderFooterView.xib in Resources */ = {isa = PBXBuildFile; fileRef = ECFBD5BE250A7AAF00DD5F5A /* DirectoryNetworkTableHeaderFooterView.xib */; };
|
||||
ECFBD5CF250A7AAF00DD5F5A /* DirectoryNetworkTableHeaderFooterView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECFBD5BF250A7AAF00DD5F5A /* DirectoryNetworkTableHeaderFooterView.swift */; };
|
||||
ECFBD5D0250A7AAF00DD5F5A /* ShowDirectoryViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECFBD5C0250A7AAF00DD5F5A /* ShowDirectoryViewModel.swift */; };
|
||||
ECFBD5D1250A7AAF00DD5F5A /* ShowDirectoryViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECFBD5C1250A7AAF00DD5F5A /* ShowDirectoryViewController.swift */; };
|
||||
ECFBD5D2250A7AAF00DD5F5A /* ShowDirectoryViewState.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECFBD5C2250A7AAF00DD5F5A /* ShowDirectoryViewState.swift */; };
|
||||
ECFBD5D3250A7AAF00DD5F5A /* ShowDirectoryCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECFBD5C3250A7AAF00DD5F5A /* ShowDirectoryCoordinator.swift */; };
|
||||
ECFBD5D4250A7AAF00DD5F5A /* ShowDirectoryCoordinatorType.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECFBD5C4250A7AAF00DD5F5A /* ShowDirectoryCoordinatorType.swift */; };
|
||||
ECFBD5D5250A7AAF00DD5F5A /* ShowDirectoryViewModelType.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECFBD5C5250A7AAF00DD5F5A /* ShowDirectoryViewModelType.swift */; };
|
||||
ECFBD5D6250A7AAF00DD5F5A /* ShowDirectoryViewAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECFBD5C6250A7AAF00DD5F5A /* ShowDirectoryViewAction.swift */; };
|
||||
ECFBD5D7250A7AAF00DD5F5A /* RoomsDirectoryCoordinatorBridgePresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECFBD5C7250A7AAF00DD5F5A /* RoomsDirectoryCoordinatorBridgePresenter.swift */; };
|
||||
ECFBD5D8250A7AAF00DD5F5A /* RoomsDirectoryCoordinatorType.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECFBD5C8250A7AAF00DD5F5A /* RoomsDirectoryCoordinatorType.swift */; };
|
||||
ECFBD5DA250A7ABD00DD5F5A /* MXThirdPartyProtocolInstance.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECFBD5D9250A7ABD00DD5F5A /* MXThirdPartyProtocolInstance.swift */; };
|
||||
ECFBD5DC250A82B200DD5F5A /* TableViewHeaderFooterView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECFBD5DB250A82B200DD5F5A /* TableViewHeaderFooterView.swift */; };
|
||||
ECFBD5E0250B684E00DD5F5A /* ChooseAvatarTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECFBD5DE250B684E00DD5F5A /* ChooseAvatarTableViewCell.swift */; };
|
||||
ECFBD5E1250B684E00DD5F5A /* ChooseAvatarTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = ECFBD5DF250B684E00DD5F5A /* ChooseAvatarTableViewCell.xib */; };
|
||||
ECFBD5E3250B6CAB00DD5F5A /* ChooseAvatarTableViewCellVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECFBD5E2250B6CAB00DD5F5A /* ChooseAvatarTableViewCellVM.swift */; };
|
||||
F05927C91FDED836009F2A68 /* MXGroup+Riot.m in Sources */ = {isa = PBXBuildFile; fileRef = F05927C71FDED835009F2A68 /* MXGroup+Riot.m */; };
|
||||
F083BD1E1E7009ED00A9B29C /* LegacyAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = F083BB0D1E7009EC00A9B29C /* LegacyAppDelegate.m */; };
|
||||
F083BDE61E7009ED00A9B29C /* busy.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = F083BBDB1E7009EC00A9B29C /* busy.mp3 */; };
|
||||
|
@ -1905,10 +1929,6 @@
|
|||
EC3B066624AC6ADD000DF9BF /* CrossSigningSetupBannerCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = CrossSigningSetupBannerCell.xib; sourceTree = "<group>"; };
|
||||
EC3B066724AC6ADD000DF9BF /* CrossSigningBannerPreferences.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CrossSigningBannerPreferences.swift; sourceTree = "<group>"; };
|
||||
EC3B066824AC6ADD000DF9BF /* CrossSigningSetupBannerCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CrossSigningSetupBannerCell.swift; sourceTree = "<group>"; };
|
||||
EC6078742507B07E00EA75C1 /* DirectoryRoomTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DirectoryRoomTableViewCell.swift; sourceTree = "<group>"; };
|
||||
EC6078752507B07E00EA75C1 /* DirectoryRoomTableViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = DirectoryRoomTableViewCell.xib; sourceTree = "<group>"; };
|
||||
EC6078792507B0D200EA75C1 /* DirectoryNetworkTableHeaderFooterView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = DirectoryNetworkTableHeaderFooterView.xib; sourceTree = "<group>"; };
|
||||
EC60787C2507D30200EA75C1 /* DirectoryNetworkTableHeaderFooterView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DirectoryNetworkTableHeaderFooterView.swift; sourceTree = "<group>"; };
|
||||
EC619C1824DAD96000663A80 /* UIScrollView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIScrollView.swift; sourceTree = "<group>"; };
|
||||
EC711B4524A63B13008F830C /* MXRecoveryService.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MXRecoveryService.swift; sourceTree = "<group>"; };
|
||||
EC711B4A24A63B36008F830C /* SecretsSetupRecoveryKeyViewModelType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SecretsSetupRecoveryKeyViewModelType.swift; sourceTree = "<group>"; };
|
||||
|
@ -1979,8 +1999,6 @@
|
|||
EC85D7242477DCF2002C44C9 /* KeyVerificationManuallyVerifyViewState.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KeyVerificationManuallyVerifyViewState.swift; sourceTree = "<group>"; };
|
||||
EC85D72E2477DD33002C44C9 /* JitsiWidgetData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JitsiWidgetData.h; sourceTree = "<group>"; };
|
||||
EC85D72F2477DD33002C44C9 /* JitsiWidgetData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JitsiWidgetData.m; sourceTree = "<group>"; };
|
||||
EC85D7322477DD54002C44C9 /* SectionHeaderView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SectionHeaderView.m; sourceTree = "<group>"; };
|
||||
EC85D7332477DD54002C44C9 /* SectionHeaderView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SectionHeaderView.h; sourceTree = "<group>"; };
|
||||
EC85D7352477DD97002C44C9 /* LocalContactsSectionHeaderContainerView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LocalContactsSectionHeaderContainerView.m; sourceTree = "<group>"; };
|
||||
EC85D7362477DD97002C44C9 /* LocalContactsSectionHeaderContainerView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LocalContactsSectionHeaderContainerView.h; sourceTree = "<group>"; };
|
||||
EC85D7382477DDB8002C44C9 /* DirectorySectionHeaderContainerView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DirectorySectionHeaderContainerView.h; sourceTree = "<group>"; };
|
||||
|
@ -2006,19 +2024,49 @@
|
|||
ECB101342477D00700CF8C11 /* UniversalLink.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UniversalLink.h; sourceTree = "<group>"; };
|
||||
ECB101352477D00700CF8C11 /* UniversalLink.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UniversalLink.m; sourceTree = "<group>"; };
|
||||
ECDC15F124AF41D2003437CF /* FormattedBodyParser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FormattedBodyParser.swift; sourceTree = "<group>"; };
|
||||
ECF57A63250A17FC004BBF9D /* MXThirdPartyProtocolInstance.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MXThirdPartyProtocolInstance.swift; sourceTree = "<group>"; };
|
||||
ECF57A66250A2E40004BBF9D /* ShowDirectoryViewController.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = ShowDirectoryViewController.storyboard; sourceTree = "<group>"; };
|
||||
ECF57A67250A2E40004BBF9D /* ShowDirectoryViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShowDirectoryViewModel.swift; sourceTree = "<group>"; };
|
||||
ECF57A68250A2E40004BBF9D /* ShowDirectoryViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShowDirectoryViewController.swift; sourceTree = "<group>"; };
|
||||
ECF57A69250A2E40004BBF9D /* ShowDirectoryViewState.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShowDirectoryViewState.swift; sourceTree = "<group>"; };
|
||||
ECF57A6A250A2E40004BBF9D /* ShowDirectoryCoordinator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShowDirectoryCoordinator.swift; sourceTree = "<group>"; };
|
||||
ECF57A6B250A2E40004BBF9D /* ShowDirectoryCoordinatorType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShowDirectoryCoordinatorType.swift; sourceTree = "<group>"; };
|
||||
ECF57A6C250A2E40004BBF9D /* ShowDirectoryViewModelType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShowDirectoryViewModelType.swift; sourceTree = "<group>"; };
|
||||
ECF57A6D250A2E40004BBF9D /* ShowDirectoryViewAction.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShowDirectoryViewAction.swift; sourceTree = "<group>"; };
|
||||
ECF57A7C250A318F004BBF9D /* RoomsDirectoryCoordinatorType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RoomsDirectoryCoordinatorType.swift; sourceTree = "<group>"; };
|
||||
ECF57A7D250A3190004BBF9D /* RoomsDirectoryCoordinator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RoomsDirectoryCoordinator.swift; sourceTree = "<group>"; };
|
||||
ECF57A7E250A3190004BBF9D /* RoomsDirectoryCoordinatorBridgePresenter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RoomsDirectoryCoordinatorBridgePresenter.swift; sourceTree = "<group>"; };
|
||||
ECF57A82250A3FB2004BBF9D /* DirectoryRoomTableViewCellVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DirectoryRoomTableViewCellVM.swift; sourceTree = "<group>"; };
|
||||
ECF57A3825090C23004BBF9D /* CreateRoomCoordinatorBridgePresenter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CreateRoomCoordinatorBridgePresenter.swift; sourceTree = "<group>"; };
|
||||
ECF57A3925090C23004BBF9D /* CreateRoomCoordinatorType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CreateRoomCoordinatorType.swift; sourceTree = "<group>"; };
|
||||
ECF57A3A25090C23004BBF9D /* CreateRoomCoordinator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CreateRoomCoordinator.swift; sourceTree = "<group>"; };
|
||||
ECF57A3C25090C23004BBF9D /* EnterNewRoomDetailsViewController.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = EnterNewRoomDetailsViewController.storyboard; sourceTree = "<group>"; };
|
||||
ECF57A3D25090C23004BBF9D /* EnterNewRoomDetailsCoordinatorType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EnterNewRoomDetailsCoordinatorType.swift; sourceTree = "<group>"; };
|
||||
ECF57A3E25090C23004BBF9D /* EnterNewRoomDetailsViewState.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EnterNewRoomDetailsViewState.swift; sourceTree = "<group>"; };
|
||||
ECF57A3F25090C23004BBF9D /* EnterNewRoomDetailsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EnterNewRoomDetailsViewController.swift; sourceTree = "<group>"; };
|
||||
ECF57A4025090C23004BBF9D /* EnterNewRoomDetailsViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EnterNewRoomDetailsViewModel.swift; sourceTree = "<group>"; };
|
||||
ECF57A4125090C23004BBF9D /* EnterNewRoomDetailsViewAction.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EnterNewRoomDetailsViewAction.swift; sourceTree = "<group>"; };
|
||||
ECF57A4225090C23004BBF9D /* EnterNewRoomDetailsCoordinator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EnterNewRoomDetailsCoordinator.swift; sourceTree = "<group>"; };
|
||||
ECF57A4325090C23004BBF9D /* EnterNewRoomDetailsViewModelType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EnterNewRoomDetailsViewModelType.swift; sourceTree = "<group>"; };
|
||||
ECF57A4F250913E4004BBF9D /* MXKTableViewCellWithLabelAndSwitch.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MXKTableViewCellWithLabelAndSwitch.swift; sourceTree = "<group>"; };
|
||||
ECF57A5425091B4D004BBF9D /* RoomCreationParameters.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomCreationParameters.swift; sourceTree = "<group>"; };
|
||||
ECF57A5625091ECC004BBF9D /* MXKTableViewCellWithTextView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MXKTableViewCellWithTextView.swift; sourceTree = "<group>"; };
|
||||
ECF57A58250925AC004BBF9D /* TextFieldTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextFieldTableViewCell.swift; sourceTree = "<group>"; };
|
||||
ECF57A59250925AC004BBF9D /* TextFieldTableViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = TextFieldTableViewCell.xib; sourceTree = "<group>"; };
|
||||
ECF57A5D2509265A004BBF9D /* InsettedTextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InsettedTextField.swift; sourceTree = "<group>"; };
|
||||
ECF57A6025093B04004BBF9D /* SectionHeaderView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SectionHeaderView.m; sourceTree = "<group>"; };
|
||||
ECF57A6125093B04004BBF9D /* SectionHeaderView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SectionHeaderView.h; sourceTree = "<group>"; };
|
||||
ECF57A84250A64F0004BBF9D /* PlaceholderedTextView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlaceholderedTextView.swift; sourceTree = "<group>"; };
|
||||
ECF57A86250A6872004BBF9D /* TextViewTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TextViewTableViewCell.swift; sourceTree = "<group>"; };
|
||||
ECF57A88250A687B004BBF9D /* TextViewTableViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = TextViewTableViewCell.xib; sourceTree = "<group>"; };
|
||||
ECFBD5B5250A7AAE00DD5F5A /* RoomsDirectoryCoordinator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RoomsDirectoryCoordinator.swift; sourceTree = "<group>"; };
|
||||
ECFBD5B7250A7AAF00DD5F5A /* ShowDirectoryViewController.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = ShowDirectoryViewController.storyboard; sourceTree = "<group>"; };
|
||||
ECFBD5BA250A7AAF00DD5F5A /* DirectoryRoomTableViewCellVM.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DirectoryRoomTableViewCellVM.swift; sourceTree = "<group>"; };
|
||||
ECFBD5BB250A7AAF00DD5F5A /* DirectoryRoomTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DirectoryRoomTableViewCell.swift; sourceTree = "<group>"; };
|
||||
ECFBD5BC250A7AAF00DD5F5A /* DirectoryRoomTableViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = DirectoryRoomTableViewCell.xib; sourceTree = "<group>"; };
|
||||
ECFBD5BE250A7AAF00DD5F5A /* DirectoryNetworkTableHeaderFooterView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = DirectoryNetworkTableHeaderFooterView.xib; sourceTree = "<group>"; };
|
||||
ECFBD5BF250A7AAF00DD5F5A /* DirectoryNetworkTableHeaderFooterView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DirectoryNetworkTableHeaderFooterView.swift; sourceTree = "<group>"; };
|
||||
ECFBD5C0250A7AAF00DD5F5A /* ShowDirectoryViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShowDirectoryViewModel.swift; sourceTree = "<group>"; };
|
||||
ECFBD5C1250A7AAF00DD5F5A /* ShowDirectoryViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShowDirectoryViewController.swift; sourceTree = "<group>"; };
|
||||
ECFBD5C2250A7AAF00DD5F5A /* ShowDirectoryViewState.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShowDirectoryViewState.swift; sourceTree = "<group>"; };
|
||||
ECFBD5C3250A7AAF00DD5F5A /* ShowDirectoryCoordinator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShowDirectoryCoordinator.swift; sourceTree = "<group>"; };
|
||||
ECFBD5C4250A7AAF00DD5F5A /* ShowDirectoryCoordinatorType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShowDirectoryCoordinatorType.swift; sourceTree = "<group>"; };
|
||||
ECFBD5C5250A7AAF00DD5F5A /* ShowDirectoryViewModelType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShowDirectoryViewModelType.swift; sourceTree = "<group>"; };
|
||||
ECFBD5C6250A7AAF00DD5F5A /* ShowDirectoryViewAction.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShowDirectoryViewAction.swift; sourceTree = "<group>"; };
|
||||
ECFBD5C7250A7AAF00DD5F5A /* RoomsDirectoryCoordinatorBridgePresenter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RoomsDirectoryCoordinatorBridgePresenter.swift; sourceTree = "<group>"; };
|
||||
ECFBD5C8250A7AAF00DD5F5A /* RoomsDirectoryCoordinatorType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RoomsDirectoryCoordinatorType.swift; sourceTree = "<group>"; };
|
||||
ECFBD5D9250A7ABD00DD5F5A /* MXThirdPartyProtocolInstance.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MXThirdPartyProtocolInstance.swift; sourceTree = "<group>"; };
|
||||
ECFBD5DB250A82B200DD5F5A /* TableViewHeaderFooterView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TableViewHeaderFooterView.swift; sourceTree = "<group>"; };
|
||||
ECFBD5DE250B684E00DD5F5A /* ChooseAvatarTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChooseAvatarTableViewCell.swift; sourceTree = "<group>"; };
|
||||
ECFBD5DF250B684E00DD5F5A /* ChooseAvatarTableViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ChooseAvatarTableViewCell.xib; sourceTree = "<group>"; };
|
||||
ECFBD5E2250B6CAB00DD5F5A /* ChooseAvatarTableViewCellVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChooseAvatarTableViewCellVM.swift; sourceTree = "<group>"; };
|
||||
F05927C71FDED835009F2A68 /* MXGroup+Riot.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "MXGroup+Riot.m"; sourceTree = "<group>"; };
|
||||
F05927C81FDED835009F2A68 /* MXGroup+Riot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "MXGroup+Riot.h"; sourceTree = "<group>"; };
|
||||
F083BB031E7005FD00A9B29C /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
|
@ -3188,6 +3236,7 @@
|
|||
B1B5567620EE6C4C00210D55 /* Modules */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
ECF57A3725090C23004BBF9D /* CreateRoom */,
|
||||
B1BB648724FD07B3008238AE /* Application */,
|
||||
EC1CA84F24C1DEC400DE9EBF /* SetPinCode */,
|
||||
EC3B066324AC6ADD000DF9BF /* CrossSigning */,
|
||||
|
@ -3502,8 +3551,9 @@
|
|||
B1B556CD20EE6C4C00210D55 /* Common */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
ECF57A5F25093B04004BBF9D /* SectionHeaders */,
|
||||
ECF57A5C2509264B004BBF9D /* Views */,
|
||||
ECAE7AEA24EC223D002FA813 /* Models */,
|
||||
EC85D7312477DD54002C44C9 /* SectionHeaders */,
|
||||
B183226923F59F3E0035B2E8 /* Buttons */,
|
||||
B1963B3622933B9500CBA17F /* CollectionView */,
|
||||
B1B556CE20EE6C4C00210D55 /* WebViewController */,
|
||||
|
@ -3627,10 +3677,10 @@
|
|||
B1B556F420EE6C4C00210D55 /* Rooms */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
ECF57A7D250A3190004BBF9D /* RoomsDirectoryCoordinator.swift */,
|
||||
ECF57A7E250A3190004BBF9D /* RoomsDirectoryCoordinatorBridgePresenter.swift */,
|
||||
ECF57A7C250A318F004BBF9D /* RoomsDirectoryCoordinatorType.swift */,
|
||||
ECF57A65250A2E40004BBF9D /* ShowDirectory */,
|
||||
ECFBD5B5250A7AAE00DD5F5A /* RoomsDirectoryCoordinator.swift */,
|
||||
ECFBD5C7250A7AAF00DD5F5A /* RoomsDirectoryCoordinatorBridgePresenter.swift */,
|
||||
ECFBD5C8250A7AAF00DD5F5A /* RoomsDirectoryCoordinatorType.swift */,
|
||||
ECFBD5B6250A7AAF00DD5F5A /* ShowDirectory */,
|
||||
B1B556F620EE6C4C00210D55 /* RoomsViewController.h */,
|
||||
B1B556F820EE6C4C00210D55 /* RoomsViewController.m */,
|
||||
B1B5577820EE75ED00210D55 /* DirectoryPicker */,
|
||||
|
@ -4192,6 +4242,10 @@
|
|||
B1B5592820EF7A5D00210D55 /* TableViewCellWithButton.h */,
|
||||
B1B5592A20EF7A5D00210D55 /* TableViewCellWithButton.m */,
|
||||
B1B5592920EF7A5D00210D55 /* TableViewCellWithButton.xib */,
|
||||
ECF57A58250925AC004BBF9D /* TextFieldTableViewCell.swift */,
|
||||
ECF57A59250925AC004BBF9D /* TextFieldTableViewCell.xib */,
|
||||
ECF57A86250A6872004BBF9D /* TextViewTableViewCell.swift */,
|
||||
ECF57A88250A687B004BBF9D /* TextViewTableViewCell.xib */,
|
||||
);
|
||||
path = Cells;
|
||||
sourceTree = "<group>";
|
||||
|
@ -4682,34 +4736,6 @@
|
|||
path = Banners;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
EC6078712507B04500EA75C1 /* Cells */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
EC6078732507B05600EA75C1 /* Room */,
|
||||
EC6078722507B04D00EA75C1 /* Directory */,
|
||||
);
|
||||
path = Cells;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
EC6078722507B04D00EA75C1 /* Directory */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
EC60787C2507D30200EA75C1 /* DirectoryNetworkTableHeaderFooterView.swift */,
|
||||
EC6078792507B0D200EA75C1 /* DirectoryNetworkTableHeaderFooterView.xib */,
|
||||
);
|
||||
path = Directory;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
EC6078732507B05600EA75C1 /* Room */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
EC6078742507B07E00EA75C1 /* DirectoryRoomTableViewCell.swift */,
|
||||
EC6078752507B07E00EA75C1 /* DirectoryRoomTableViewCell.xib */,
|
||||
ECF57A82250A3FB2004BBF9D /* DirectoryRoomTableViewCellVM.swift */,
|
||||
);
|
||||
path = Room;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
EC711B4724A63B36008F830C /* Secrets */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
|
@ -4891,15 +4917,6 @@
|
|||
path = JSONModels;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
EC85D7312477DD54002C44C9 /* SectionHeaders */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
EC85D7322477DD54002C44C9 /* SectionHeaderView.m */,
|
||||
EC85D7332477DD54002C44C9 /* SectionHeaderView.h */,
|
||||
);
|
||||
path = SectionHeaders;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
EC85D73B2477DDD0002C44C9 /* PushNotification */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
|
@ -4934,22 +4951,115 @@
|
|||
path = Models;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
ECF57A65250A2E40004BBF9D /* ShowDirectory */ = {
|
||||
ECF57A3725090C23004BBF9D /* CreateRoom */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
ECF57A66250A2E40004BBF9D /* ShowDirectoryViewController.storyboard */,
|
||||
ECF57A67250A2E40004BBF9D /* ShowDirectoryViewModel.swift */,
|
||||
ECF57A68250A2E40004BBF9D /* ShowDirectoryViewController.swift */,
|
||||
ECF57A69250A2E40004BBF9D /* ShowDirectoryViewState.swift */,
|
||||
ECF57A6A250A2E40004BBF9D /* ShowDirectoryCoordinator.swift */,
|
||||
ECF57A6B250A2E40004BBF9D /* ShowDirectoryCoordinatorType.swift */,
|
||||
ECF57A6C250A2E40004BBF9D /* ShowDirectoryViewModelType.swift */,
|
||||
ECF57A6D250A2E40004BBF9D /* ShowDirectoryViewAction.swift */,
|
||||
EC6078712507B04500EA75C1 /* Cells */,
|
||||
ECF57A3825090C23004BBF9D /* CreateRoomCoordinatorBridgePresenter.swift */,
|
||||
ECF57A3925090C23004BBF9D /* CreateRoomCoordinatorType.swift */,
|
||||
ECF57A3A25090C23004BBF9D /* CreateRoomCoordinator.swift */,
|
||||
ECF57A5325091B3F004BBF9D /* Models */,
|
||||
ECF57A3B25090C23004BBF9D /* EnterNewRoomDetails */,
|
||||
);
|
||||
path = CreateRoom;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
ECF57A3B25090C23004BBF9D /* EnterNewRoomDetails */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
ECFBD5DD250B683300DD5F5A /* Cells */,
|
||||
ECF57A3C25090C23004BBF9D /* EnterNewRoomDetailsViewController.storyboard */,
|
||||
ECF57A3D25090C23004BBF9D /* EnterNewRoomDetailsCoordinatorType.swift */,
|
||||
ECF57A3E25090C23004BBF9D /* EnterNewRoomDetailsViewState.swift */,
|
||||
ECF57A3F25090C23004BBF9D /* EnterNewRoomDetailsViewController.swift */,
|
||||
ECF57A4025090C23004BBF9D /* EnterNewRoomDetailsViewModel.swift */,
|
||||
ECF57A4125090C23004BBF9D /* EnterNewRoomDetailsViewAction.swift */,
|
||||
ECF57A4225090C23004BBF9D /* EnterNewRoomDetailsCoordinator.swift */,
|
||||
ECF57A4325090C23004BBF9D /* EnterNewRoomDetailsViewModelType.swift */,
|
||||
);
|
||||
path = EnterNewRoomDetails;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
ECF57A5325091B3F004BBF9D /* Models */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
ECF57A5425091B4D004BBF9D /* RoomCreationParameters.swift */,
|
||||
);
|
||||
path = Models;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
ECF57A5C2509264B004BBF9D /* Views */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
ECF57A5D2509265A004BBF9D /* InsettedTextField.swift */,
|
||||
ECF57A84250A64F0004BBF9D /* PlaceholderedTextView.swift */,
|
||||
);
|
||||
path = Views;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
ECF57A5F25093B04004BBF9D /* SectionHeaders */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
ECF57A6025093B04004BBF9D /* SectionHeaderView.m */,
|
||||
ECF57A6125093B04004BBF9D /* SectionHeaderView.h */,
|
||||
ECFBD5DB250A82B200DD5F5A /* TableViewHeaderFooterView.swift */,
|
||||
);
|
||||
path = SectionHeaders;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
ECFBD5B6250A7AAF00DD5F5A /* ShowDirectory */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
ECFBD5B7250A7AAF00DD5F5A /* ShowDirectoryViewController.storyboard */,
|
||||
ECFBD5B8250A7AAF00DD5F5A /* Cells */,
|
||||
ECFBD5C0250A7AAF00DD5F5A /* ShowDirectoryViewModel.swift */,
|
||||
ECFBD5C1250A7AAF00DD5F5A /* ShowDirectoryViewController.swift */,
|
||||
ECFBD5C2250A7AAF00DD5F5A /* ShowDirectoryViewState.swift */,
|
||||
ECFBD5C3250A7AAF00DD5F5A /* ShowDirectoryCoordinator.swift */,
|
||||
ECFBD5C4250A7AAF00DD5F5A /* ShowDirectoryCoordinatorType.swift */,
|
||||
ECFBD5C5250A7AAF00DD5F5A /* ShowDirectoryViewModelType.swift */,
|
||||
ECFBD5C6250A7AAF00DD5F5A /* ShowDirectoryViewAction.swift */,
|
||||
);
|
||||
path = ShowDirectory;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
ECFBD5B8250A7AAF00DD5F5A /* Cells */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
ECFBD5B9250A7AAF00DD5F5A /* Room */,
|
||||
ECFBD5BD250A7AAF00DD5F5A /* Directory */,
|
||||
);
|
||||
path = Cells;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
ECFBD5B9250A7AAF00DD5F5A /* Room */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
ECFBD5BA250A7AAF00DD5F5A /* DirectoryRoomTableViewCellVM.swift */,
|
||||
ECFBD5BB250A7AAF00DD5F5A /* DirectoryRoomTableViewCell.swift */,
|
||||
ECFBD5BC250A7AAF00DD5F5A /* DirectoryRoomTableViewCell.xib */,
|
||||
);
|
||||
path = Room;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
ECFBD5BD250A7AAF00DD5F5A /* Directory */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
ECFBD5BE250A7AAF00DD5F5A /* DirectoryNetworkTableHeaderFooterView.xib */,
|
||||
ECFBD5BF250A7AAF00DD5F5A /* DirectoryNetworkTableHeaderFooterView.swift */,
|
||||
);
|
||||
path = Directory;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
ECFBD5DD250B683300DD5F5A /* Cells */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
ECFBD5DE250B684E00DD5F5A /* ChooseAvatarTableViewCell.swift */,
|
||||
ECFBD5DF250B684E00DD5F5A /* ChooseAvatarTableViewCell.xib */,
|
||||
ECFBD5E2250B6CAB00DD5F5A /* ChooseAvatarTableViewCellVM.swift */,
|
||||
);
|
||||
path = Cells;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
F083BB021E7005FD00A9B29C /* RiotTests */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
|
@ -5019,6 +5129,7 @@
|
|||
F083BBE41E7009EC00A9B29C /* Categories */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
ECFBD5D9250A7ABD00DD5F5A /* MXThirdPartyProtocolInstance.swift */,
|
||||
EC711B4524A63B13008F830C /* MXRecoveryService.swift */,
|
||||
ECB1012E2477CFDB00CF8C11 /* UIDevice.swift */,
|
||||
ECB1012D2477CFDB00CF8C11 /* UILabel.swift */,
|
||||
|
@ -5057,7 +5168,8 @@
|
|||
B11291EB238D704C0077B478 /* FloatingPoint.swift */,
|
||||
32FD757524D2C9BA00BA7B37 /* Bundle.swift */,
|
||||
ECAE7AED24EFDD1F002FA813 /* MXSessionState.swift */,
|
||||
ECF57A63250A17FC004BBF9D /* MXThirdPartyProtocolInstance.swift */,
|
||||
ECF57A4F250913E4004BBF9D /* MXKTableViewCellWithLabelAndSwitch.swift */,
|
||||
ECF57A5625091ECC004BBF9D /* MXKTableViewCellWithTextView.swift */,
|
||||
);
|
||||
path = Categories;
|
||||
sourceTree = "<group>";
|
||||
|
@ -5386,7 +5498,7 @@
|
|||
B1B5590A20EF768F00210D55 /* RoomOutgoingAttachmentWithoutSenderInfoBubbleCell.xib in Resources */,
|
||||
B1A6C113238BD245002882FD /* SlidingModalContainerView.xib in Resources */,
|
||||
B1B5594420EF7BD000210D55 /* TableViewCellWithCollectionView.xib in Resources */,
|
||||
ECF57A71250A2E40004BBF9D /* ShowDirectoryViewController.storyboard in Resources */,
|
||||
ECFBD5CA250A7AAF00DD5F5A /* ShowDirectoryViewController.storyboard in Resources */,
|
||||
B1B558D520EF768F00210D55 /* RoomIncomingEncryptedTextMsgWithPaginationTitleWithoutSenderNameBubbleCell.xib in Resources */,
|
||||
B12D79FC23E2462200FACEDC /* UserVerificationStartViewController.storyboard in Resources */,
|
||||
B1CE83D32422817200D07506 /* KeyVerificationVerifiedViewController.storyboard in Resources */,
|
||||
|
@ -5405,12 +5517,12 @@
|
|||
EC711BAA24A63B58008F830C /* SecureBackupSetupIntroCell.xib in Resources */,
|
||||
F083BDE71E7009ED00A9B29C /* callend.mp3 in Resources */,
|
||||
B1B558EF20EF768F00210D55 /* RoomMembershipCollapsedWithPaginationTitleBubbleCell.xib in Resources */,
|
||||
EC6078772507B07E00EA75C1 /* DirectoryRoomTableViewCell.xib in Resources */,
|
||||
EC711B7C24A63B37008F830C /* SecretsSetupRecoveryPassphraseViewController.storyboard in Resources */,
|
||||
B1B5573420EE6C4D00210D55 /* GroupDetailsViewController.xib in Resources */,
|
||||
B1B557E420EF60B900210D55 /* MessagesSearchResultAttachmentBubbleCell.xib in Resources */,
|
||||
B1B336C2242B933700F95EC4 /* KeyVerificationSelfVerifyStartViewController.storyboard in Resources */,
|
||||
B1B558F220EF768F00210D55 /* RoomIncomingTextMsgWithoutSenderNameBubbleCell.xib in Resources */,
|
||||
ECFBD5E1250B684E00DD5F5A /* ChooseAvatarTableViewCell.xib in Resources */,
|
||||
B1B558EA20EF768F00210D55 /* RoomOutgoingTextMsgWithPaginationTitleBubbleCell.xib in Resources */,
|
||||
B1B558CD20EF768F00210D55 /* RoomOutgoingEncryptedAttachmentWithPaginationTitleBubbleCell.xib in Resources */,
|
||||
B1B9DEEA22EB34EF0065E677 /* ReactionHistoryViewController.storyboard in Resources */,
|
||||
|
@ -5457,6 +5569,7 @@
|
|||
B1550FCA2420E8F500CE097B /* QRCodeReaderViewController.storyboard in Resources */,
|
||||
B1B5579C20EF575B00210D55 /* ForgotPasswordInputsView.xib in Resources */,
|
||||
F083BE011E7009ED00A9B29C /* third_party_licenses.html in Resources */,
|
||||
ECF57A89250A687B004BBF9D /* TextViewTableViewCell.xib in Resources */,
|
||||
EC3B066A24AC6ADE000DF9BF /* CrossSigningSetupBannerCell.xib in Resources */,
|
||||
B1098BFC21ECFE65000DDA48 /* PasswordStrengthView.xib in Resources */,
|
||||
B1B5573720EE6C4D00210D55 /* GroupParticipantsViewController.xib in Resources */,
|
||||
|
@ -5469,6 +5582,7 @@
|
|||
B1DCC61722E5E17100625807 /* EmojiPickerViewController.storyboard in Resources */,
|
||||
32891D6C2264CBA300C82226 /* SimpleScreenTemplateViewController.storyboard in Resources */,
|
||||
32D5D16123E1EE2700E3E37C /* ManageSession.storyboard in Resources */,
|
||||
ECF57A5B250925AC004BBF9D /* TextFieldTableViewCell.xib in Resources */,
|
||||
B1963B2C228F1C4900CBA17F /* BubbleReactionViewCell.xib in Resources */,
|
||||
B1664DA320F4F96200808783 /* Vector.strings in Resources */,
|
||||
B1B557C720EF5CD400210D55 /* DirectoryServerDetailTableViewCell.xib in Resources */,
|
||||
|
@ -5505,6 +5619,7 @@
|
|||
B1B5574220EE6C4D00210D55 /* RecentsViewController.xib in Resources */,
|
||||
B1B5571C20EE6C4D00210D55 /* DeactivateAccountViewController.storyboard in Resources */,
|
||||
B1B5596520EF9E9B00210D55 /* RoomTableViewCell.xib in Resources */,
|
||||
ECFBD5CD250A7AAF00DD5F5A /* DirectoryRoomTableViewCell.xib in Resources */,
|
||||
B1B557C020EF5B4500210D55 /* RoomInputToolbarView.xib in Resources */,
|
||||
B1B5583D20EF6E7F00210D55 /* GroupRoomTableViewCell.xib in Resources */,
|
||||
B1B5572D20EE6C4D00210D55 /* RoomParticipantsViewController.xib in Resources */,
|
||||
|
@ -5536,8 +5651,8 @@
|
|||
B1B5590F20EF782800210D55 /* TableViewCellWithPhoneNumberTextField.xib in Resources */,
|
||||
B1B5578520EF564900210D55 /* GroupTableViewCellWithSwitch.xib in Resources */,
|
||||
B1B557B320EF5AEF00210D55 /* EventDetailsView.xib in Resources */,
|
||||
ECF57A4725090C23004BBF9D /* EnterNewRoomDetailsViewController.storyboard in Resources */,
|
||||
B1963B30228F1C4900CBA17F /* BubbleReactionsView.xib in Resources */,
|
||||
EC60787B2507B0D200EA75C1 /* DirectoryNetworkTableHeaderFooterView.xib in Resources */,
|
||||
B1B557DD20EF5FBB00210D55 /* FilesSearchTableViewCell.xib in Resources */,
|
||||
B1B5590320EF768F00210D55 /* RoomSelectedStickerBubbleCell.xib in Resources */,
|
||||
B1B5573F20EE6C4D00210D55 /* SegmentedViewController.xib in Resources */,
|
||||
|
@ -5550,6 +5665,7 @@
|
|||
3284A35120A07C210044F922 /* postMessageAPI.js in Resources */,
|
||||
EC1CA8D424D8103400DE9EBF /* App-Common.xcconfig in Resources */,
|
||||
B1B557A220EF58AD00210D55 /* ContactTableViewCell.xib in Resources */,
|
||||
ECFBD5CE250A7AAF00DD5F5A /* DirectoryNetworkTableHeaderFooterView.xib in Resources */,
|
||||
B1B558EB20EF768F00210D55 /* RoomIncomingTextMsgWithPaginationTitleBubbleCell.xib in Resources */,
|
||||
B1C543A6239E999700DCA1FA /* KeyVerificationCellInnerContentView.xib in Resources */,
|
||||
32891D76226728EF00C82226 /* KeyVerificationDataLoadingViewController.storyboard in Resources */,
|
||||
|
@ -5829,14 +5945,18 @@
|
|||
B1B558F920EF768F00210D55 /* RoomOutgoingTextMsgWithoutSenderNameBubbleCell.m in Sources */,
|
||||
B1FDF56021F5FE5500BA3834 /* KeyBackupSetupPassphraseViewAction.swift in Sources */,
|
||||
B1B5573120EE6C4D00210D55 /* BugReportViewController.m in Sources */,
|
||||
ECFBD5CB250A7AAF00DD5F5A /* DirectoryRoomTableViewCellVM.swift in Sources */,
|
||||
324A2051225FC571004FE8B0 /* DeviceVerificationIncomingViewState.swift in Sources */,
|
||||
B1B4E9BF24D4703E004D5C33 /* BaseBubbleCell.swift in Sources */,
|
||||
B16932A520F3A21C00746532 /* empty.mm in Sources */,
|
||||
3232AB4A2256558300AD6A5C /* FlowTemplateCoordinator.swift in Sources */,
|
||||
ECF57A4825090C23004BBF9D /* EnterNewRoomDetailsCoordinatorType.swift in Sources */,
|
||||
ECFBD5D7250A7AAF00DD5F5A /* RoomsDirectoryCoordinatorBridgePresenter.swift in Sources */,
|
||||
B19EFA3B21F8BB4100FC070E /* KeyBackupRecoverCoordinator.swift in Sources */,
|
||||
B1B9DEDE22E9D9890065E677 /* EmojiServiceType.swift in Sources */,
|
||||
EC1CA89724C9C9A200DE9EBF /* SetupBiometricsViewModelType.swift in Sources */,
|
||||
3232ABA9225730E100AD6A5C /* DeviceVerificationStartViewModel.swift in Sources */,
|
||||
ECF57A4425090C23004BBF9D /* CreateRoomCoordinatorBridgePresenter.swift in Sources */,
|
||||
B1B4E9BB24D46EB4004D5C33 /* SizingViewHeightStore.swift in Sources */,
|
||||
32DB557C22FDADE50016329E /* ServiceTermsModalScreenViewModelType.swift in Sources */,
|
||||
B16932FA20F3C51A00746532 /* RecentCellData.m in Sources */,
|
||||
|
@ -5847,6 +5967,7 @@
|
|||
B169330820F3CA0E00746532 /* ContactsDataSource.m in Sources */,
|
||||
EC1CA86924C1DEC400DE9EBF /* SetPinCoordinator.swift in Sources */,
|
||||
B1B5574B20EE6C4D00210D55 /* MediaAlbumContentViewController.m in Sources */,
|
||||
ECFBD5CC250A7AAF00DD5F5A /* DirectoryRoomTableViewCell.swift in Sources */,
|
||||
B1B5598820EFC3E000210D55 /* WidgetManager.m in Sources */,
|
||||
B1DB4F0E22316FFF0065DBFA /* UserNameColorGenerator.swift in Sources */,
|
||||
B157FAA123264AE900EBFBD4 /* SettingsDiscoveryThreePidDetailsCoordinatorType.swift in Sources */,
|
||||
|
@ -5870,8 +5991,8 @@
|
|||
32607D72243E0A55006674CC /* KeyBackupRecoverFromPrivateKeyViewAction.swift in Sources */,
|
||||
B1B5574420EE6C4D00210D55 /* CallViewController.m in Sources */,
|
||||
EC1CA86024C1DEC400DE9EBF /* EnterPinCodeViewAction.swift in Sources */,
|
||||
ECFBD5E0250B684E00DD5F5A /* ChooseAvatarTableViewCell.swift in Sources */,
|
||||
32FD757624D2C9BA00BA7B37 /* Bundle.swift in Sources */,
|
||||
ECF57A78250A2E40004BBF9D /* ShowDirectoryViewAction.swift in Sources */,
|
||||
B12D7A0023E2462200FACEDC /* UserVerificationStartCoordinatorType.swift in Sources */,
|
||||
EC711B9324A63B37008F830C /* SecretsRecoveryWithKeyViewController.swift in Sources */,
|
||||
B1B5572220EE6C4D00210D55 /* RoomSettingsViewController.m in Sources */,
|
||||
|
@ -5896,6 +6017,7 @@
|
|||
EC711B9624A63B37008F830C /* SecretsRecoveryWithKeyViewState.swift in Sources */,
|
||||
B120863722EF375F001F89E0 /* ReactionHistoryBridgeCoordinatorPresenter.swift in Sources */,
|
||||
EC711B9224A63B37008F830C /* SecretsRecoveryWithKeyViewModel.swift in Sources */,
|
||||
ECFBD5D0250A7AAF00DD5F5A /* ShowDirectoryViewModel.swift in Sources */,
|
||||
B1B5598620EFC3E000210D55 /* RiotSettings.swift in Sources */,
|
||||
B1CE83D52422817200D07506 /* KeyVerificationVerifyByScanningViewController.swift in Sources */,
|
||||
EC711B8D24A63B37008F830C /* SecretsRecoveryGoal.swift in Sources */,
|
||||
|
@ -5916,7 +6038,6 @@
|
|||
B1BD71BC238E8F9600BA92E2 /* WidgetPermissionViewController.swift in Sources */,
|
||||
B1B558CB20EF768F00210D55 /* RoomIncomingEncryptedTextMsgWithoutSenderInfoBubbleCell.m in Sources */,
|
||||
B11291EA238D35590077B478 /* SlidingModalPresentable.swift in Sources */,
|
||||
ECF57A76250A2E40004BBF9D /* ShowDirectoryCoordinatorType.swift in Sources */,
|
||||
B157FAA823264BED00EBFBD4 /* SettingsDiscoveryThreePidDetailsCoordinatorBridgePresenter.swift in Sources */,
|
||||
B169330B20F3CA3A00746532 /* Contact.m in Sources */,
|
||||
B1A5B33E227ADF2A004CBA85 /* UIImage.swift in Sources */,
|
||||
|
@ -5944,11 +6065,13 @@
|
|||
B1B5574A20EE6C4D00210D55 /* MediaPickerViewController.m in Sources */,
|
||||
B1BEE74623E093260003A4CB /* UserVerificationSessionStatusViewState.swift in Sources */,
|
||||
EC711B9724A63B37008F830C /* SecretsRecoveryCoordinatorType.swift in Sources */,
|
||||
ECFBD5DA250A7ABD00DD5F5A /* MXThirdPartyProtocolInstance.swift in Sources */,
|
||||
ECB101312477CFDB00CF8C11 /* UILabel.swift in Sources */,
|
||||
B1B5598520EFC3E000210D55 /* RageShakeManager.m in Sources */,
|
||||
B1A6C111238BD236002882FD /* SlidingModalContainerView.swift in Sources */,
|
||||
B1DCC62D22E61EAF00625807 /* EmojiPickerViewCell.swift in Sources */,
|
||||
3232ABA8225730E100AD6A5C /* DeviceVerificationStartViewState.swift in Sources */,
|
||||
ECF57A5525091B4D004BBF9D /* RoomCreationParameters.swift in Sources */,
|
||||
B1B558D420EF768F00210D55 /* RoomOutgoingEncryptedTextMsgWithoutSenderInfoBubbleCell.m in Sources */,
|
||||
B169331420F3CAFC00746532 /* PublicRoomTableViewCell.m in Sources */,
|
||||
32BF995721FB07A400698084 /* SettingsKeyBackupTableViewSection.swift in Sources */,
|
||||
|
@ -5963,11 +6086,11 @@
|
|||
32F6B9692270623100BBA352 /* KeyVerificationDataLoadingCoordinator.swift in Sources */,
|
||||
B125FE1D231D5DE400B72806 /* SettingsDiscoveryViewModel.swift in Sources */,
|
||||
32863A5A2384070300D07C4A /* RiotSharedSettings.swift in Sources */,
|
||||
ECF57A74250A2E40004BBF9D /* ShowDirectoryViewState.swift in Sources */,
|
||||
B1B5594720EF7BD000210D55 /* RoomCollectionViewCell.m in Sources */,
|
||||
B10CFBC32268D99D00A5842E /* JitsiService.swift in Sources */,
|
||||
B1A6C10B23882B6C002882FD /* SlidingModalPresentationAnimator.swift in Sources */,
|
||||
B1B558C120EF768F00210D55 /* RoomIncomingEncryptedAttachmentWithPaginationTitleBubbleCell.m in Sources */,
|
||||
ECFBD5D8250A7AAF00DD5F5A /* RoomsDirectoryCoordinatorType.swift in Sources */,
|
||||
B1B5573E20EE6C4D00210D55 /* RiotNavigationController.m in Sources */,
|
||||
B1B5593B20EF7BAC00210D55 /* TableViewCellWithCheckBoxAndLabel.m in Sources */,
|
||||
B1B5581A20EF625800210D55 /* ExpandedRoomTitleView.m in Sources */,
|
||||
|
@ -5997,6 +6120,7 @@
|
|||
B1A6C109238828A6002882FD /* SlidingModalPresentationDelegate.swift in Sources */,
|
||||
ECAE7AEE24EFDD1F002FA813 /* MXSessionState.swift in Sources */,
|
||||
32DB557722FDADE50016329E /* ServiceTermsModalCoordinator.swift in Sources */,
|
||||
ECF57A4B25090C23004BBF9D /* EnterNewRoomDetailsViewModel.swift in Sources */,
|
||||
B185145B24B8C98200EE19EA /* MajorUpdateViewController.swift in Sources */,
|
||||
32DB557922FDADE50016329E /* ServiceTermsModalScreenViewModel.swift in Sources */,
|
||||
B1B4E9BA24D46EB4004D5C33 /* SizableBubbleCell.swift in Sources */,
|
||||
|
@ -6019,14 +6143,13 @@
|
|||
B1B558DD20EF768F00210D55 /* RoomIncomingEncryptedTextMsgBubbleCell.m in Sources */,
|
||||
B1098BE521ECE1FC000DDA48 /* Storyboards.swift in Sources */,
|
||||
3232ABC2225B996200AD6A5C /* Themable.swift in Sources */,
|
||||
ECFBD5D3250A7AAF00DD5F5A /* ShowDirectoryCoordinator.swift in Sources */,
|
||||
32A6001B22C661100042C1D9 /* EditHistoryViewAction.swift in Sources */,
|
||||
3232ABA7225730E100AD6A5C /* DeviceVerificationStartCoordinator.swift in Sources */,
|
||||
B1D4752721EE4E630067973F /* KeyboardAvoider.swift in Sources */,
|
||||
B1D4752821EE4E630067973F /* KeyboardNotification.swift in Sources */,
|
||||
B1D1BDA622BBAFB500831367 /* ReactionsMenuView.swift in Sources */,
|
||||
EC711B4624A63B13008F830C /* MXRecoveryService.swift in Sources */,
|
||||
ECF57A80250A3190004BBF9D /* RoomsDirectoryCoordinator.swift in Sources */,
|
||||
ECF57A83250A3FB2004BBF9D /* DirectoryRoomTableViewCellVM.swift in Sources */,
|
||||
EC1CA86C24C1DEC400DE9EBF /* SetPinCoordinatorType.swift in Sources */,
|
||||
EC1CA86324C1DEC400DE9EBF /* EnterPinCodeCoordinatorType.swift in Sources */,
|
||||
B18DEDD6243377C10075FEF7 /* KeyVerificationSelfVerifyWaitCoordinator.swift in Sources */,
|
||||
|
@ -6034,7 +6157,7 @@
|
|||
B1B9DEF422EB426D0065E677 /* ReactionHistoryViewCell.swift in Sources */,
|
||||
B1B5573C20EE6C4D00210D55 /* MasterTabBarController.m in Sources */,
|
||||
B1DCC61B22E5E17100625807 /* EmojiPickerCoordinator.swift in Sources */,
|
||||
ECF57A75250A2E40004BBF9D /* ShowDirectoryCoordinator.swift in Sources */,
|
||||
ECF57A4525090C23004BBF9D /* CreateRoomCoordinatorType.swift in Sources */,
|
||||
EC85D7292477DCF2002C44C9 /* KeyVerificationManuallyVerifyViewModelType.swift in Sources */,
|
||||
32F6B96E2270623100BBA352 /* KeyVerificationDataLoadingViewModelType.swift in Sources */,
|
||||
B185145524B7CFA700EE19EA /* AppVersion.swift in Sources */,
|
||||
|
@ -6049,14 +6172,15 @@
|
|||
B1B5582C20EF666100210D55 /* DirectoryRecentTableViewCell.m in Sources */,
|
||||
B1B558E420EF768F00210D55 /* RoomMembershipWithPaginationTitleBubbleCell.m in Sources */,
|
||||
B18DEDD8243377C10075FEF7 /* KeyVerificationSelfVerifyWaitCoordinatorType.swift in Sources */,
|
||||
ECF57A73250A2E40004BBF9D /* ShowDirectoryViewController.swift in Sources */,
|
||||
B1B5573620EE6C4D00210D55 /* GroupsViewController.m in Sources */,
|
||||
B125FE21231D5E1D00B72806 /* SettingsDiscoveryViewAction.swift in Sources */,
|
||||
B108932323AB908A00802670 /* KeyVerificationRequestStatusViewData.swift in Sources */,
|
||||
B142317A22CCFA2000FFA96A /* EditHistoryCell.swift in Sources */,
|
||||
ECF57A50250913E4004BBF9D /* MXKTableViewCellWithLabelAndSwitch.swift in Sources */,
|
||||
B1DCC62622E60CC600625807 /* EmojiItem.swift in Sources */,
|
||||
B1B5572A20EE6C4D00210D55 /* RoomMemberDetailsViewController.m in Sources */,
|
||||
EC3B066C24AC6ADE000DF9BF /* CrossSigningSetupBannerCell.swift in Sources */,
|
||||
ECF57A4E25090C23004BBF9D /* EnterNewRoomDetailsViewModelType.swift in Sources */,
|
||||
B1B5590120EF768F00210D55 /* RoomMembershipExpandedWithPaginationTitleBubbleCell.m in Sources */,
|
||||
32F6B96B2270623100BBA352 /* KeyVerificationDataLoadingViewAction.swift in Sources */,
|
||||
B1B558C920EF768F00210D55 /* RoomIncomingEncryptedAttachmentWithoutSenderInfoBubbleCell.m in Sources */,
|
||||
|
@ -6075,7 +6199,6 @@
|
|||
B1BEE73623DF44A60003A4CB /* UserVerificationSessionsStatusCoordinatorType.swift in Sources */,
|
||||
B1C45A86232A8C2600165425 /* SettingsIdentityServerViewModelType.swift in Sources */,
|
||||
F083BE031E7009ED00A9B29C /* EventFormatter.m in Sources */,
|
||||
ECF57A7F250A3190004BBF9D /* RoomsDirectoryCoordinatorType.swift in Sources */,
|
||||
B157FAA623264AE900EBFBD4 /* SettingsDiscoveryThreePidDetailsViewController.swift in Sources */,
|
||||
B1DCC62422E60CA900625807 /* EmojiPickerCategoryViewData.swift in Sources */,
|
||||
B1550FCB2420E8F500CE097B /* QRCodeReaderViewController.swift in Sources */,
|
||||
|
@ -6092,6 +6215,7 @@
|
|||
EC711B7824A63B37008F830C /* SecretsSetupRecoveryKeyViewModel.swift in Sources */,
|
||||
B1C562E3228C7C8D0037F12A /* RoomContextualMenuPresenter.swift in Sources */,
|
||||
EC85D7182477DCD7002C44C9 /* KeyVerificationScanConfirmationViewModelType.swift in Sources */,
|
||||
ECF57A5E2509265A004BBF9D /* InsettedTextField.swift in Sources */,
|
||||
B1B5593C20EF7BAC00210D55 /* TableViewCellWithCheckBoxes.m in Sources */,
|
||||
32891D6B2264CBA300C82226 /* SimpleScreenTemplateViewController.swift in Sources */,
|
||||
EC711B7924A63B37008F830C /* SecretsSetupRecoveryKeyViewController.swift in Sources */,
|
||||
|
@ -6104,6 +6228,7 @@
|
|||
EC85D7262477DCF2002C44C9 /* KeyVerificationManuallyVerifyCoordinator.swift in Sources */,
|
||||
B1BEE71423DF2ACF0003A4CB /* UserVerificationCoordinatorType.swift in Sources */,
|
||||
B1B5596F20EFA85D00210D55 /* EncryptionInfoView.m in Sources */,
|
||||
ECFBD5D1250A7AAF00DD5F5A /* ShowDirectoryViewController.swift in Sources */,
|
||||
B1B5573820EE6C4D00210D55 /* GroupParticipantsViewController.m in Sources */,
|
||||
3232ABAB225730E100AD6A5C /* KeyVerificationCoordinator.swift in Sources */,
|
||||
B1BEE73B23DF44A60003A4CB /* UserVerificationSessionsStatusCoordinator.swift in Sources */,
|
||||
|
@ -6112,6 +6237,7 @@
|
|||
B1DCC61E22E5E17100625807 /* EmojiPickerViewModel.swift in Sources */,
|
||||
B1B5574F20EE6C4D00210D55 /* RoomsViewController.m in Sources */,
|
||||
EC85D73A2477DDB8002C44C9 /* DirectorySectionHeaderContainerView.m in Sources */,
|
||||
ECFBD5E3250B6CAB00DD5F5A /* ChooseAvatarTableViewCellVM.swift in Sources */,
|
||||
EC711B8524A63B37008F830C /* SecretsRecoveryWithPassphraseCoordinator.swift in Sources */,
|
||||
32863A5C2384074C00D07C4A /* RiotSettingAllowedWidgets.swift in Sources */,
|
||||
EC711B8724A63B37008F830C /* SecretsRecoveryWithPassphraseViewModelType.swift in Sources */,
|
||||
|
@ -6123,7 +6249,6 @@
|
|||
B139C22121FE5D9D00BB68EC /* KeyBackupRecoverFromPassphraseViewState.swift in Sources */,
|
||||
EC711B8124A63B37008F830C /* SecretsSetupRecoveryPassphraseViewAction.swift in Sources */,
|
||||
B1B5579120EF568D00210D55 /* GroupInviteTableViewCell.m in Sources */,
|
||||
ECF57A77250A2E40004BBF9D /* ShowDirectoryViewModelType.swift in Sources */,
|
||||
B1B5579A20EF575B00210D55 /* ForgotPasswordInputsView.m in Sources */,
|
||||
B1B12B2922942315002CB419 /* UITouch.swift in Sources */,
|
||||
B1B558CC20EF768F00210D55 /* RoomOutgoingEncryptedAttachmentWithoutSenderInfoBubbleCell.m in Sources */,
|
||||
|
@ -6139,13 +6264,16 @@
|
|||
B1C45A8A232A8C2600165425 /* SettingsIdentityServerCoordinatorBridgePresenter.swift in Sources */,
|
||||
B1B557DE20EF5FBB00210D55 /* FilesSearchTableViewCell.m in Sources */,
|
||||
B1B5574020EE6C4D00210D55 /* SegmentedViewController.m in Sources */,
|
||||
ECF57A4C25090C23004BBF9D /* EnterNewRoomDetailsViewAction.swift in Sources */,
|
||||
EC711BAE24A63B58008F830C /* SecureBackupSetupCoordinator.swift in Sources */,
|
||||
B1B5599320EFC5E400210D55 /* DecryptionFailure.m in Sources */,
|
||||
ECFBD5D5250A7AAF00DD5F5A /* ShowDirectoryViewModelType.swift in Sources */,
|
||||
B1CE83E12422817200D07506 /* KeyVerificationVerifyBySASCoordinator.swift in Sources */,
|
||||
EC619C1924DAD96000663A80 /* UIScrollView.swift in Sources */,
|
||||
B125FE1F231D5DF700B72806 /* SettingsDiscoveryViewModelType.swift in Sources */,
|
||||
EC85D7162477DCD7002C44C9 /* KeyVerificationScanConfirmationViewAction.swift in Sources */,
|
||||
EC711BAF24A63B58008F830C /* SecureBackupSetupCoordinatorType.swift in Sources */,
|
||||
ECFBD5D4250A7AAF00DD5F5A /* ShowDirectoryCoordinatorType.swift in Sources */,
|
||||
EC1CA89C24C9C9A200DE9EBF /* SetupBiometricsViewModel.swift in Sources */,
|
||||
B157FAA323264AE900EBFBD4 /* SettingsDiscoveryThreePidDetailsViewState.swift in Sources */,
|
||||
B1098BF921ECFE65000DDA48 /* KeyBackupSetupCoordinator.swift in Sources */,
|
||||
|
@ -6156,7 +6284,6 @@
|
|||
F083BDED1E7009ED00A9B29C /* MXKRoomBubbleTableViewCell+Riot.m in Sources */,
|
||||
B1B9DEEF22EB34EF0065E677 /* ReactionHistoryViewState.swift in Sources */,
|
||||
B1DCC62022E5EDA400625807 /* EmojiPickerCoordinatorBridgePresenter.swift in Sources */,
|
||||
ECF57A72250A2E40004BBF9D /* ShowDirectoryViewModel.swift in Sources */,
|
||||
B1B557A820EF5A1B00210D55 /* DeviceTableViewCell.m in Sources */,
|
||||
B1B5572620EE6C4D00210D55 /* RoomFilesSearchViewController.m in Sources */,
|
||||
B1B5583120EF66BA00210D55 /* RoomIdOrAliasTableViewCell.m in Sources */,
|
||||
|
@ -6215,6 +6342,7 @@
|
|||
B12D7A0223E2462200FACEDC /* UserVerificationStartViewAction.swift in Sources */,
|
||||
EC85D7372477DD97002C44C9 /* LocalContactsSectionHeaderContainerView.m in Sources */,
|
||||
B1DCC61A22E5E17100625807 /* EmojiPickerViewController.swift in Sources */,
|
||||
ECFBD5C9250A7AAF00DD5F5A /* RoomsDirectoryCoordinator.swift in Sources */,
|
||||
B1963B32228F1C6B00CBA17F /* BubbleReactionsViewModelType.swift in Sources */,
|
||||
EC1CA89A24C9C9A200DE9EBF /* SetupBiometricsCoordinatorType.swift in Sources */,
|
||||
32A6001722C661100042C1D9 /* EditHistoryViewController.swift in Sources */,
|
||||
|
@ -6252,15 +6380,16 @@
|
|||
B1B558CF20EF768F00210D55 /* RoomIncomingEncryptedTextMsgWithPaginationTitleBubbleCell.m in Sources */,
|
||||
B140B4A221F87F7100E3F5FE /* OperationQueue.swift in Sources */,
|
||||
B183226C23F59F810035B2E8 /* CloseButton.swift in Sources */,
|
||||
EC6078762507B07E00EA75C1 /* DirectoryRoomTableViewCell.swift in Sources */,
|
||||
ECF57A5A250925AC004BBF9D /* TextFieldTableViewCell.swift in Sources */,
|
||||
EC711B7F24A63B37008F830C /* SecretsSetupRecoveryPassphraseViewController.swift in Sources */,
|
||||
B1B5575120EE6C4D00210D55 /* AuthenticationViewController.m in Sources */,
|
||||
B1CE83BA2422815C00D07506 /* KeyVerificationService.swift in Sources */,
|
||||
B1B5571820EE6C4D00210D55 /* CountryPickerViewController.m in Sources */,
|
||||
B1D211E622C194A200D939BD /* ReactionsMenuViewState.swift in Sources */,
|
||||
ECF57A4925090C23004BBF9D /* EnterNewRoomDetailsViewState.swift in Sources */,
|
||||
B17982FF2119FED2001FD722 /* GDPRConsentViewController.swift in Sources */,
|
||||
B1098BE121ECE09F000DDA48 /* Images.swift in Sources */,
|
||||
ECF57A81250A3190004BBF9D /* RoomsDirectoryCoordinatorBridgePresenter.swift in Sources */,
|
||||
ECF57A85250A64F0004BBF9D /* PlaceholderedTextView.swift in Sources */,
|
||||
B1B4E9C424D47207004D5C33 /* BubbleReactionsViewModelBuilder.swift in Sources */,
|
||||
EC85D72A2477DCF2002C44C9 /* KeyVerificationManuallyVerifyViewModel.swift in Sources */,
|
||||
B1BEE74A23E093260003A4CB /* UserVerificationSessionStatusCoordinatorType.swift in Sources */,
|
||||
|
@ -6298,11 +6427,13 @@
|
|||
324A2054225FC571004FE8B0 /* DeviceVerificationIncomingCoordinatorType.swift in Sources */,
|
||||
B139C21F21FE5D6600BB68EC /* KeyBackupRecoverFromPassphraseViewAction.swift in Sources */,
|
||||
B1DCC61822E5E17100625807 /* EmojiPickerViewState.swift in Sources */,
|
||||
ECF57A4D25090C23004BBF9D /* EnterNewRoomDetailsCoordinator.swift in Sources */,
|
||||
B1B336BF242B933700F95EC4 /* KeyVerificationSelfVerifyStartViewController.swift in Sources */,
|
||||
B1CE83E32422817200D07506 /* VerifyEmojiCollectionViewCell.swift in Sources */,
|
||||
B1C562DB228C0BB00037F12A /* RoomContextualMenuAction.swift in Sources */,
|
||||
B1B5574720EE6C4D00210D55 /* UsersDevicesViewController.m in Sources */,
|
||||
B1098BFF21ECFE65000DDA48 /* PasswordStrengthView.swift in Sources */,
|
||||
ECFBD5D2250A7AAF00DD5F5A /* ShowDirectoryViewState.swift in Sources */,
|
||||
B1B558D220EF768F00210D55 /* RoomEncryptedDataBubbleCell.m in Sources */,
|
||||
B10A3E8F24FE4368007C380F /* Timeline_1.swift in Sources */,
|
||||
EC711BB024A63B58008F830C /* SecureBackupBannerCell.swift in Sources */,
|
||||
|
@ -6314,6 +6445,7 @@
|
|||
B1C562D9228C0B760037F12A /* RoomContextualMenuItem.swift in Sources */,
|
||||
B1C543B223A2913F00DCA1FA /* KeyVerificationConclusionBubbleCell.swift in Sources */,
|
||||
323AB947232BD74600C1451F /* AuthFallBackViewController.m in Sources */,
|
||||
ECF57A87250A6872004BBF9D /* TextViewTableViewCell.swift in Sources */,
|
||||
B1C562E1228C7C8C0037F12A /* RoomContextualMenuToolbarView.swift in Sources */,
|
||||
B1CE83DF2422817200D07506 /* KeyVerificationVerifyBySASCoordinatorType.swift in Sources */,
|
||||
B1B557BF20EF5B4500210D55 /* DisabledRoomInputToolbarView.m in Sources */,
|
||||
|
@ -6371,6 +6503,7 @@
|
|||
32DB557522FDADE50016329E /* ServiceTermsModalCoordinatorType.swift in Sources */,
|
||||
F083BDF91E7009ED00A9B29C /* RoomEmailInvitation.m in Sources */,
|
||||
EC85D7272477DCF2002C44C9 /* KeyVerificationManuallyVerifyViewController.swift in Sources */,
|
||||
ECFBD5CF250A7AAF00DD5F5A /* DirectoryNetworkTableHeaderFooterView.swift in Sources */,
|
||||
B1D211E422C18E3800D939BD /* ReactionsMenuViewModelType.swift in Sources */,
|
||||
324A2055225FC571004FE8B0 /* DeviceVerificationIncomingViewModelType.swift in Sources */,
|
||||
B1B5572C20EE6C4D00210D55 /* RoomParticipantsViewController.m in Sources */,
|
||||
|
@ -6382,6 +6515,8 @@
|
|||
B1B5574920EE6C4D00210D55 /* RiotSplitViewController.m in Sources */,
|
||||
B1B5574E20EE6C4D00210D55 /* DirectoryServerPickerViewController.m in Sources */,
|
||||
EC711B8824A63B37008F830C /* SecretsRecoveryWithPassphraseViewAction.swift in Sources */,
|
||||
ECF57A6225093B04004BBF9D /* SectionHeaderView.m in Sources */,
|
||||
ECF57A4A25090C23004BBF9D /* EnterNewRoomDetailsViewController.swift in Sources */,
|
||||
B1D211E822C195B400D939BD /* ReactionMenuItemViewData.swift in Sources */,
|
||||
B1DB4F0B223131600065DBFA /* String.swift in Sources */,
|
||||
B1CE83D82422817200D07506 /* KeyVerificationVerifyByScanningCoordinatorType.swift in Sources */,
|
||||
|
@ -6389,7 +6524,6 @@
|
|||
3232AB522256558300AD6A5C /* TemplateScreenViewModel.swift in Sources */,
|
||||
B1B5575B20EE6C4D00210D55 /* HomeFilesSearchViewController.m in Sources */,
|
||||
B139C22521FF01C100BB68EC /* KeyBackupRecoverFromPassphraseCoordinator.swift in Sources */,
|
||||
ECF57A64250A17FC004BBF9D /* MXThirdPartyProtocolInstance.swift in Sources */,
|
||||
B1BEE71623DF2ACF0003A4CB /* UserVerificationCoordinatorBridgePresenter.swift in Sources */,
|
||||
B1098BFD21ECFE65000DDA48 /* PasswordStrengthManager.swift in Sources */,
|
||||
B1B558F520EF768F00210D55 /* RoomOutgoingTextMsgWithPaginationTitleBubbleCell.m in Sources */,
|
||||
|
@ -6413,11 +6547,13 @@
|
|||
ECB101362477D00700CF8C11 /* UniversalLink.m in Sources */,
|
||||
32BF995521FA2AB700698084 /* SettingsKeyBackupViewAction.swift in Sources */,
|
||||
B109D6F1222D8C400061B6D9 /* UIApplication.swift in Sources */,
|
||||
ECFBD5D6250A7AAF00DD5F5A /* ShowDirectoryViewAction.swift in Sources */,
|
||||
EC711BB124A63B58008F830C /* SecureBackupBannerPreferences.swift in Sources */,
|
||||
ECF57A4625090C23004BBF9D /* CreateRoomCoordinator.swift in Sources */,
|
||||
ECFBD5DC250A82B200DD5F5A /* TableViewHeaderFooterView.swift in Sources */,
|
||||
B1BEE73723DF44A60003A4CB /* UserVerificationSessionsStatusViewState.swift in Sources */,
|
||||
B108932823ABEE6800802670 /* BubbleCellReadReceiptsDisplayable.swift in Sources */,
|
||||
B1B558FF20EF768F00210D55 /* RoomIncomingTextMsgBubbleCell.m in Sources */,
|
||||
EC85D7342477DD54002C44C9 /* SectionHeaderView.m in Sources */,
|
||||
B1098C0021ECFE65000DDA48 /* KeyBackupSetupPassphraseViewController.swift in Sources */,
|
||||
ECAE7AE724EC15F7002FA813 /* Section.swift in Sources */,
|
||||
B1B5591020EF782800210D55 /* TableViewCellWithPhoneNumberTextField.m in Sources */,
|
||||
|
@ -6434,11 +6570,11 @@
|
|||
B157FAA523264AE900EBFBD4 /* SettingsDiscoveryThreePidDetailsViewModel.swift in Sources */,
|
||||
EC711B8624A63B37008F830C /* SecretsRecoveryWithPassphraseCoordinatorType.swift in Sources */,
|
||||
B1C562E8228C7CF20037F12A /* ContextualMenuItemView.swift in Sources */,
|
||||
EC60787D2507D30200EA75C1 /* DirectoryNetworkTableHeaderFooterView.swift in Sources */,
|
||||
B14F143022144F6500FA0595 /* KeyBackupRecoverFromRecoveryKeyCoordinatorType.swift in Sources */,
|
||||
B1E5368921FB1E20001F3AFF /* UIButton.swift in Sources */,
|
||||
B1DCC63422E72C1B00625807 /* UISearchBar.swift in Sources */,
|
||||
32A6001622C661100042C1D9 /* EditHistoryViewState.swift in Sources */,
|
||||
ECF57A5725091ECC004BBF9D /* MXKTableViewCellWithTextView.swift in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
|
|
23
Riot/Assets/Images.xcassets/Common/checkmark.imageset/Contents.json
vendored
Normal file
23
Riot/Assets/Images.xcassets/Common/checkmark.imageset/Contents.json
vendored
Normal file
|
@ -0,0 +1,23 @@
|
|||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "Vector 26.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"filename" : "Vector 26@2x.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"filename" : "Vector 26@3x.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "3x"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
BIN
Riot/Assets/Images.xcassets/Common/checkmark.imageset/Vector 26.png
vendored
Normal file
BIN
Riot/Assets/Images.xcassets/Common/checkmark.imageset/Vector 26.png
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 377 B |
BIN
Riot/Assets/Images.xcassets/Common/checkmark.imageset/Vector 26@2x.png
vendored
Normal file
BIN
Riot/Assets/Images.xcassets/Common/checkmark.imageset/Vector 26@2x.png
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 573 B |
BIN
Riot/Assets/Images.xcassets/Common/checkmark.imageset/Vector 26@3x.png
vendored
Normal file
BIN
Riot/Assets/Images.xcassets/Common/checkmark.imageset/Vector 26@3x.png
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 862 B |
6
Riot/Assets/Images.xcassets/CreateRoom/Contents.json
Normal file
6
Riot/Assets/Images.xcassets/CreateRoom/Contents.json
Normal file
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
23
Riot/Assets/Images.xcassets/CreateRoom/capture_avatar.imageset/Contents.json
vendored
Normal file
23
Riot/Assets/Images.xcassets/CreateRoom/capture_avatar.imageset/Contents.json
vendored
Normal file
|
@ -0,0 +1,23 @@
|
|||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "Group 3153.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"filename" : "Group 3153@2x.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"filename" : "Group 3153@3x.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "3x"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
BIN
Riot/Assets/Images.xcassets/CreateRoom/capture_avatar.imageset/Group 3153.png
vendored
Normal file
BIN
Riot/Assets/Images.xcassets/CreateRoom/capture_avatar.imageset/Group 3153.png
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.5 KiB |
BIN
Riot/Assets/Images.xcassets/CreateRoom/capture_avatar.imageset/Group 3153@2x.png
vendored
Normal file
BIN
Riot/Assets/Images.xcassets/CreateRoom/capture_avatar.imageset/Group 3153@2x.png
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.7 KiB |
BIN
Riot/Assets/Images.xcassets/CreateRoom/capture_avatar.imageset/Group 3153@3x.png
vendored
Normal file
BIN
Riot/Assets/Images.xcassets/CreateRoom/capture_avatar.imageset/Group 3153@3x.png
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 4 KiB |
|
@ -1461,3 +1461,21 @@
|
|||
"searchable_directory_create_new_room" = "Create a new room";
|
||||
"searchable_directory_x_network" = "%@ Network";
|
||||
"searchable_directory_search_placeholder" = "Name or ID";
|
||||
|
||||
// MARK: - Create Room
|
||||
|
||||
"create_room_title" = "New Room";
|
||||
"create_room_section_header_name" = "Room name";
|
||||
"create_room_placeholder_name" = "Name";
|
||||
"create_room_section_header_topic" = "Room topic (optional)";
|
||||
"create_room_placeholder_topic" = "Topic";
|
||||
"create_room_section_header_encryption" = "Room encryption";
|
||||
"create_room_enable_encryption" = "Enable Encryption";
|
||||
"create_room_section_footer_encryption" = "Encryption can’t be disabled afterwards.";
|
||||
"create_room_section_header_type" = "Room type";
|
||||
"create_room_type_private" = "Private Room";
|
||||
"create_room_type_public" = "Public Room";
|
||||
"create_room_section_footer_type" = "People join a private room only with the room invitation.";
|
||||
"create_room_show_in_directory" = "Show the room in the directory";
|
||||
"create_room_section_header_address" = "Room address";
|
||||
"create_room_placeholder_address" = "#testroom:matrix.org";
|
||||
|
|
30
Riot/Categories/MXKTableViewCellWithLabelAndSwitch.swift
Normal file
30
Riot/Categories/MXKTableViewCellWithLabelAndSwitch.swift
Normal file
|
@ -0,0 +1,30 @@
|
|||
//
|
||||
// Copyright 2020 New Vector Ltd
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import Reusable
|
||||
|
||||
extension MXKTableViewCellWithLabelAndSwitch: Reusable {}
|
||||
|
||||
extension MXKTableViewCellWithLabelAndSwitch: Themable {
|
||||
|
||||
func update(theme: Theme) {
|
||||
mxkLabel.textColor = theme.textPrimaryColor
|
||||
backgroundColor = theme.backgroundColor
|
||||
contentView.backgroundColor = .clear
|
||||
}
|
||||
|
||||
}
|
32
Riot/Categories/MXKTableViewCellWithTextView.swift
Normal file
32
Riot/Categories/MXKTableViewCellWithTextView.swift
Normal file
|
@ -0,0 +1,32 @@
|
|||
//
|
||||
// Copyright 2020 New Vector Ltd
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import Reusable
|
||||
|
||||
extension MXKTableViewCellWithTextView: Reusable {}
|
||||
|
||||
extension MXKTableViewCellWithTextView: Themable {
|
||||
|
||||
func update(theme: Theme) {
|
||||
mxkTextView.backgroundColor = .clear
|
||||
mxkTextView.textColor = theme.textPrimaryColor
|
||||
mxkTextView.tintColor = theme.tintColor
|
||||
backgroundColor = theme.backgroundColor
|
||||
contentView.backgroundColor = .clear
|
||||
}
|
||||
|
||||
}
|
|
@ -33,6 +33,7 @@ internal enum Asset {
|
|||
internal static let appSymbol = ImageAsset(name: "app_symbol")
|
||||
internal static let backIcon = ImageAsset(name: "back_icon")
|
||||
internal static let camera = ImageAsset(name: "camera")
|
||||
internal static let checkmark = ImageAsset(name: "checkmark")
|
||||
internal static let chevron = ImageAsset(name: "chevron")
|
||||
internal static let closeButton = ImageAsset(name: "close_button")
|
||||
internal static let disclosureIcon = ImageAsset(name: "disclosure_icon")
|
||||
|
@ -51,6 +52,7 @@ internal enum Asset {
|
|||
internal static let touchidIcon = ImageAsset(name: "touchid_icon")
|
||||
internal static let addGroupParticipant = ImageAsset(name: "add_group_participant")
|
||||
internal static let removeIconBlue = ImageAsset(name: "remove_icon_blue")
|
||||
internal static let captureAvatar = ImageAsset(name: "capture_avatar")
|
||||
internal static let e2eBlocked = ImageAsset(name: "e2e_blocked")
|
||||
internal static let e2eUnencrypted = ImageAsset(name: "e2e_unencrypted")
|
||||
internal static let e2eWarning = ImageAsset(name: "e2e_warning")
|
||||
|
|
|
@ -32,6 +32,11 @@ internal enum StoryboardScene {
|
|||
|
||||
internal static let initialScene = InitialSceneType<Riot.EmojiPickerViewController>(storyboard: EmojiPickerViewController.self)
|
||||
}
|
||||
internal enum EnterNewRoomDetailsViewController: StoryboardType {
|
||||
internal static let storyboardName = "EnterNewRoomDetailsViewController"
|
||||
|
||||
internal static let initialScene = InitialSceneType<Riot.EnterNewRoomDetailsViewController>(storyboard: EnterNewRoomDetailsViewController.self)
|
||||
}
|
||||
internal enum EnterPinCodeViewController: StoryboardType {
|
||||
internal static let storyboardName = "EnterPinCodeViewController"
|
||||
|
||||
|
|
|
@ -538,6 +538,66 @@ internal enum VectorL10n {
|
|||
internal static var create: String {
|
||||
return VectorL10n.tr("Vector", "create")
|
||||
}
|
||||
/// Enable Encryption
|
||||
internal static var createRoomEnableEncryption: String {
|
||||
return VectorL10n.tr("Vector", "create_room_enable_encryption")
|
||||
}
|
||||
/// #testroom:matrix.org
|
||||
internal static var createRoomPlaceholderAddress: String {
|
||||
return VectorL10n.tr("Vector", "create_room_placeholder_address")
|
||||
}
|
||||
/// Name
|
||||
internal static var createRoomPlaceholderName: String {
|
||||
return VectorL10n.tr("Vector", "create_room_placeholder_name")
|
||||
}
|
||||
/// Topic
|
||||
internal static var createRoomPlaceholderTopic: String {
|
||||
return VectorL10n.tr("Vector", "create_room_placeholder_topic")
|
||||
}
|
||||
/// Encryption can’t be disabled afterwards.
|
||||
internal static var createRoomSectionFooterEncryption: String {
|
||||
return VectorL10n.tr("Vector", "create_room_section_footer_encryption")
|
||||
}
|
||||
/// People join a private room only with the room invitation.
|
||||
internal static var createRoomSectionFooterType: String {
|
||||
return VectorL10n.tr("Vector", "create_room_section_footer_type")
|
||||
}
|
||||
/// Room address
|
||||
internal static var createRoomSectionHeaderAddress: String {
|
||||
return VectorL10n.tr("Vector", "create_room_section_header_address")
|
||||
}
|
||||
/// Room encryption
|
||||
internal static var createRoomSectionHeaderEncryption: String {
|
||||
return VectorL10n.tr("Vector", "create_room_section_header_encryption")
|
||||
}
|
||||
/// Room name
|
||||
internal static var createRoomSectionHeaderName: String {
|
||||
return VectorL10n.tr("Vector", "create_room_section_header_name")
|
||||
}
|
||||
/// Room topic (optional)
|
||||
internal static var createRoomSectionHeaderTopic: String {
|
||||
return VectorL10n.tr("Vector", "create_room_section_header_topic")
|
||||
}
|
||||
/// Room type
|
||||
internal static var createRoomSectionHeaderType: String {
|
||||
return VectorL10n.tr("Vector", "create_room_section_header_type")
|
||||
}
|
||||
/// Show the room in the directory
|
||||
internal static var createRoomShowInDirectory: String {
|
||||
return VectorL10n.tr("Vector", "create_room_show_in_directory")
|
||||
}
|
||||
/// New Room
|
||||
internal static var createRoomTitle: String {
|
||||
return VectorL10n.tr("Vector", "create_room_title")
|
||||
}
|
||||
/// Private Room
|
||||
internal static var createRoomTypePrivate: String {
|
||||
return VectorL10n.tr("Vector", "create_room_type_private")
|
||||
}
|
||||
/// Public Room
|
||||
internal static var createRoomTypePublic: String {
|
||||
return VectorL10n.tr("Vector", "create_room_type_public")
|
||||
}
|
||||
/// Verify your other devices easier
|
||||
internal static var crossSigningSetupBannerSubtitle: String {
|
||||
return VectorL10n.tr("Vector", "cross_signing_setup_banner_subtitle")
|
||||
|
|
36
Riot/Modules/Common/Cells/TextFieldTableViewCell.swift
Normal file
36
Riot/Modules/Common/Cells/TextFieldTableViewCell.swift
Normal file
|
@ -0,0 +1,36 @@
|
|||
//
|
||||
// Copyright 2020 New Vector Ltd
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
import Reusable
|
||||
|
||||
/// Table view cell with only a text field spanning the whole content view, insets can be configured via `textField.insets`
|
||||
class TextFieldTableViewCell: UITableViewCell {
|
||||
|
||||
@IBOutlet weak var textField: InsettedTextField!
|
||||
|
||||
}
|
||||
|
||||
extension TextFieldTableViewCell: NibReusable {}
|
||||
|
||||
extension TextFieldTableViewCell: Themable {
|
||||
|
||||
func update(theme: Theme) {
|
||||
theme.applyStyle(onTextField: textField)
|
||||
textField.placeholderColor = theme.placeholderTextColor
|
||||
}
|
||||
|
||||
}
|
40
Riot/Modules/Common/Cells/TextFieldTableViewCell.xib
Normal file
40
Riot/Modules/Common/Cells/TextFieldTableViewCell.xib
Normal file
|
@ -0,0 +1,40 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="16096" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
|
||||
<device id="retina6_1" orientation="portrait" appearance="light"/>
|
||||
<dependencies>
|
||||
<deployment identifier="iOS"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="16087"/>
|
||||
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
|
||||
<tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="KGk-i7-Jjw" customClass="TextFieldTableViewCell" customModule="Riot" customModuleProvider="target">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="44"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="KGk-i7-Jjw" id="H2p-sc-9uM">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="44"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="od5-Pi-LuT" customClass="InsettedTextField" customModule="Riot" customModuleProvider="target">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="44"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
||||
<textInputTraits key="textInputTraits"/>
|
||||
</textField>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstAttribute="trailing" secondItem="od5-Pi-LuT" secondAttribute="trailing" id="HSK-ja-3E7"/>
|
||||
<constraint firstItem="od5-Pi-LuT" firstAttribute="leading" secondItem="H2p-sc-9uM" secondAttribute="leading" id="Tis-ml-ALE"/>
|
||||
<constraint firstAttribute="bottom" secondItem="od5-Pi-LuT" secondAttribute="bottom" id="erV-JT-mdE"/>
|
||||
<constraint firstItem="od5-Pi-LuT" firstAttribute="top" secondItem="H2p-sc-9uM" secondAttribute="top" id="u69-gH-3zQ"/>
|
||||
</constraints>
|
||||
</tableViewCellContentView>
|
||||
<viewLayoutGuide key="safeArea" id="njF-e1-oar"/>
|
||||
<connections>
|
||||
<outlet property="textField" destination="od5-Pi-LuT" id="KjA-k0-zsF"/>
|
||||
</connections>
|
||||
<point key="canvasLocation" x="139" y="153"/>
|
||||
</tableViewCell>
|
||||
</objects>
|
||||
</document>
|
37
Riot/Modules/Common/Cells/TextViewTableViewCell.swift
Normal file
37
Riot/Modules/Common/Cells/TextViewTableViewCell.swift
Normal file
|
@ -0,0 +1,37 @@
|
|||
//
|
||||
// Copyright 2020 New Vector Ltd
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
import Reusable
|
||||
|
||||
/// Table view cell with only a text view spanning the whole content view, insets can be configured via `textView.textContainerInset`
|
||||
class TextViewTableViewCell: UITableViewCell {
|
||||
|
||||
@IBOutlet weak var textView: PlaceholderedTextView!
|
||||
|
||||
}
|
||||
|
||||
extension TextViewTableViewCell: NibReusable {}
|
||||
|
||||
extension TextViewTableViewCell: Themable {
|
||||
|
||||
func update(theme: Theme) {
|
||||
textView.textColor = theme.textPrimaryColor
|
||||
textView.tintColor = theme.tintColor
|
||||
textView.placeholderColor = theme.placeholderTextColor
|
||||
}
|
||||
|
||||
}
|
43
Riot/Modules/Common/Cells/TextViewTableViewCell.xib
Normal file
43
Riot/Modules/Common/Cells/TextViewTableViewCell.xib
Normal file
|
@ -0,0 +1,43 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="16096" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
|
||||
<device id="retina6_1" orientation="portrait" appearance="light"/>
|
||||
<dependencies>
|
||||
<deployment identifier="iOS"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="16087"/>
|
||||
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
|
||||
<tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="KGk-i7-Jjw" customClass="TextViewTableViewCell" customModule="Riot" customModuleProvider="target">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="44"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="KGk-i7-Jjw" id="H2p-sc-9uM">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="44"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" textAlignment="natural" translatesAutoresizingMaskIntoConstraints="NO" id="gdU-HN-ceD" customClass="PlaceholderedTextView" customModule="Riot" customModuleProvider="target">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="44"/>
|
||||
<color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
|
||||
<string key="text">Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda.</string>
|
||||
<color key="textColor" systemColor="labelColor" cocoaTouchSystemColor="darkTextColor"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
||||
<textInputTraits key="textInputTraits" autocapitalizationType="sentences"/>
|
||||
</textView>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstAttribute="trailing" secondItem="gdU-HN-ceD" secondAttribute="trailing" id="9PD-do-GeE"/>
|
||||
<constraint firstItem="gdU-HN-ceD" firstAttribute="leading" secondItem="H2p-sc-9uM" secondAttribute="leading" id="GR8-uq-Gyu"/>
|
||||
<constraint firstAttribute="bottom" secondItem="gdU-HN-ceD" secondAttribute="bottom" id="V5O-xS-djg"/>
|
||||
<constraint firstItem="gdU-HN-ceD" firstAttribute="top" secondItem="H2p-sc-9uM" secondAttribute="top" id="lIB-8a-W2U"/>
|
||||
</constraints>
|
||||
</tableViewCellContentView>
|
||||
<viewLayoutGuide key="safeArea" id="njF-e1-oar"/>
|
||||
<connections>
|
||||
<outlet property="textView" destination="gdU-HN-ceD" id="4xC-Xu-8GV"/>
|
||||
</connections>
|
||||
<point key="canvasLocation" x="139" y="153"/>
|
||||
</tableViewCell>
|
||||
</objects>
|
||||
</document>
|
|
@ -131,9 +131,9 @@
|
|||
- (void)onPlusButtonPressed;
|
||||
|
||||
/**
|
||||
Create an empty room.
|
||||
Open screen to create a new room.
|
||||
*/
|
||||
- (void)createAnEmptyRoom;
|
||||
- (void)createNewRoom;
|
||||
|
||||
/**
|
||||
Join a room by alias or id.
|
||||
|
|
|
@ -34,7 +34,7 @@
|
|||
|
||||
#import "Riot-Swift.h"
|
||||
|
||||
@interface RecentsViewController ()
|
||||
@interface RecentsViewController () <CreateRoomCoordinatorBridgePresenterDelegate>
|
||||
{
|
||||
// Tell whether a recents refresh is pending (suspended during editing mode).
|
||||
BOOL isRefreshPending;
|
||||
|
@ -66,6 +66,8 @@
|
|||
id kThemeServiceDidChangeThemeNotificationObserver;
|
||||
}
|
||||
|
||||
@property (nonatomic, strong) CreateRoomCoordinatorBridgePresenter *createRoomCoordinatorBridgePresenter;
|
||||
|
||||
@end
|
||||
|
||||
@implementation RecentsViewController
|
||||
|
@ -1654,7 +1656,7 @@
|
|||
typeof(self) self = weakSelf;
|
||||
self->currentAlert = nil;
|
||||
|
||||
[self createAnEmptyRoom];
|
||||
[self createNewRoom];
|
||||
}
|
||||
|
||||
}]];
|
||||
|
@ -1692,76 +1694,14 @@
|
|||
[self presentViewController:currentAlert animated:YES completion:nil];
|
||||
}
|
||||
|
||||
- (void)createAnEmptyRoom
|
||||
- (void)createNewRoom
|
||||
{
|
||||
// Sanity check
|
||||
if (self.mainSession)
|
||||
{
|
||||
// Create one room at time
|
||||
if (!currentRequest)
|
||||
{
|
||||
[self startActivityIndicator];
|
||||
|
||||
// Create an empty room.
|
||||
MXWeakify(self);
|
||||
currentRequest = [self.mainSession createRoom:nil
|
||||
visibility:kMXRoomDirectoryVisibilityPrivate
|
||||
roomAlias:nil
|
||||
topic:nil
|
||||
success:^(MXRoom *room) {
|
||||
MXStrongifyAndReturnIfNil(self);
|
||||
|
||||
self->currentRequest = nil;
|
||||
[self stopActivityIndicator];
|
||||
if (self->currentAlert)
|
||||
{
|
||||
[self->currentAlert dismissViewControllerAnimated:NO completion:nil];
|
||||
self->currentAlert = nil;
|
||||
}
|
||||
|
||||
[self dispayRoomWithRoomId:room.roomId inMatrixSession:self.mainSession];
|
||||
|
||||
} failure:^(NSError *error) {
|
||||
MXStrongifyAndReturnIfNil(self);
|
||||
|
||||
self->currentRequest = nil;
|
||||
[self stopActivityIndicator];
|
||||
if (self->currentAlert)
|
||||
{
|
||||
[self->currentAlert dismissViewControllerAnimated:NO completion:nil];
|
||||
self->currentAlert = nil;
|
||||
}
|
||||
|
||||
NSLog(@"[RecentsViewController] Create new room failed");
|
||||
|
||||
// Alert user
|
||||
[[AppDelegate theDelegate] showErrorAsAlert:error];
|
||||
|
||||
}];
|
||||
}
|
||||
else
|
||||
{
|
||||
// Ask the user to wait
|
||||
__weak __typeof(self) weakSelf = self;
|
||||
currentAlert = [UIAlertController alertControllerWithTitle:nil
|
||||
message:NSLocalizedStringFromTable(@"room_creation_wait_for_creation", @"Vector", nil)
|
||||
preferredStyle:UIAlertControllerStyleAlert];
|
||||
|
||||
[currentAlert addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"ok"]
|
||||
style:UIAlertActionStyleDefault
|
||||
handler:^(UIAlertAction * action) {
|
||||
|
||||
if (weakSelf)
|
||||
{
|
||||
typeof(self) self = weakSelf;
|
||||
self->currentAlert = nil;
|
||||
}
|
||||
|
||||
}]];
|
||||
|
||||
[currentAlert mxk_setAccessibilityIdentifier:@"RecentsVCRoomCreationInProgressAlert"];
|
||||
[self presentViewController:currentAlert animated:YES completion:nil];
|
||||
}
|
||||
self.createRoomCoordinatorBridgePresenter = [[CreateRoomCoordinatorBridgePresenter alloc] initWithSession:self.mainSession];
|
||||
self.createRoomCoordinatorBridgePresenter.delegate = self;
|
||||
[self.createRoomCoordinatorBridgePresenter presentFrom:self animated:YES];
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1934,4 +1874,20 @@
|
|||
[self.recentsSearchBar setShowsCancelButton:NO animated:NO];
|
||||
}
|
||||
|
||||
#pragma mark - CreateRoomCoordinatorBridgePresenterDelegate
|
||||
|
||||
- (void)createRoomCoordinatorBridgePresenterDelegate:(CreateRoomCoordinatorBridgePresenter *)coordinatorBridgePresenter didCreateNewRoom:(MXRoom *)room
|
||||
{
|
||||
[coordinatorBridgePresenter dismissWithAnimated:YES completion:^{
|
||||
[[AppDelegate theDelegate] showRoom:room.roomId andEventId:nil withMatrixSession:self.mainSession restoreInitialDisplay:NO];
|
||||
}];
|
||||
coordinatorBridgePresenter = nil;
|
||||
}
|
||||
|
||||
- (void)createRoomCoordinatorBridgePresenterDelegateDidCancel:(CreateRoomCoordinatorBridgePresenter *)coordinatorBridgePresenter
|
||||
{
|
||||
[coordinatorBridgePresenter dismissWithAnimated:YES completion:nil];
|
||||
coordinatorBridgePresenter = nil;
|
||||
}
|
||||
|
||||
@end
|
||||
|
|
|
@ -0,0 +1,117 @@
|
|||
//
|
||||
// Copyright 2020 New Vector Ltd
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import Reusable
|
||||
|
||||
protocol TableViewHeaderFooterViewDelegate: UITextViewDelegate {
|
||||
|
||||
}
|
||||
|
||||
class TableViewHeaderFooterView: UITableViewHeaderFooterView {
|
||||
|
||||
// MARK - Private
|
||||
private var _textView: UITextView?
|
||||
|
||||
private var textViewLeftConstraint: NSLayoutConstraint?
|
||||
private var textViewTopConstraint: NSLayoutConstraint?
|
||||
private var textViewRightConstraint: NSLayoutConstraint?
|
||||
private var textViewBottomConstraint: NSLayoutConstraint?
|
||||
|
||||
// MARK - Public
|
||||
|
||||
weak var delegate: TableViewHeaderFooterViewDelegate?
|
||||
|
||||
var textViewInsets: UIEdgeInsets = UIEdgeInsets(top: 8, left: 16, bottom: 8, right: 16) {
|
||||
didSet {
|
||||
setNeedsUpdateConstraints()
|
||||
}
|
||||
}
|
||||
|
||||
/// Will be created if accessed
|
||||
var textView: UITextView {
|
||||
// hide text label if textView accessed
|
||||
textLabel?.isHidden = true
|
||||
|
||||
if let _textView = _textView {
|
||||
return _textView
|
||||
}
|
||||
|
||||
let view = UITextView()
|
||||
view.backgroundColor = .clear
|
||||
view.translatesAutoresizingMaskIntoConstraints = false
|
||||
view.delegate = self
|
||||
view.isEditable = false
|
||||
view.isScrollEnabled = false
|
||||
view.scrollsToTop = false
|
||||
view.textContainerInset = .zero
|
||||
view.contentInset = .zero
|
||||
view.textContainer.lineFragmentPadding = 0
|
||||
contentView.addSubview(view)
|
||||
textViewLeftConstraint = view.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: textViewInsets.left)
|
||||
textViewTopConstraint = view.topAnchor.constraint(equalTo: contentView.topAnchor, constant: textViewInsets.top)
|
||||
textViewRightConstraint = contentView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: textViewInsets.right)
|
||||
textViewBottomConstraint = contentView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: textViewInsets.bottom)
|
||||
textViewLeftConstraint?.isActive = true
|
||||
textViewTopConstraint?.isActive = true
|
||||
textViewRightConstraint?.isActive = true
|
||||
textViewBottomConstraint?.isActive = true
|
||||
_textView = view
|
||||
return view
|
||||
}
|
||||
|
||||
override func updateConstraints() {
|
||||
super.updateConstraints()
|
||||
|
||||
textViewLeftConstraint?.constant = textViewInsets.left
|
||||
textViewTopConstraint?.constant = textViewInsets.top
|
||||
textViewRightConstraint?.constant = textViewInsets.right
|
||||
textViewBottomConstraint?.constant = textViewInsets.bottom
|
||||
}
|
||||
|
||||
override func prepareForReuse() {
|
||||
super.prepareForReuse()
|
||||
textViewInsets = UIEdgeInsets(top: 8, left: 16, bottom: 8, right: 16)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
extension TableViewHeaderFooterView: Reusable { }
|
||||
|
||||
extension TableViewHeaderFooterView: Themable {
|
||||
|
||||
func update(theme: Theme) {
|
||||
contentView.backgroundColor = theme.headerBackgroundColor
|
||||
textLabel?.textColor = theme.textSecondaryColor
|
||||
_textView?.textColor = theme.textSecondaryColor
|
||||
_textView?.linkTextAttributes = [NSAttributedString.Key.foregroundColor: theme.tintColor]
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
extension TableViewHeaderFooterView: UITextViewDelegate {
|
||||
|
||||
func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool {
|
||||
return delegate?.textView?(textView, shouldInteractWith: URL, in: characterRange, interaction: interaction) ?? (interaction == .invokeDefaultAction)
|
||||
}
|
||||
|
||||
func textViewDidChangeSelection(_ textView: UITextView) {
|
||||
return delegate?.textViewDidChangeSelection?(textView) ?? {
|
||||
textView.selectedRange = NSRange(location: 0, length: 0)
|
||||
}()
|
||||
}
|
||||
|
||||
}
|
59
Riot/Modules/Common/Views/InsettedTextField.swift
Normal file
59
Riot/Modules/Common/Views/InsettedTextField.swift
Normal file
|
@ -0,0 +1,59 @@
|
|||
//
|
||||
// Copyright 2020 New Vector Ltd
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
|
||||
class InsettedTextField: UITextField {
|
||||
|
||||
var insets: UIEdgeInsets = .zero {
|
||||
didSet {
|
||||
setNeedsLayout()
|
||||
}
|
||||
}
|
||||
|
||||
var placeholderColor: UIColor? {
|
||||
didSet {
|
||||
updateAttributedPlaceholder()
|
||||
}
|
||||
}
|
||||
|
||||
override var placeholder: String? {
|
||||
didSet {
|
||||
updateAttributedPlaceholder()
|
||||
}
|
||||
}
|
||||
|
||||
private func updateAttributedPlaceholder() {
|
||||
guard let placeholder = placeholder else { return }
|
||||
guard let color = placeholderColor else { return }
|
||||
attributedPlaceholder = NSAttributedString(string: placeholder, attributes: [
|
||||
NSAttributedString.Key.foregroundColor: color
|
||||
])
|
||||
}
|
||||
|
||||
override func placeholderRect(forBounds bounds: CGRect) -> CGRect {
|
||||
return bounds.inset(by: insets)
|
||||
}
|
||||
|
||||
override func textRect(forBounds bounds: CGRect) -> CGRect {
|
||||
return bounds.inset(by: insets)
|
||||
}
|
||||
|
||||
override func editingRect(forBounds bounds: CGRect) -> CGRect {
|
||||
return bounds.inset(by: insets)
|
||||
}
|
||||
|
||||
}
|
119
Riot/Modules/Common/Views/PlaceholderedTextView.swift
Normal file
119
Riot/Modules/Common/Views/PlaceholderedTextView.swift
Normal file
|
@ -0,0 +1,119 @@
|
|||
//
|
||||
// Copyright 2020 New Vector Ltd
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
|
||||
class PlaceholderedTextView: UITextView {
|
||||
|
||||
private var kvoLineFragmentPadding: NSKeyValueObservation?
|
||||
private lazy var placeholderTextView: UITextView = {
|
||||
let view = UITextView()
|
||||
view.contentInset = self.contentInset
|
||||
view.textContainerInset = self.textContainerInset
|
||||
view.textContainer.lineFragmentPadding = self.textContainer.lineFragmentPadding
|
||||
view.scrollsToTop = false
|
||||
view.showsVerticalScrollIndicator = false
|
||||
view.showsHorizontalScrollIndicator = false
|
||||
view.isEditable = false
|
||||
view.isSelectable = false
|
||||
view.isScrollEnabled = false
|
||||
view.textColor = self.placeholderColor
|
||||
if let placeholder = self.placeholder {
|
||||
view.text = placeholder
|
||||
} else if let attributedPlaceholder = self.attributedPlaceholder {
|
||||
view.attributedText = attributedPlaceholder
|
||||
}
|
||||
view.backgroundColor = .clear
|
||||
view.tintColor = .clear
|
||||
self.addSubview(view)
|
||||
self.sendSubviewToBack(view)
|
||||
return view
|
||||
}()
|
||||
|
||||
var placeholder: String? {
|
||||
didSet {
|
||||
placeholderTextView.text = placeholder
|
||||
}
|
||||
}
|
||||
var attributedPlaceholder: NSAttributedString? {
|
||||
didSet {
|
||||
placeholderTextView.attributedText = attributedPlaceholder
|
||||
}
|
||||
}
|
||||
var placeholderColor: UIColor = .lightGray {
|
||||
didSet {
|
||||
placeholderTextView.textColor = placeholderColor
|
||||
}
|
||||
}
|
||||
|
||||
override var font: UIFont? {
|
||||
didSet {
|
||||
placeholderTextView.font = font
|
||||
}
|
||||
}
|
||||
|
||||
override var contentInset: UIEdgeInsets {
|
||||
didSet {
|
||||
placeholderTextView.contentInset = contentInset
|
||||
}
|
||||
}
|
||||
|
||||
override var textContainerInset: UIEdgeInsets {
|
||||
didSet {
|
||||
placeholderTextView.textContainerInset = textContainerInset
|
||||
}
|
||||
}
|
||||
|
||||
override func layoutSubviews() {
|
||||
super.layoutSubviews()
|
||||
placeholderTextView.frame = bounds
|
||||
}
|
||||
|
||||
override init(frame: CGRect, textContainer: NSTextContainer?) {
|
||||
super.init(frame: frame, textContainer: textContainer)
|
||||
setup()
|
||||
}
|
||||
|
||||
required init?(coder: NSCoder) {
|
||||
super.init(coder: coder)
|
||||
setup()
|
||||
}
|
||||
|
||||
private func setup() {
|
||||
NotificationCenter.default.addObserver(self, selector: #selector(textViewTextChanged(_:)), name: UITextView.textDidChangeNotification, object: self)
|
||||
kvoLineFragmentPadding = observe(\.textContainer.lineFragmentPadding, options: [.new]) { [weak self] (_, change) in
|
||||
guard let self = self else { return }
|
||||
let newValue = change.newValue ?? 0
|
||||
self.placeholderTextView.textContainer.lineFragmentPadding = newValue
|
||||
}
|
||||
}
|
||||
|
||||
override var text: String! {
|
||||
didSet {
|
||||
super.text = text
|
||||
updatePlaceholderVisibility()
|
||||
}
|
||||
}
|
||||
|
||||
@objc func textViewTextChanged(_ sender: UITextView) {
|
||||
updatePlaceholderVisibility()
|
||||
}
|
||||
|
||||
private func updatePlaceholderVisibility() {
|
||||
placeholderTextView.isHidden = text.count > 0
|
||||
}
|
||||
|
||||
}
|
81
Riot/Modules/CreateRoom/CreateRoomCoordinator.swift
Normal file
81
Riot/Modules/CreateRoom/CreateRoomCoordinator.swift
Normal file
|
@ -0,0 +1,81 @@
|
|||
// File created from FlowTemplate
|
||||
// $ createRootCoordinator.sh CreateRoom CreateRoom EnterNewRoomDetails
|
||||
/*
|
||||
Copyright 2020 New Vector Ltd
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
import UIKit
|
||||
|
||||
@objcMembers
|
||||
final class CreateRoomCoordinator: CreateRoomCoordinatorType {
|
||||
|
||||
// MARK: - Properties
|
||||
|
||||
// MARK: Private
|
||||
|
||||
private let navigationRouter: NavigationRouterType
|
||||
private let session: MXSession
|
||||
|
||||
// MARK: Public
|
||||
|
||||
// Must be used only internally
|
||||
var childCoordinators: [Coordinator] = []
|
||||
|
||||
weak var delegate: CreateRoomCoordinatorDelegate?
|
||||
|
||||
// MARK: - Setup
|
||||
|
||||
init(session: MXSession) {
|
||||
self.navigationRouter = NavigationRouter(navigationController: RiotNavigationController())
|
||||
self.session = session
|
||||
}
|
||||
|
||||
// MARK: - Public methods
|
||||
|
||||
func start() {
|
||||
|
||||
let rootCoordinator = self.createEnterNewRoomDetailsCoordinator()
|
||||
|
||||
rootCoordinator.start()
|
||||
|
||||
self.add(childCoordinator: rootCoordinator)
|
||||
|
||||
self.navigationRouter.setRootModule(rootCoordinator)
|
||||
}
|
||||
|
||||
func toPresentable() -> UIViewController {
|
||||
return self.navigationRouter.toPresentable()
|
||||
}
|
||||
|
||||
// MARK: - Private methods
|
||||
|
||||
private func createEnterNewRoomDetailsCoordinator() -> EnterNewRoomDetailsCoordinator {
|
||||
let coordinator = EnterNewRoomDetailsCoordinator(session: self.session)
|
||||
coordinator.delegate = self
|
||||
return coordinator
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - EnterNewRoomDetailsCoordinatorDelegate
|
||||
extension CreateRoomCoordinator: EnterNewRoomDetailsCoordinatorDelegate {
|
||||
|
||||
func enterNewRoomDetailsCoordinator(_ coordinator: EnterNewRoomDetailsCoordinatorType, didCreateNewRoom room: MXRoom) {
|
||||
self.delegate?.createRoomCoordinator(self, didCreateNewRoom: room)
|
||||
}
|
||||
|
||||
func enterNewRoomDetailsCoordinatorDidCancel(_ coordinator: EnterNewRoomDetailsCoordinatorType) {
|
||||
self.delegate?.createRoomCoordinatorDidCancel(self)
|
||||
}
|
||||
}
|
|
@ -0,0 +1,103 @@
|
|||
// File created from FlowTemplate
|
||||
// $ createRootCoordinator.sh CreateRoom CreateRoom EnterNewRoomDetails
|
||||
/*
|
||||
Copyright 2020 New Vector Ltd
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
import Foundation
|
||||
|
||||
@objc protocol CreateRoomCoordinatorBridgePresenterDelegate {
|
||||
func createRoomCoordinatorBridgePresenterDelegate(_ coordinatorBridgePresenter: CreateRoomCoordinatorBridgePresenter, didCreateNewRoom room: MXRoom)
|
||||
func createRoomCoordinatorBridgePresenterDelegateDidCancel(_ coordinatorBridgePresenter: CreateRoomCoordinatorBridgePresenter)
|
||||
}
|
||||
|
||||
/// CreateRoomCoordinatorBridgePresenter enables to start CreateRoomCoordinator from a view controller.
|
||||
/// This bridge is used while waiting for global usage of coordinator pattern.
|
||||
@objcMembers
|
||||
final class CreateRoomCoordinatorBridgePresenter: NSObject {
|
||||
|
||||
// MARK: - Properties
|
||||
|
||||
// MARK: Private
|
||||
|
||||
private let session: MXSession
|
||||
private var coordinator: CreateRoomCoordinator?
|
||||
|
||||
// MARK: Public
|
||||
|
||||
weak var delegate: CreateRoomCoordinatorBridgePresenterDelegate?
|
||||
|
||||
// MARK: - Setup
|
||||
|
||||
init(session: MXSession) {
|
||||
self.session = session
|
||||
super.init()
|
||||
}
|
||||
|
||||
// MARK: - Public
|
||||
|
||||
// NOTE: Default value feature is not compatible with Objective-C.
|
||||
// func present(from viewController: UIViewController, animated: Bool) {
|
||||
// self.present(from: viewController, animated: animated)
|
||||
// }
|
||||
|
||||
func present(from viewController: UIViewController, animated: Bool) {
|
||||
let createRoomCoordinator = CreateRoomCoordinator(session: self.session)
|
||||
createRoomCoordinator.delegate = self
|
||||
let presentable = createRoomCoordinator.toPresentable()
|
||||
presentable.presentationController?.delegate = self
|
||||
viewController.present(presentable, animated: animated, completion: nil)
|
||||
createRoomCoordinator.start()
|
||||
|
||||
self.coordinator = createRoomCoordinator
|
||||
}
|
||||
|
||||
func dismiss(animated: Bool, completion: (() -> Void)?) {
|
||||
guard let coordinator = self.coordinator else {
|
||||
return
|
||||
}
|
||||
coordinator.toPresentable().dismiss(animated: animated) {
|
||||
self.coordinator = nil
|
||||
|
||||
if let completion = completion {
|
||||
completion()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - CreateRoomCoordinatorDelegate
|
||||
|
||||
extension CreateRoomCoordinatorBridgePresenter: CreateRoomCoordinatorDelegate {
|
||||
|
||||
func createRoomCoordinator(_ coordinator: CreateRoomCoordinatorType, didCreateNewRoom room: MXRoom) {
|
||||
self.delegate?.createRoomCoordinatorBridgePresenterDelegate(self, didCreateNewRoom: room)
|
||||
}
|
||||
|
||||
func createRoomCoordinatorDidCancel(_ coordinator: CreateRoomCoordinatorType) {
|
||||
self.delegate?.createRoomCoordinatorBridgePresenterDelegateDidCancel(self)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// MARK: - UIAdaptivePresentationControllerDelegate
|
||||
|
||||
extension CreateRoomCoordinatorBridgePresenter: UIAdaptivePresentationControllerDelegate {
|
||||
|
||||
func presentationControllerDidDismiss(_ presentationController: UIPresentationController) {
|
||||
self.delegate?.createRoomCoordinatorBridgePresenterDelegateDidCancel(self)
|
||||
}
|
||||
|
||||
}
|
29
Riot/Modules/CreateRoom/CreateRoomCoordinatorType.swift
Normal file
29
Riot/Modules/CreateRoom/CreateRoomCoordinatorType.swift
Normal file
|
@ -0,0 +1,29 @@
|
|||
// File created from FlowTemplate
|
||||
// $ createRootCoordinator.sh CreateRoom CreateRoom EnterNewRoomDetails
|
||||
/*
|
||||
Copyright 2020 New Vector Ltd
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
import Foundation
|
||||
|
||||
protocol CreateRoomCoordinatorDelegate: class {
|
||||
func createRoomCoordinator(_ coordinator: CreateRoomCoordinatorType, didCreateNewRoom room: MXRoom)
|
||||
func createRoomCoordinatorDidCancel(_ coordinator: CreateRoomCoordinatorType)
|
||||
}
|
||||
|
||||
/// `CreateRoomCoordinatorType` is a protocol describing a Coordinator that handle keybackup setup navigation flow.
|
||||
protocol CreateRoomCoordinatorType: Coordinator, Presentable {
|
||||
var delegate: CreateRoomCoordinatorDelegate? { get }
|
||||
}
|
|
@ -0,0 +1,55 @@
|
|||
//
|
||||
// Copyright 2020 New Vector Ltd
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
import Reusable
|
||||
|
||||
protocol ChooseAvatarTableViewCellDelegate: class {
|
||||
func chooseAvatarTableViewCellDidTapChooseAvatar(_ cell: ChooseAvatarTableViewCell, sourceView: UIView)
|
||||
}
|
||||
|
||||
class ChooseAvatarTableViewCell: UITableViewCell {
|
||||
|
||||
@IBOutlet private weak var avatarImageView: UIImageView! {
|
||||
didSet {
|
||||
avatarImageView.layer.cornerRadius = avatarImageView.frame.width/2
|
||||
}
|
||||
}
|
||||
@IBOutlet private weak var chooseAvatarButton: UIButton!
|
||||
|
||||
weak var delegate: ChooseAvatarTableViewCellDelegate?
|
||||
|
||||
@IBAction private func chooseAvatarButtonTapped(_ sender: UIButton) {
|
||||
delegate?.chooseAvatarTableViewCellDidTapChooseAvatar(self, sourceView: sender)
|
||||
}
|
||||
|
||||
func configure(withViewModel viewModel: ChooseAvatarTableViewCellVM) {
|
||||
avatarImageView.image = viewModel.avatarImage
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
extension ChooseAvatarTableViewCell: NibReusable {}
|
||||
|
||||
extension ChooseAvatarTableViewCell: Themable {
|
||||
|
||||
func update(theme: Theme) {
|
||||
backgroundView = UIView()
|
||||
backgroundView?.backgroundColor = theme.backgroundColor
|
||||
avatarImageView.backgroundColor = theme.tintColor
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,73 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="16096" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
|
||||
<device id="retina6_1" orientation="portrait" appearance="light"/>
|
||||
<dependencies>
|
||||
<deployment identifier="iOS"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="16087"/>
|
||||
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
|
||||
<tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" rowHeight="100" id="KGk-i7-Jjw" customClass="ChooseAvatarTableViewCell" customModule="Riot" customModuleProvider="target">
|
||||
<rect key="frame" x="0.0" y="0.0" width="335" height="100"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="KGk-i7-Jjw" id="H2p-sc-9uM">
|
||||
<rect key="frame" x="0.0" y="0.0" width="335" height="100"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="cxa-zY-I2z">
|
||||
<rect key="frame" x="137.5" y="20" width="60" height="60"/>
|
||||
<subviews>
|
||||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="jO2-1T-e01">
|
||||
<rect key="frame" x="0.0" y="0.0" width="60" height="60"/>
|
||||
</imageView>
|
||||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="capture_avatar" translatesAutoresizingMaskIntoConstraints="NO" id="DmM-HO-d5u">
|
||||
<rect key="frame" x="36" y="36" width="24" height="24"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="24" id="CfH-3G-sp2"/>
|
||||
<constraint firstAttribute="height" constant="24" id="LAj-br-cZn"/>
|
||||
</constraints>
|
||||
</imageView>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Qhc-S1-fNz">
|
||||
<rect key="frame" x="0.0" y="0.0" width="60" height="60"/>
|
||||
<connections>
|
||||
<action selector="chooseAvatarButtonTapped:" destination="KGk-i7-Jjw" eventType="touchUpInside" id="Tr5-En-JRL"/>
|
||||
</connections>
|
||||
</button>
|
||||
</subviews>
|
||||
<color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
|
||||
<constraints>
|
||||
<constraint firstItem="jO2-1T-e01" firstAttribute="top" secondItem="cxa-zY-I2z" secondAttribute="top" id="4vV-IL-HBT"/>
|
||||
<constraint firstItem="jO2-1T-e01" firstAttribute="leading" secondItem="cxa-zY-I2z" secondAttribute="leading" id="EHU-dt-Wct"/>
|
||||
<constraint firstItem="Qhc-S1-fNz" firstAttribute="leading" secondItem="cxa-zY-I2z" secondAttribute="leading" id="EXo-Xj-gmU"/>
|
||||
<constraint firstAttribute="trailing" secondItem="jO2-1T-e01" secondAttribute="trailing" id="Jl4-Km-Skg"/>
|
||||
<constraint firstAttribute="width" constant="60" id="UGR-4m-Wbs"/>
|
||||
<constraint firstAttribute="trailing" secondItem="DmM-HO-d5u" secondAttribute="trailing" id="ULE-c0-OVB"/>
|
||||
<constraint firstItem="Qhc-S1-fNz" firstAttribute="top" secondItem="cxa-zY-I2z" secondAttribute="top" id="Vmh-gb-pTd"/>
|
||||
<constraint firstAttribute="height" constant="60" id="XgW-eP-Ej1"/>
|
||||
<constraint firstAttribute="bottom" secondItem="jO2-1T-e01" secondAttribute="bottom" id="k80-e4-Sir"/>
|
||||
<constraint firstAttribute="trailing" secondItem="Qhc-S1-fNz" secondAttribute="trailing" id="mmu-lZ-hA2"/>
|
||||
<constraint firstAttribute="bottom" secondItem="DmM-HO-d5u" secondAttribute="bottom" id="qH0-4k-fJI"/>
|
||||
<constraint firstAttribute="bottom" secondItem="Qhc-S1-fNz" secondAttribute="bottom" id="xzy-TW-HzO"/>
|
||||
</constraints>
|
||||
</view>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstItem="cxa-zY-I2z" firstAttribute="centerX" secondItem="H2p-sc-9uM" secondAttribute="centerX" id="LzI-TD-D7I"/>
|
||||
<constraint firstItem="cxa-zY-I2z" firstAttribute="centerY" secondItem="H2p-sc-9uM" secondAttribute="centerY" id="ckM-FU-rM1"/>
|
||||
</constraints>
|
||||
</tableViewCellContentView>
|
||||
<viewLayoutGuide key="safeArea" id="njF-e1-oar"/>
|
||||
<connections>
|
||||
<outlet property="avatarImageView" destination="jO2-1T-e01" id="LDf-AD-Ubx"/>
|
||||
<outlet property="chooseAvatarButton" destination="Qhc-S1-fNz" id="37s-Cp-Uwf"/>
|
||||
</connections>
|
||||
<point key="canvasLocation" x="63.04347826086957" y="89.0625"/>
|
||||
</tableViewCell>
|
||||
</objects>
|
||||
<resources>
|
||||
<image name="capture_avatar" width="25" height="25"/>
|
||||
</resources>
|
||||
</document>
|
|
@ -0,0 +1,21 @@
|
|||
//
|
||||
// Copyright 2020 New Vector Ltd
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
struct ChooseAvatarTableViewCellVM {
|
||||
var avatarImage: UIImage?
|
||||
}
|
|
@ -0,0 +1,95 @@
|
|||
// File created from ScreenTemplate
|
||||
// $ createScreen.sh CreateRoom/EnterNewRoomDetails EnterNewRoomDetails
|
||||
/*
|
||||
Copyright 2020 New Vector Ltd
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
import Foundation
|
||||
import UIKit
|
||||
|
||||
final class EnterNewRoomDetailsCoordinator: EnterNewRoomDetailsCoordinatorType {
|
||||
|
||||
// MARK: - Properties
|
||||
|
||||
// MARK: Private
|
||||
|
||||
private let session: MXSession
|
||||
private var enterNewRoomDetailsViewModel: EnterNewRoomDetailsViewModelType
|
||||
private let enterNewRoomDetailsViewController: EnterNewRoomDetailsViewController
|
||||
|
||||
private lazy var singleImagePickerPresenter: SingleImagePickerPresenter = {
|
||||
let presenter = SingleImagePickerPresenter(session: session)
|
||||
presenter.delegate = self
|
||||
return presenter
|
||||
}()
|
||||
|
||||
// MARK: Public
|
||||
|
||||
// Must be used only internally
|
||||
var childCoordinators: [Coordinator] = []
|
||||
|
||||
weak var delegate: EnterNewRoomDetailsCoordinatorDelegate?
|
||||
|
||||
// MARK: - Setup
|
||||
|
||||
init(session: MXSession) {
|
||||
self.session = session
|
||||
|
||||
let enterNewRoomDetailsViewModel = EnterNewRoomDetailsViewModel(session: self.session)
|
||||
let enterNewRoomDetailsViewController = EnterNewRoomDetailsViewController.instantiate(with: enterNewRoomDetailsViewModel)
|
||||
self.enterNewRoomDetailsViewModel = enterNewRoomDetailsViewModel
|
||||
self.enterNewRoomDetailsViewController = enterNewRoomDetailsViewController
|
||||
}
|
||||
|
||||
// MARK: - Public methods
|
||||
|
||||
func start() {
|
||||
self.enterNewRoomDetailsViewModel.coordinatorDelegate = self
|
||||
}
|
||||
|
||||
func toPresentable() -> UIViewController {
|
||||
return self.enterNewRoomDetailsViewController
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - EnterNewRoomDetailsViewModelCoordinatorDelegate
|
||||
extension EnterNewRoomDetailsCoordinator: EnterNewRoomDetailsViewModelCoordinatorDelegate {
|
||||
|
||||
func enterNewRoomDetailsViewModel(_ viewModel: EnterNewRoomDetailsViewModelType, didCreateNewRoom room: MXRoom) {
|
||||
self.delegate?.enterNewRoomDetailsCoordinator(self, didCreateNewRoom: room)
|
||||
}
|
||||
|
||||
func enterNewRoomDetailsViewModel(_ viewModel: EnterNewRoomDetailsViewModelType, didTapChooseAvatar sourceView: UIView) {
|
||||
singleImagePickerPresenter.present(from: toPresentable(), sourceView: sourceView, sourceRect: sourceView.bounds, animated: true)
|
||||
}
|
||||
|
||||
func enterNewRoomDetailsViewModelDidCancel(_ viewModel: EnterNewRoomDetailsViewModelType) {
|
||||
self.delegate?.enterNewRoomDetailsCoordinatorDidCancel(self)
|
||||
}
|
||||
}
|
||||
|
||||
extension EnterNewRoomDetailsCoordinator: SingleImagePickerPresenterDelegate {
|
||||
|
||||
func singleImagePickerPresenter(_ presenter: SingleImagePickerPresenter, didSelectImageData imageData: Data, withUTI uti: MXKUTI?) {
|
||||
enterNewRoomDetailsViewModel.roomCreationParameters.userSelectedAvatar = UIImage(data: imageData)
|
||||
enterNewRoomDetailsViewModel.process(viewAction: .loadData)
|
||||
presenter.dismiss(animated: true, completion: nil)
|
||||
}
|
||||
|
||||
func singleImagePickerPresenterDidCancel(_ presenter: SingleImagePickerPresenter) {
|
||||
presenter.dismiss(animated: true, completion: nil)
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,29 @@
|
|||
// File created from ScreenTemplate
|
||||
// $ createScreen.sh CreateRoom/EnterNewRoomDetails EnterNewRoomDetails
|
||||
/*
|
||||
Copyright 2020 New Vector Ltd
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
import Foundation
|
||||
|
||||
protocol EnterNewRoomDetailsCoordinatorDelegate: class {
|
||||
func enterNewRoomDetailsCoordinator(_ coordinator: EnterNewRoomDetailsCoordinatorType, didCreateNewRoom room: MXRoom)
|
||||
func enterNewRoomDetailsCoordinatorDidCancel(_ coordinator: EnterNewRoomDetailsCoordinatorType)
|
||||
}
|
||||
|
||||
/// `EnterNewRoomDetailsCoordinatorType` is a protocol describing a Coordinator that handle key backup setup passphrase navigation flow.
|
||||
protocol EnterNewRoomDetailsCoordinatorType: Coordinator, Presentable {
|
||||
var delegate: EnterNewRoomDetailsCoordinatorDelegate? { get }
|
||||
}
|
|
@ -0,0 +1,27 @@
|
|||
// File created from ScreenTemplate
|
||||
// $ createScreen.sh CreateRoom/EnterNewRoomDetails EnterNewRoomDetails
|
||||
/*
|
||||
Copyright 2020 New Vector Ltd
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
import Foundation
|
||||
|
||||
/// EnterNewRoomDetailsViewController view actions exposed to view model
|
||||
enum EnterNewRoomDetailsViewAction {
|
||||
case loadData
|
||||
case chooseAvatar(sourceView: UIView)
|
||||
case cancel
|
||||
case create
|
||||
}
|
|
@ -0,0 +1,46 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="16096" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="V8j-Lb-PgC">
|
||||
<device id="retina6_1" orientation="portrait" appearance="light"/>
|
||||
<dependencies>
|
||||
<deployment identifier="iOS"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="16087"/>
|
||||
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<scenes>
|
||||
<!--Enter New Room Details View Controller-->
|
||||
<scene sceneID="mt5-wz-YKA">
|
||||
<objects>
|
||||
<viewController extendedLayoutIncludesOpaqueBars="YES" automaticallyAdjustsScrollViewInsets="NO" id="V8j-Lb-PgC" customClass="EnterNewRoomDetailsViewController" customModule="Riot" customModuleProvider="target" sceneMemberID="viewController">
|
||||
<view key="view" contentMode="scaleToFill" id="EL9-GA-lwo">
|
||||
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="grouped" separatorStyle="default" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="18" sectionFooterHeight="18" translatesAutoresizingMaskIntoConstraints="NO" id="HbJ-HP-aOs">
|
||||
<rect key="frame" x="0.0" y="44" width="414" height="852"/>
|
||||
<color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
|
||||
<connections>
|
||||
<outlet property="dataSource" destination="V8j-Lb-PgC" id="xKn-sz-bXk"/>
|
||||
<outlet property="delegate" destination="V8j-Lb-PgC" id="DSm-uh-3aS"/>
|
||||
</connections>
|
||||
</tableView>
|
||||
</subviews>
|
||||
<color key="backgroundColor" red="0.94509803921568625" green="0.96078431372549022" blue="0.97254901960784312" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<constraints>
|
||||
<constraint firstItem="HbJ-HP-aOs" firstAttribute="leading" secondItem="EL9-GA-lwo" secondAttribute="leading" id="9lL-Z4-i8u"/>
|
||||
<constraint firstAttribute="bottom" secondItem="HbJ-HP-aOs" secondAttribute="bottom" id="XdU-di-w5r"/>
|
||||
<constraint firstItem="HbJ-HP-aOs" firstAttribute="top" secondItem="bFg-jh-JZB" secondAttribute="top" id="g75-oF-VGU"/>
|
||||
<constraint firstAttribute="trailing" secondItem="HbJ-HP-aOs" secondAttribute="trailing" id="wqe-iU-fnH"/>
|
||||
</constraints>
|
||||
<viewLayoutGuide key="safeArea" id="bFg-jh-JZB"/>
|
||||
</view>
|
||||
<connections>
|
||||
<outlet property="mainTableView" destination="HbJ-HP-aOs" id="5hT-pT-W0G"/>
|
||||
</connections>
|
||||
</viewController>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="zK0-v6-7Wt" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
||||
</objects>
|
||||
<point key="canvasLocation" x="-3198" y="-647"/>
|
||||
</scene>
|
||||
</scenes>
|
||||
</document>
|
|
@ -0,0 +1,578 @@
|
|||
// File created from ScreenTemplate
|
||||
// $ createScreen.sh CreateRoom/EnterNewRoomDetails EnterNewRoomDetails
|
||||
/*
|
||||
Copyright 2020 New Vector Ltd
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
import UIKit
|
||||
|
||||
final class EnterNewRoomDetailsViewController: UIViewController {
|
||||
|
||||
// MARK: - Constants
|
||||
|
||||
private enum Constants {
|
||||
static let defaultStyleCellReuseIdentifier = "default"
|
||||
static let roomNameTextFieldTag: Int = 100
|
||||
static let roomTopicTextViewTag: Int = 101
|
||||
static let roomAddressTextFieldTag: Int = 102
|
||||
static let roomNameMinimumNumberOfChars = 3
|
||||
static let roomNameMaximumNumberOfChars = 50
|
||||
static let roomAddressMaximumNumberOfChars = 50
|
||||
static let roomTopicMaximumNumberOfChars = 250
|
||||
}
|
||||
|
||||
// MARK: - Properties
|
||||
|
||||
// MARK: Outlets
|
||||
|
||||
@IBOutlet private weak var mainTableView: UITableView!
|
||||
|
||||
// MARK: Private
|
||||
|
||||
private var viewModel: EnterNewRoomDetailsViewModelType!
|
||||
private var theme: Theme!
|
||||
private var keyboardAvoider: KeyboardAvoider?
|
||||
private var errorPresenter: MXKErrorPresentation!
|
||||
private var activityPresenter: ActivityIndicatorPresenter!
|
||||
private lazy var createBarButtonItem: MXKBarButtonItem = {
|
||||
let item = MXKBarButtonItem(title: VectorL10n.create, style: .plain) { [weak self] in
|
||||
self?.createButtonAction()
|
||||
}!
|
||||
item.isEnabled = false
|
||||
return item
|
||||
}()
|
||||
|
||||
private enum RowType {
|
||||
case `default`
|
||||
case avatar(image: UIImage?)
|
||||
case textField(tag: Int, placeholder: String?, delegate: UITextFieldDelegate?)
|
||||
case textView(tag: Int, placeholder: String?, delegate: UITextViewDelegate?)
|
||||
case withSwitch(isOn: Bool, onValueChanged: ((UISwitch) -> Void)?)
|
||||
}
|
||||
|
||||
private struct Row {
|
||||
var type: RowType
|
||||
var text: String?
|
||||
var accessoryType: UITableViewCell.AccessoryType = .none
|
||||
var action: (() -> Void)?
|
||||
}
|
||||
|
||||
private struct Section {
|
||||
var header: String?
|
||||
var rows: [Row]
|
||||
var footer: String?
|
||||
}
|
||||
|
||||
private var sections: [Section] = [] {
|
||||
didSet {
|
||||
mainTableView.reloadData()
|
||||
}
|
||||
}
|
||||
|
||||
private func showActivityIndicator() {
|
||||
if self.activityPresenter.isPresenting == false {
|
||||
self.activityPresenter.presentActivityIndicator(on: self.view, animated: true)
|
||||
}
|
||||
}
|
||||
|
||||
private func hideActivityIndicator() {
|
||||
self.activityPresenter.removeCurrentActivityIndicator(animated: true)
|
||||
}
|
||||
|
||||
private func updateSections() {
|
||||
let row_0_0 = Row(type: .avatar(image: viewModel.roomCreationParameters.avatarImage), text: nil, accessoryType: .none) {
|
||||
// open image picker
|
||||
}
|
||||
let section0 = Section(header: nil,
|
||||
rows: [row_0_0],
|
||||
footer: nil)
|
||||
|
||||
let row_1_0 = Row(type: .textField(tag: Constants.roomNameTextFieldTag, placeholder: VectorL10n.createRoomPlaceholderName, delegate: self), text: viewModel.roomCreationParameters.name, accessoryType: .none) {
|
||||
|
||||
}
|
||||
let section1 = Section(header: VectorL10n.createRoomSectionHeaderName,
|
||||
rows: [row_1_0],
|
||||
footer: nil)
|
||||
|
||||
let row_2_0 = Row(type: .textView(tag: Constants.roomTopicTextViewTag, placeholder: VectorL10n.createRoomPlaceholderTopic, delegate: self), text: viewModel.roomCreationParameters.topic, accessoryType: .none) {
|
||||
|
||||
}
|
||||
let section2 = Section(header: VectorL10n.createRoomSectionHeaderTopic,
|
||||
rows: [row_2_0],
|
||||
footer: nil)
|
||||
|
||||
let row_3_0 = Row(type: .withSwitch(isOn: viewModel.roomCreationParameters.isEncrypted, onValueChanged: { (theSwitch) in
|
||||
self.viewModel.roomCreationParameters.isEncrypted = theSwitch.isOn
|
||||
}), text: VectorL10n.createRoomEnableEncryption, accessoryType: .none) {
|
||||
// no-op
|
||||
}
|
||||
let section3 = Section(header: VectorL10n.createRoomSectionHeaderEncryption,
|
||||
rows: [row_3_0],
|
||||
footer: VectorL10n.createRoomSectionFooterEncryption)
|
||||
|
||||
let row_4_0 = Row(type: .default, text: VectorL10n.createRoomTypePrivate, accessoryType: viewModel.roomCreationParameters.isPublic ? .none : .checkmark) {
|
||||
self.viewModel.roomCreationParameters.isPublic = false
|
||||
self.updateSections()
|
||||
}
|
||||
let row_4_1 = Row(type: .default, text: VectorL10n.createRoomTypePublic, accessoryType: viewModel.roomCreationParameters.isPublic ? .checkmark : .none) {
|
||||
self.viewModel.roomCreationParameters.isPublic = true
|
||||
self.updateSections()
|
||||
// scroll bottom to show user new fields
|
||||
DispatchQueue.main.async {
|
||||
self.mainTableView.scrollToRow(at: IndexPath(row: 0, section: 6), at: .bottom, animated: true)
|
||||
}
|
||||
}
|
||||
let section4 = Section(header: VectorL10n.createRoomSectionHeaderType,
|
||||
rows: [row_4_0, row_4_1],
|
||||
footer: VectorL10n.createRoomSectionFooterType)
|
||||
|
||||
var tmpSections: [Section] = [
|
||||
section0,
|
||||
section1,
|
||||
section2,
|
||||
section3,
|
||||
section4
|
||||
]
|
||||
|
||||
if viewModel.roomCreationParameters.isPublic {
|
||||
let row_5_0 = Row(type: .withSwitch(isOn: viewModel.roomCreationParameters.showInDirectory, onValueChanged: { (theSwitch) in
|
||||
self.viewModel.roomCreationParameters.showInDirectory = theSwitch.isOn
|
||||
}), text: VectorL10n.createRoomShowInDirectory, accessoryType: .none) {
|
||||
// no-op
|
||||
}
|
||||
let section5 = Section(header: nil,
|
||||
rows: [row_5_0],
|
||||
footer: nil)
|
||||
|
||||
let row_6_0 = Row(type: .textField(tag: Constants.roomAddressTextFieldTag, placeholder: VectorL10n.createRoomPlaceholderAddress, delegate: self), text: viewModel.roomCreationParameters.address, accessoryType: .none) {
|
||||
|
||||
}
|
||||
let section6 = Section(header: VectorL10n.createRoomSectionHeaderAddress,
|
||||
rows: [row_6_0],
|
||||
footer: nil)
|
||||
|
||||
tmpSections.append(contentsOf: [section5, section6])
|
||||
}
|
||||
|
||||
sections = tmpSections
|
||||
}
|
||||
|
||||
// MARK: - Setup
|
||||
|
||||
class func instantiate(with viewModel: EnterNewRoomDetailsViewModelType) -> EnterNewRoomDetailsViewController {
|
||||
let viewController = StoryboardScene.EnterNewRoomDetailsViewController.initialScene.instantiate()
|
||||
viewController.viewModel = viewModel
|
||||
viewController.theme = ThemeService.shared().theme
|
||||
return viewController
|
||||
}
|
||||
|
||||
// MARK: - Life cycle
|
||||
|
||||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
|
||||
// Do any additional setup after loading the view.
|
||||
|
||||
self.setupViews()
|
||||
self.keyboardAvoider = KeyboardAvoider(scrollViewContainerView: self.view, scrollView: self.mainTableView)
|
||||
self.activityPresenter = ActivityIndicatorPresenter()
|
||||
self.errorPresenter = MXKErrorAlertPresentation()
|
||||
|
||||
self.registerThemeServiceDidChangeThemeNotification()
|
||||
self.update(theme: self.theme)
|
||||
|
||||
self.viewModel.viewDelegate = self
|
||||
|
||||
self.viewModel.process(viewAction: .loadData)
|
||||
}
|
||||
|
||||
override func viewWillAppear(_ animated: Bool) {
|
||||
super.viewWillAppear(animated)
|
||||
|
||||
self.keyboardAvoider?.startAvoiding()
|
||||
}
|
||||
|
||||
override func viewDidDisappear(_ animated: Bool) {
|
||||
super.viewDidDisappear(animated)
|
||||
|
||||
self.keyboardAvoider?.stopAvoiding()
|
||||
}
|
||||
|
||||
override var preferredStatusBarStyle: UIStatusBarStyle {
|
||||
return self.theme.statusBarStyle
|
||||
}
|
||||
|
||||
// MARK: - Private
|
||||
|
||||
private func update(theme: Theme) {
|
||||
self.theme = theme
|
||||
|
||||
self.view.backgroundColor = theme.headerBackgroundColor
|
||||
self.mainTableView.backgroundColor = theme.headerBackgroundColor
|
||||
|
||||
if let navigationBar = self.navigationController?.navigationBar {
|
||||
theme.applyStyle(onNavigationBar: navigationBar)
|
||||
}
|
||||
|
||||
self.mainTableView.reloadData()
|
||||
}
|
||||
|
||||
private func registerThemeServiceDidChangeThemeNotification() {
|
||||
NotificationCenter.default.addObserver(self, selector: #selector(themeDidChange), name: .themeServiceDidChangeTheme, object: nil)
|
||||
}
|
||||
|
||||
@objc private func themeDidChange() {
|
||||
self.update(theme: ThemeService.shared().theme)
|
||||
}
|
||||
|
||||
private func setupViews() {
|
||||
let cancelBarButtonItem = MXKBarButtonItem(title: VectorL10n.cancel, style: .plain) { [weak self] in
|
||||
self?.cancelButtonAction()
|
||||
}
|
||||
|
||||
self.navigationItem.leftBarButtonItem = cancelBarButtonItem
|
||||
|
||||
self.navigationItem.rightBarButtonItem = createBarButtonItem
|
||||
|
||||
self.title = VectorL10n.createRoomTitle
|
||||
|
||||
mainTableView.keyboardDismissMode = .interactive
|
||||
mainTableView.register(cellType: ChooseAvatarTableViewCell.self)
|
||||
mainTableView.register(cellType: MXKTableViewCellWithLabelAndSwitch.self)
|
||||
mainTableView.register(cellType: MXKTableViewCellWithTextView.self)
|
||||
mainTableView.register(cellType: TextFieldTableViewCell.self)
|
||||
mainTableView.register(cellType: TextViewTableViewCell.self)
|
||||
mainTableView.register(headerFooterViewType: TableViewHeaderFooterView.self)
|
||||
mainTableView.sectionHeaderHeight = UITableView.automaticDimension
|
||||
mainTableView.estimatedSectionHeaderHeight = 50
|
||||
mainTableView.sectionFooterHeight = UITableView.automaticDimension
|
||||
mainTableView.estimatedSectionFooterHeight = 50
|
||||
}
|
||||
|
||||
private func render(viewState: EnterNewRoomDetailsViewState) {
|
||||
switch viewState {
|
||||
case .loading:
|
||||
self.renderLoading()
|
||||
case .loaded:
|
||||
updateSections()
|
||||
case .error(let error):
|
||||
self.render(error: error)
|
||||
}
|
||||
}
|
||||
|
||||
private func renderLoading() {
|
||||
self.activityPresenter.presentActivityIndicator(on: self.view, animated: true)
|
||||
}
|
||||
|
||||
private func render(error: Error) {
|
||||
self.activityPresenter.removeCurrentActivityIndicator(animated: true)
|
||||
self.errorPresenter.presentError(from: self, forError: error, animated: true, handler: nil)
|
||||
}
|
||||
|
||||
// MARK: - Actions
|
||||
|
||||
private func cancelButtonAction() {
|
||||
self.viewModel.process(viewAction: .cancel)
|
||||
}
|
||||
|
||||
private func createButtonAction() {
|
||||
self.viewModel.process(viewAction: .create)
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - UITableViewDataSource
|
||||
|
||||
extension EnterNewRoomDetailsViewController: UITableViewDataSource {
|
||||
|
||||
func numberOfSections(in tableView: UITableView) -> Int {
|
||||
return sections.count
|
||||
}
|
||||
|
||||
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
|
||||
return sections[section].rows.count
|
||||
}
|
||||
|
||||
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
|
||||
let row = sections[indexPath.section].rows[indexPath.row]
|
||||
|
||||
switch row.type {
|
||||
case .default:
|
||||
var cell: UITableViewCell! = tableView.dequeueReusableCell(withIdentifier: Constants.defaultStyleCellReuseIdentifier)
|
||||
if cell == nil {
|
||||
cell = UITableViewCell(style: .default, reuseIdentifier: Constants.defaultStyleCellReuseIdentifier)
|
||||
}
|
||||
cell.textLabel?.font = .systemFont(ofSize: 17)
|
||||
cell.detailTextLabel?.font = .systemFont(ofSize: 16)
|
||||
cell.textLabel?.text = row.text
|
||||
if row.accessoryType == .checkmark {
|
||||
cell.accessoryView = UIImageView(image: Asset.Images.checkmark.image)
|
||||
} else {
|
||||
cell.accessoryView = nil
|
||||
cell.accessoryType = row.accessoryType
|
||||
}
|
||||
cell.textLabel?.textColor = theme.textPrimaryColor
|
||||
cell.detailTextLabel?.textColor = theme.textSecondaryColor
|
||||
cell.backgroundColor = theme.backgroundColor
|
||||
cell.contentView.backgroundColor = .clear
|
||||
cell.tintColor = theme.tintColor
|
||||
return cell
|
||||
case .avatar(let image):
|
||||
let cell: ChooseAvatarTableViewCell = tableView.dequeueReusableCell(for: indexPath)
|
||||
cell.configure(withViewModel: ChooseAvatarTableViewCellVM(avatarImage: image))
|
||||
cell.delegate = self
|
||||
cell.update(theme: theme)
|
||||
|
||||
return cell
|
||||
case .textField(let tag, let placeholder, let delegate):
|
||||
let cell: TextFieldTableViewCell = tableView.dequeueReusableCell(for: indexPath)
|
||||
cell.textField.font = .systemFont(ofSize: 17)
|
||||
cell.textField.insets = UIEdgeInsets(top: 8, left: 16, bottom: 8, right: 16)
|
||||
cell.textField.autocapitalizationType = .words
|
||||
cell.textField.tag = tag
|
||||
cell.textField.placeholder = placeholder
|
||||
cell.textField.text = row.text
|
||||
cell.textField.delegate = delegate
|
||||
|
||||
switch tag {
|
||||
case Constants.roomAddressTextFieldTag:
|
||||
cell.textField.autocapitalizationType = .none
|
||||
default: break
|
||||
}
|
||||
|
||||
cell.update(theme: theme)
|
||||
|
||||
return cell
|
||||
case .textView(let tag, let placeholder, let delegate):
|
||||
let cell: TextViewTableViewCell = tableView.dequeueReusableCell(for: indexPath)
|
||||
cell.textView.tag = tag
|
||||
cell.textView.textContainer.lineFragmentPadding = 0
|
||||
cell.textView.contentInset = .zero
|
||||
cell.textView.textContainerInset = UIEdgeInsets(top: 8, left: 16, bottom: 8, right: 16)
|
||||
cell.textView.placeholder = placeholder
|
||||
cell.textView.font = .systemFont(ofSize: 17)
|
||||
cell.textView.text = row.text
|
||||
cell.textView.isEditable = true
|
||||
cell.textView.isScrollEnabled = false
|
||||
cell.textView.delegate = delegate
|
||||
cell.textView.backgroundColor = .clear
|
||||
cell.update(theme: theme)
|
||||
|
||||
return cell
|
||||
case .withSwitch(let isOn, let onValueChanged):
|
||||
let cell: MXKTableViewCellWithLabelAndSwitch = tableView.dequeueReusableCell(for: indexPath)
|
||||
cell.mxkLabel.font = .systemFont(ofSize: 17)
|
||||
cell.mxkLabel.text = row.text
|
||||
cell.mxkSwitch.isOn = isOn
|
||||
cell.mxkSwitch.removeTarget(nil, action: nil, for: .valueChanged)
|
||||
cell.mxkSwitch.vc_addAction(for: .valueChanged) {
|
||||
onValueChanged?(cell.mxkSwitch)
|
||||
}
|
||||
cell.mxkLabelLeadingConstraint.constant = cell.vc_separatorInset.left
|
||||
cell.mxkSwitchTrailingConstraint.constant = 15
|
||||
cell.update(theme: theme)
|
||||
|
||||
return cell
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// MARK: - UITableViewDelegate
|
||||
|
||||
extension EnterNewRoomDetailsViewController: UITableViewDelegate {
|
||||
|
||||
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
|
||||
cell.backgroundColor = theme.backgroundColor
|
||||
cell.selectedBackgroundView = UIView()
|
||||
cell.selectedBackgroundView?.backgroundColor = theme.selectedBackgroundColor
|
||||
}
|
||||
|
||||
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
|
||||
return sections[section].header
|
||||
}
|
||||
|
||||
func tableView(_ tableView: UITableView, titleForFooterInSection section: Int) -> String? {
|
||||
return sections[section].footer
|
||||
}
|
||||
|
||||
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
|
||||
guard let header = sections[section].header else {
|
||||
return nil
|
||||
}
|
||||
|
||||
let view: TableViewHeaderFooterView? = tableView.dequeueReusableHeaderFooterView()
|
||||
|
||||
view?.textView.text = header
|
||||
view?.textView.font = .systemFont(ofSize: 13)
|
||||
view?.textViewInsets = UIEdgeInsets(top: 16, left: 16, bottom: 8, right: 16)
|
||||
view?.update(theme: theme)
|
||||
|
||||
return view
|
||||
}
|
||||
|
||||
func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
|
||||
guard let footer = sections[section].footer else {
|
||||
return nil
|
||||
}
|
||||
|
||||
let view: TableViewHeaderFooterView? = tableView.dequeueReusableHeaderFooterView()
|
||||
|
||||
view?.textView.text = footer
|
||||
view?.textView.font = .systemFont(ofSize: 13)
|
||||
view?.update(theme: theme)
|
||||
|
||||
return view
|
||||
}
|
||||
|
||||
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
|
||||
tableView.deselectRow(at: indexPath, animated: true)
|
||||
|
||||
let row = sections[indexPath.section].rows[indexPath.row]
|
||||
row.action?()
|
||||
}
|
||||
|
||||
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
|
||||
let row = sections[indexPath.section].rows[indexPath.row]
|
||||
|
||||
switch row.type {
|
||||
case .avatar:
|
||||
return 100
|
||||
case .textView:
|
||||
return 150
|
||||
default:
|
||||
return UITableView.automaticDimension
|
||||
}
|
||||
}
|
||||
|
||||
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
|
||||
if sections[section].header == nil {
|
||||
return 18
|
||||
}
|
||||
return UITableView.automaticDimension
|
||||
}
|
||||
|
||||
func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
|
||||
if sections[section].footer == nil {
|
||||
return 18
|
||||
}
|
||||
return UITableView.automaticDimension
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// MARK: - ChooseAvatarTableViewCellDelegate
|
||||
|
||||
extension EnterNewRoomDetailsViewController: ChooseAvatarTableViewCellDelegate {
|
||||
|
||||
func chooseAvatarTableViewCellDidTapChooseAvatar(_ cell: ChooseAvatarTableViewCell, sourceView: UIView) {
|
||||
viewModel.process(viewAction: .chooseAvatar(sourceView: sourceView))
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// MARK: - EnterNewRoomDetailsViewModelViewDelegate
|
||||
|
||||
extension EnterNewRoomDetailsViewController: EnterNewRoomDetailsViewModelViewDelegate {
|
||||
|
||||
func enterNewRoomDetailsViewModel(_ viewModel: EnterNewRoomDetailsViewModelType, didUpdateViewState viewSate: EnterNewRoomDetailsViewState) {
|
||||
self.render(viewState: viewSate)
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - UITextFieldDelegate
|
||||
|
||||
extension EnterNewRoomDetailsViewController: UITextFieldDelegate {
|
||||
|
||||
func textFieldDidEndEditing(_ textField: UITextField) {
|
||||
switch textField.tag {
|
||||
case Constants.roomNameTextFieldTag:
|
||||
viewModel.roomCreationParameters.name = textField.text
|
||||
if viewModel.roomCreationParameters.userSelectedAvatar == nil {
|
||||
// if no image selected by the user, set initials as image
|
||||
let avatar = AvatarGenerator.generateAvatar(forMatrixItem: nil,
|
||||
withDisplayName: textField.text,
|
||||
size: 60,
|
||||
andFontSize: 30)
|
||||
viewModel.roomCreationParameters.initialsAvatar = avatar
|
||||
}
|
||||
case Constants.roomAddressTextFieldTag:
|
||||
viewModel.roomCreationParameters.address = textField.text
|
||||
default:
|
||||
break
|
||||
}
|
||||
|
||||
updateSections()
|
||||
}
|
||||
|
||||
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
|
||||
let text: NSString = (textField.text ?? "") as NSString
|
||||
let resultString = text.replacingCharacters(in: range, with: string)
|
||||
let resultCount = resultString.count
|
||||
|
||||
switch textField.tag {
|
||||
case Constants.roomNameTextFieldTag:
|
||||
createBarButtonItem.isEnabled = resultCount >= Constants.roomNameMinimumNumberOfChars
|
||||
let result = resultCount <= Constants.roomNameMaximumNumberOfChars
|
||||
if result {
|
||||
viewModel.roomCreationParameters.name = resultString
|
||||
}
|
||||
return result
|
||||
case Constants.roomAddressTextFieldTag:
|
||||
let result = resultCount <= Constants.roomAddressMaximumNumberOfChars
|
||||
if result {
|
||||
viewModel.roomCreationParameters.address = resultString
|
||||
}
|
||||
return result
|
||||
default:
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// MARK: - UITextViewDelegate
|
||||
|
||||
extension EnterNewRoomDetailsViewController: UITextViewDelegate {
|
||||
|
||||
func textViewDidChange(_ textView: UITextView) {
|
||||
switch textView.tag {
|
||||
case Constants.roomTopicTextViewTag:
|
||||
viewModel.roomCreationParameters.topic = textView.text
|
||||
default:
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
func textViewDidEndEditing(_ textView: UITextView) {
|
||||
switch textView.tag {
|
||||
case Constants.roomTopicTextViewTag:
|
||||
viewModel.roomCreationParameters.topic = textView.text
|
||||
default:
|
||||
break
|
||||
}
|
||||
|
||||
updateSections()
|
||||
}
|
||||
|
||||
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
|
||||
switch textView.tag {
|
||||
case Constants.roomTopicTextViewTag:
|
||||
return textView.text.count + (text.count - range.length) <= Constants.roomTopicMaximumNumberOfChars
|
||||
default:
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,174 @@
|
|||
// File created from ScreenTemplate
|
||||
// $ createScreen.sh CreateRoom/EnterNewRoomDetails EnterNewRoomDetails
|
||||
/*
|
||||
Copyright 2020 New Vector Ltd
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
import Foundation
|
||||
|
||||
final class EnterNewRoomDetailsViewModel: EnterNewRoomDetailsViewModelType {
|
||||
|
||||
// MARK: - Properties
|
||||
|
||||
// MARK: Private
|
||||
|
||||
private let session: MXSession
|
||||
private var currentOperation: MXHTTPOperation?
|
||||
|
||||
private var mediaUploader: MXMediaLoader?
|
||||
|
||||
// MARK: Public
|
||||
|
||||
weak var viewDelegate: EnterNewRoomDetailsViewModelViewDelegate?
|
||||
weak var coordinatorDelegate: EnterNewRoomDetailsViewModelCoordinatorDelegate?
|
||||
var roomCreationParameters: RoomCreationParameters = RoomCreationParameters()
|
||||
|
||||
// MARK: - Setup
|
||||
|
||||
init(session: MXSession) {
|
||||
self.session = session
|
||||
roomCreationParameters.isEncrypted = session.vc_isE2EByDefaultEnabledByHSAdmin()
|
||||
}
|
||||
|
||||
deinit {
|
||||
self.cancelOperations()
|
||||
}
|
||||
|
||||
// MARK: - Public
|
||||
|
||||
func process(viewAction: EnterNewRoomDetailsViewAction) {
|
||||
switch viewAction {
|
||||
case .loadData:
|
||||
self.loadData()
|
||||
case .chooseAvatar(let sourceView):
|
||||
self.chooseAvatar(sourceView: sourceView)
|
||||
case .cancel:
|
||||
self.cancelOperations()
|
||||
self.coordinatorDelegate?.enterNewRoomDetailsViewModelDidCancel(self)
|
||||
case .create:
|
||||
self.createRoom()
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Private
|
||||
|
||||
private func loadData() {
|
||||
update(viewState: .loaded)
|
||||
}
|
||||
|
||||
private func chooseAvatar(sourceView: UIView) {
|
||||
self.coordinatorDelegate?.enterNewRoomDetailsViewModel(self, didTapChooseAvatar: sourceView)
|
||||
}
|
||||
|
||||
private func fixRoomAlias(alias: String?) -> String? {
|
||||
guard var alias = alias else { return nil }
|
||||
|
||||
// drop prefix # from room alias
|
||||
while alias.hasPrefix("#") {
|
||||
alias = String(alias.dropFirst())
|
||||
}
|
||||
|
||||
// TODO: Fix below somehow
|
||||
alias = alias.replacingOccurrences(of: ":matrix.org", with: "")
|
||||
if let homeserver = session.credentials.homeServer {
|
||||
alias = alias.replacingOccurrences(of: ":" + homeserver, with: "")
|
||||
}
|
||||
|
||||
return alias
|
||||
}
|
||||
|
||||
private func createRoom() {
|
||||
// compose room creation parameters in Matrix level
|
||||
let parameters = MXRoomCreationParameters()
|
||||
parameters.name = roomCreationParameters.name
|
||||
parameters.topic = roomCreationParameters.topic
|
||||
parameters.roomAlias = fixRoomAlias(alias: roomCreationParameters.address)
|
||||
|
||||
if roomCreationParameters.isPublic {
|
||||
parameters.preset = kMXRoomPresetPublicChat
|
||||
if roomCreationParameters.showInDirectory {
|
||||
parameters.visibility = kMXRoomDirectoryVisibilityPublic
|
||||
} else {
|
||||
parameters.visibility = kMXRoomDirectoryVisibilityPrivate
|
||||
}
|
||||
} else {
|
||||
parameters.preset = kMXRoomPresetPrivateChat
|
||||
parameters.visibility = kMXRoomDirectoryVisibilityPrivate
|
||||
}
|
||||
|
||||
if roomCreationParameters.isEncrypted {
|
||||
parameters.initialStateEvents = [MXRoomCreationParameters.initialStateEventForEncryption(withAlgorithm: kMXCryptoMegolmAlgorithm)]
|
||||
}
|
||||
|
||||
update(viewState: .loading)
|
||||
|
||||
currentOperation = session.createRoom(parameters: parameters) { (response) in
|
||||
switch response {
|
||||
case .success(let room):
|
||||
self.uploadAvatarIfRequired(ofRoom: room)
|
||||
self.currentOperation = nil
|
||||
case .failure(let error):
|
||||
self.update(viewState: .error(error))
|
||||
self.currentOperation = nil
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private func uploadAvatarIfRequired(ofRoom room: MXRoom) {
|
||||
guard let avatar = roomCreationParameters.userSelectedAvatar else {
|
||||
// no avatar set, continue
|
||||
self.coordinatorDelegate?.enterNewRoomDetailsViewModel(self, didCreateNewRoom: room)
|
||||
return
|
||||
}
|
||||
|
||||
let avatarUp = MXKTools.forceImageOrientationUp(avatar)
|
||||
|
||||
mediaUploader = MXMediaManager.prepareUploader(withMatrixSession: session, initialRange: 0, andRange: 1.0)
|
||||
mediaUploader?.uploadData(avatarUp?.jpegData(compressionQuality: 0.5),
|
||||
filename: nil,
|
||||
mimeType: "image/jpeg",
|
||||
success: { [weak self] (urlString) in
|
||||
guard let self = self else { return }
|
||||
guard let urlString = urlString else { return }
|
||||
guard let url = URL(string: urlString) else { return }
|
||||
self.setAvatar(ofRoom: room, withURL: url)
|
||||
}, failure: { [weak self] (error) in
|
||||
guard let self = self else { return }
|
||||
guard let error = error else { return }
|
||||
self.update(viewState: .error(error))
|
||||
})
|
||||
}
|
||||
|
||||
private func setAvatar(ofRoom room: MXRoom, withURL url: URL) {
|
||||
currentOperation = room.setAvatar(url: url) { (response) in
|
||||
switch response {
|
||||
case .success:
|
||||
self.coordinatorDelegate?.enterNewRoomDetailsViewModel(self, didCreateNewRoom: room)
|
||||
self.currentOperation = nil
|
||||
case .failure(let error):
|
||||
self.update(viewState: .error(error))
|
||||
self.currentOperation = nil
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private func update(viewState: EnterNewRoomDetailsViewState) {
|
||||
self.viewDelegate?.enterNewRoomDetailsViewModel(self, didUpdateViewState: viewState)
|
||||
}
|
||||
|
||||
private func cancelOperations() {
|
||||
self.currentOperation?.cancel()
|
||||
}
|
||||
}
|
|
@ -0,0 +1,40 @@
|
|||
// File created from ScreenTemplate
|
||||
// $ createScreen.sh CreateRoom/EnterNewRoomDetails EnterNewRoomDetails
|
||||
/*
|
||||
Copyright 2020 New Vector Ltd
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
import Foundation
|
||||
|
||||
protocol EnterNewRoomDetailsViewModelViewDelegate: class {
|
||||
func enterNewRoomDetailsViewModel(_ viewModel: EnterNewRoomDetailsViewModelType, didUpdateViewState viewSate: EnterNewRoomDetailsViewState)
|
||||
}
|
||||
|
||||
protocol EnterNewRoomDetailsViewModelCoordinatorDelegate: class {
|
||||
func enterNewRoomDetailsViewModel(_ viewModel: EnterNewRoomDetailsViewModelType, didCreateNewRoom room: MXRoom)
|
||||
func enterNewRoomDetailsViewModel(_ viewModel: EnterNewRoomDetailsViewModelType, didTapChooseAvatar sourceView: UIView)
|
||||
func enterNewRoomDetailsViewModelDidCancel(_ viewModel: EnterNewRoomDetailsViewModelType)
|
||||
}
|
||||
|
||||
/// Protocol describing the view model used by `EnterNewRoomDetailsViewController`
|
||||
protocol EnterNewRoomDetailsViewModelType {
|
||||
|
||||
var viewDelegate: EnterNewRoomDetailsViewModelViewDelegate? { get set }
|
||||
var coordinatorDelegate: EnterNewRoomDetailsViewModelCoordinatorDelegate? { get set }
|
||||
|
||||
func process(viewAction: EnterNewRoomDetailsViewAction)
|
||||
|
||||
var roomCreationParameters: RoomCreationParameters { get set }
|
||||
}
|
|
@ -0,0 +1,26 @@
|
|||
// File created from ScreenTemplate
|
||||
// $ createScreen.sh CreateRoom/EnterNewRoomDetails EnterNewRoomDetails
|
||||
/*
|
||||
Copyright 2020 New Vector Ltd
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
import Foundation
|
||||
|
||||
/// EnterNewRoomDetailsViewController view state
|
||||
enum EnterNewRoomDetailsViewState {
|
||||
case loading
|
||||
case loaded
|
||||
case error(Error)
|
||||
}
|
40
Riot/Modules/CreateRoom/Models/RoomCreationParameters.swift
Normal file
40
Riot/Modules/CreateRoom/Models/RoomCreationParameters.swift
Normal file
|
@ -0,0 +1,40 @@
|
|||
//
|
||||
// Copyright 2020 New Vector Ltd
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
struct RoomCreationParameters {
|
||||
var name: String?
|
||||
var topic: String?
|
||||
var address: String?
|
||||
var avatarImage: UIImage? {
|
||||
return userSelectedAvatar ?? initialsAvatar
|
||||
}
|
||||
var isEncrypted: Bool = false
|
||||
var isPublic: Bool = false {
|
||||
didSet {
|
||||
if !isPublic {
|
||||
// if set to private again, reset some fields
|
||||
showInDirectory = false
|
||||
address = nil
|
||||
}
|
||||
}
|
||||
}
|
||||
var showInDirectory: Bool = false
|
||||
|
||||
var userSelectedAvatar: UIImage?
|
||||
var initialsAvatar: UIImage?
|
||||
}
|
|
@ -59,7 +59,9 @@ final class RoomsDirectoryCoordinatorBridgePresenter: NSObject {
|
|||
func present(from viewController: UIViewController, animated: Bool) {
|
||||
let roomsDirectoryCoordinator = RoomsDirectoryCoordinator(session: self.session, dataSource: dataSource)
|
||||
roomsDirectoryCoordinator.delegate = self
|
||||
viewController.present(roomsDirectoryCoordinator.toPresentable(), animated: animated, completion: nil)
|
||||
let presentable = roomsDirectoryCoordinator.toPresentable()
|
||||
presentable.presentationController?.delegate = self
|
||||
viewController.present(presentable, animated: animated, completion: nil)
|
||||
roomsDirectoryCoordinator.start()
|
||||
|
||||
self.coordinator = roomsDirectoryCoordinator
|
||||
|
@ -95,3 +97,13 @@ extension RoomsDirectoryCoordinatorBridgePresenter: RoomsDirectoryCoordinatorDel
|
|||
}
|
||||
|
||||
}
|
||||
|
||||
// MARK: - UIAdaptivePresentationControllerDelegate
|
||||
|
||||
extension RoomsDirectoryCoordinatorBridgePresenter: UIAdaptivePresentationControllerDelegate {
|
||||
|
||||
func presentationControllerDidDismiss(_ presentationController: UIPresentationController) {
|
||||
self.delegate?.roomsDirectoryCoordinatorBridgePresenterDelegateDidComplete(self)
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -370,7 +370,7 @@
|
|||
- (void)roomsDirectoryCoordinatorBridgePresenterDelegateDidTapCreateNewRoom:(RoomsDirectoryCoordinatorBridgePresenter *)coordinatorBridgePresenter
|
||||
{
|
||||
[coordinatorBridgePresenter dismissWithAnimated:YES completion:^{
|
||||
[self createAnEmptyRoom];
|
||||
[self createNewRoom];
|
||||
}];
|
||||
self.roomsDirectoryCoordinatorBridgePresenter = nil;
|
||||
}
|
||||
|
|
|
@ -21,3 +21,4 @@
|
|||
#import "RoomEncryptedDataBubbleCell.h"
|
||||
#import "LegacyAppDelegate.h"
|
||||
#import "DirectoryServerPickerViewController.h"
|
||||
#import "MXSession+Riot.h"
|
||||
|
|
Loading…
Reference in a new issue