Merge branch 'develop' into element_3629

This commit is contained in:
ismailgulek 2020-09-14 14:27:24 +03:00
commit 4f6109e604
43 changed files with 2352 additions and 180 deletions

View file

@ -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;
};

View 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
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 377 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 573 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 862 B

View file

@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

View 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
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4 KiB

View file

@ -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 cant 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";

View 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
}
}

View 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
}
}

View file

@ -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")

View file

@ -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"

View file

@ -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 cant 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")

View 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
}
}

View 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>

View 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
}
}

View 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>

View file

@ -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.

View file

@ -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

View file

@ -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)
}()
}
}

View 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)
}
}

View 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
}
}

View 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)
}
}

View file

@ -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)
}
}

View 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 }
}

View file

@ -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
}
}

View file

@ -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>

View file

@ -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?
}

View file

@ -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)
}
}

View file

@ -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 }
}

View file

@ -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
}

View file

@ -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>

View file

@ -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
}
}
}

View file

@ -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()
}
}

View file

@ -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 }
}

View file

@ -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)
}

View 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?
}

View file

@ -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)
}
}

View file

@ -370,7 +370,7 @@
- (void)roomsDirectoryCoordinatorBridgePresenterDelegateDidTapCreateNewRoom:(RoomsDirectoryCoordinatorBridgePresenter *)coordinatorBridgePresenter
{
[coordinatorBridgePresenter dismissWithAnimated:YES completion:^{
[self createAnEmptyRoom];
[self createNewRoom];
}];
self.roomsDirectoryCoordinatorBridgePresenter = nil;
}

View file

@ -21,3 +21,4 @@
#import "RoomEncryptedDataBubbleCell.h"
#import "LegacyAppDelegate.h"
#import "DirectoryServerPickerViewController.h"
#import "MXSession+Riot.h"