From 131fcbcedd5a68355fa605773398752f7810f3b5 Mon Sep 17 00:00:00 2001 From: Anton Schukin Date: Thu, 4 Jan 2018 14:26:53 +0300 Subject: [PATCH 01/12] Added accessibility identifier to selection indicator --- .../Views/BaseMessageCollectionViewCell.swift | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/ChattoAdditions/Source/Chat Items/BaseMessage/Views/BaseMessageCollectionViewCell.swift b/ChattoAdditions/Source/Chat Items/BaseMessage/Views/BaseMessageCollectionViewCell.swift index 76cd4f9d7..6318343de 100644 --- a/ChattoAdditions/Source/Chat Items/BaseMessage/Views/BaseMessageCollectionViewCell.swift +++ b/ChattoAdditions/Source/Chat Items/BaseMessage/Views/BaseMessageCollectionViewCell.swift @@ -344,6 +344,7 @@ open class BaseMessageCollectionViewCell: UICollectionViewCell, private func updateSelectionIndicator(with style: BaseMessageCollectionViewCellStyleProtocol) { self.selectionIndicator.image = style.selectionIndicatorIcon(for: self.messageViewModel) + self.updateSelectionIndicatorAccessibilityIdentifier() } private var selectionTapGestureRecognizer: UITapGestureRecognizer? @@ -354,6 +355,20 @@ open class BaseMessageCollectionViewCell: UICollectionViewCell, self.onSelection?(self) } + private func updateSelectionIndicatorAccessibilityIdentifier() { + let accessibilityIdentifier: String + if self.messageViewModel.decorationAttributes.isShowingSelectionIndicator { + if self.messageViewModel.decorationAttributes.isSelected { + accessibilityIdentifier = "chat.message.selection_indicator.selected" + } else { + accessibilityIdentifier = "chat.message.selection_indicator.deselected" + } + } else { + accessibilityIdentifier = "chat.message.selection_indicator.hidden" + } + self.selectionIndicator.accessibilityIdentifier = accessibilityIdentifier + } + // MARK: User interaction public var onFailedButtonTapped: ((_ cell: BaseMessageCollectionViewCell) -> Void)? From c3175fea794ea63555425ea7bb0d688eba597f3a Mon Sep 17 00:00:00 2001 From: Alexandr Nikishin Date: Wed, 10 Jan 2018 13:13:16 +0000 Subject: [PATCH 02/12] Fix crash on access full image request when the number of photos is less than number of placeholders. --- ...tosInputWithPlaceholdersDataProvider.swift | 6 +++- ...putWithPlaceholdersDataProviderTests.swift | 36 +++++++++++++++++-- 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/ChattoAdditions/Source/Input/Photos/PhotosInputWithPlaceholdersDataProvider.swift b/ChattoAdditions/Source/Input/Photos/PhotosInputWithPlaceholdersDataProvider.swift index 277c5558c..cc3a2bb72 100644 --- a/ChattoAdditions/Source/Input/Photos/PhotosInputWithPlaceholdersDataProvider.swift +++ b/ChattoAdditions/Source/Input/Photos/PhotosInputWithPlaceholdersDataProvider.swift @@ -102,7 +102,11 @@ final class PhotosInputWithPlaceholdersDataProvider: PhotosInputDataProviderProt } func fullImageRequest(at index: Int) -> PhotosInputDataProviderImageRequestProtocol? { - return self.photosDataProvider.fullImageRequest(at: index) + if index < self.photosDataProvider.count { + return self.photosDataProvider.fullImageRequest(at: index) + } else { + return self.placeholdersDataProvider.fullImageRequest(at: index) + } } // MARK: PhotosInputDataProviderDelegate diff --git a/ChattoAdditions/Tests/Input/PhotosInputWithPlaceholdersDataProviderTests.swift b/ChattoAdditions/Tests/Input/PhotosInputWithPlaceholdersDataProviderTests.swift index ab371bba0..443a93f15 100644 --- a/ChattoAdditions/Tests/Input/PhotosInputWithPlaceholdersDataProviderTests.swift +++ b/ChattoAdditions/Tests/Input/PhotosInputWithPlaceholdersDataProviderTests.swift @@ -169,9 +169,39 @@ class PhotosInputWithPlaceholderDataProviderTests: XCTestCase { XCTAssertTrue(placeholderProviderRequested) } - func testThat_WhenRequestExistedFullImageRequest_ThenOnlyPhotoProviderReceivesCall() { + func testThat_GivenProviderWithNumberOfPlaceholdersGreaterThenNumberOfPhotos_WhenRequestExistedFullImageRequestAtIndexGreatThenNumberOfPhotos_ThenPlaceholderProviderReceivesCall() { let existedRequest = FakePhotosInputDataProviderImageRequest() - let indexToRequest = 1 + let numberOfPlaceholders = 10 + let numberOfPhotos = 1 + let indexToRequest = 5 + self.fakePlaceholderProvider.count = numberOfPlaceholders + self.fakePhotosProvider.count = numberOfPhotos + var photoProviderRequested = false + var placeholderProviderRequested = false + self.fakePhotosProvider.onFullImageRequest = { index in + photoProviderRequested = true + XCTAssertTrue(index == indexToRequest) + return nil + } + self.fakePlaceholderProvider.onFullImageRequest = { _ in + placeholderProviderRequested = true + return existedRequest + } + // When + let request = self.sut.fullImageRequest(at: indexToRequest) + // Then + XCTAssertTrue(request === existedRequest) + XCTAssertFalse(photoProviderRequested) + XCTAssertTrue(placeholderProviderRequested) + } + + func testThat_GivenProviderWithNumberOfPlaceholdersGreaterThenNumberOfPhotos_WhenRequestExistedFullImageRequestAtIndexLessThenNumberOfPhotos_ThenPhotosProviderReceivesCall() { + let existedRequest = FakePhotosInputDataProviderImageRequest() + let numberOfPlaceholders = 10 + let numberOfPhotos = 5 + let indexToRequest = 3 + self.fakePlaceholderProvider.count = numberOfPlaceholders + self.fakePhotosProvider.count = numberOfPhotos var photoProviderRequested = false var placeholderProviderRequested = false self.fakePhotosProvider.onFullImageRequest = { index in @@ -181,7 +211,7 @@ class PhotosInputWithPlaceholderDataProviderTests: XCTestCase { } self.fakePlaceholderProvider.onFullImageRequest = { _ in placeholderProviderRequested = true - return FakePhotosInputDataProviderImageRequest() + return nil } // When let request = self.sut.fullImageRequest(at: indexToRequest) From b56cb4b4c152d841835fe53bf197606985ccecb0 Mon Sep 17 00:00:00 2001 From: Alexander Zimin Date: Thu, 8 Feb 2018 17:07:44 +0000 Subject: [PATCH 03/12] Made UIScrollView delegates open in BaseChatViewController for future overriding --- .../ChatController/BaseChatViewController+Scrolling.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Chatto/Source/ChatController/BaseChatViewController+Scrolling.swift b/Chatto/Source/ChatController/BaseChatViewController+Scrolling.swift index d1c70b2c6..ca4155d5d 100644 --- a/Chatto/Source/ChatController/BaseChatViewController+Scrolling.swift +++ b/Chatto/Source/ChatController/BaseChatViewController+Scrolling.swift @@ -106,13 +106,13 @@ extension BaseChatViewController { self.collectionView.contentOffset = CGPoint(x: 0, y: self.collectionView.contentOffset.y + diffY) } - public func scrollViewDidScroll(_ scrollView: UIScrollView) { + open func scrollViewDidScroll(_ scrollView: UIScrollView) { if self.collectionView.isDragging { self.autoLoadMoreContentIfNeeded() } } - public func scrollViewDidScrollToTop(_ scrollView: UIScrollView) { + open func scrollViewDidScrollToTop(_ scrollView: UIScrollView) { self.autoLoadMoreContentIfNeeded() } From 36b64dbb2d26ac56a908074667a1cddb690d0da6 Mon Sep 17 00:00:00 2001 From: Valerii Chevtaev Date: Wed, 14 Feb 2018 18:23:49 +0000 Subject: [PATCH 04/12] Expose keyboard position handling function to outside world. --- .../ChatController/BaseChatViewController.swift | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/Chatto/Source/ChatController/BaseChatViewController.swift b/Chatto/Source/ChatController/BaseChatViewController.swift index 94f297d64..4a0315620 100644 --- a/Chatto/Source/ChatController/BaseChatViewController.swift +++ b/Chatto/Source/ChatController/BaseChatViewController.swift @@ -187,10 +187,7 @@ open class BaseChatViewController: UIViewController, UICollectionViewDataSource, open func setupKeyboardTracker() { let layoutBlock = { [weak self] (bottomMargin: CGFloat) in guard let sSelf = self else { return } - sSelf.isAdjustingInputContainer = true - sSelf.inputContainerBottomConstraint.constant = max(bottomMargin, sSelf.bottomLayoutGuide.length) - sSelf.view.layoutIfNeeded() - sSelf.isAdjustingInputContainer = false + sSelf.handleKeyboardPositionChange(bottomMargin: bottomMargin) } self.keyboardTracker = KeyboardTracker(viewController: self, inputContainer: self.inputContainer, layoutBlock: layoutBlock, notificationCenter: self.notificationCenter) @@ -198,6 +195,13 @@ open class BaseChatViewController: UIViewController, UICollectionViewDataSource, } + open func handleKeyboardPositionChange(bottomMargin: CGFloat) { + self.isAdjustingInputContainer = true + self.inputContainerBottomConstraint.constant = max(bottomMargin, self.bottomLayoutGuide.length) + self.view.layoutIfNeeded() + self.isAdjustingInputContainer = false + } + var notificationCenter = NotificationCenter.default var keyboardTracker: KeyboardTracker! From b46f86b57de5b32291ed91685747e305015ecb41 Mon Sep 17 00:00:00 2001 From: Alexander Zimin Date: Fri, 16 Feb 2018 14:05:51 +0000 Subject: [PATCH 05/12] Added button space view that fill safe area bottom space till input view --- .../BaseChatViewController.swift | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/Chatto/Source/ChatController/BaseChatViewController.swift b/Chatto/Source/ChatController/BaseChatViewController.swift index 4a0315620..2dcbf1b80 100644 --- a/Chatto/Source/ChatController/BaseChatViewController.swift +++ b/Chatto/Source/ChatController/BaseChatViewController.swift @@ -90,6 +90,7 @@ open class BaseChatViewController: UIViewController, UICollectionViewDataSource, super.viewDidLoad() self.addCollectionView() self.addInputViews() + self.addBottomSpaceView() self.setupKeyboardTracker() self.setupTapGestureRecognizer() } @@ -165,6 +166,21 @@ open class BaseChatViewController: UIViewController, UICollectionViewDataSource, self.inputContainer.addConstraint(NSLayoutConstraint(item: self.inputContainer, attribute: .bottom, relatedBy: .equal, toItem: inputView, attribute: .bottom, multiplier: 1, constant: 0)) self.inputContainer.addConstraint(NSLayoutConstraint(item: self.inputContainer, attribute: .trailing, relatedBy: .equal, toItem: inputView, attribute: .trailing, multiplier: 1, constant: 0)) } + + private var bottomSpaceViewHeightConstraint: NSLayoutConstraint! + private func addBottomSpaceView() { + self.bottomSpaceView = UIView(frame: CGRect.zero) + self.bottomSpaceView.autoresizingMask = UIViewAutoresizing() + self.bottomSpaceView.translatesAutoresizingMaskIntoConstraints = false + self.bottomSpaceView.backgroundColor = UIColor.white + self.view.addSubview(self.bottomSpaceView) + self.view.addConstraint(NSLayoutConstraint(item: self.bottomSpaceView, attribute: .top, relatedBy: .greaterThanOrEqual, toItem: self.inputContainer, attribute: .bottom, multiplier: 1, constant: 0)) + self.view.addConstraint(NSLayoutConstraint(item: self.view, attribute: .leading, relatedBy: .equal, toItem: self.bottomSpaceView, attribute: .leading, multiplier: 1, constant: 0)) + self.view.addConstraint(NSLayoutConstraint(item: self.view, attribute: .trailing, relatedBy: .equal, toItem: self.bottomSpaceView, attribute: .trailing, multiplier: 1, constant: 0)) + self.bottomSpaceViewHeightConstraint = NSLayoutConstraint(item: self.bottomSpaceView, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: 0) + self.view.addConstraint(self.bottomSpaceViewHeightConstraint) + } + private func setupInputContainerBottomConstraint() { // If we have been pushed on nav controller and hidesBottomBarWhenPushed = true, then ignore bottomLayoutMargin // because it has incorrect value when we actually have a bottom bar (tabbar) @@ -178,8 +194,10 @@ open class BaseChatViewController: UIViewController, UICollectionViewDataSource, if navigatedController.hidesBottomBarWhenPushed && (navigationController?.viewControllers.count ?? 0) > 1 && navigationController?.viewControllers.last == navigatedController { self.inputContainerBottomConstraint.constant = 0 + self.bottomSpaceViewHeightConstraint.constant = 0 } else { self.inputContainerBottomConstraint.constant = self.bottomLayoutGuide.length + self.bottomSpaceViewHeightConstraint.constant = self.bottomLayoutGuide.length } } @@ -197,7 +215,9 @@ open class BaseChatViewController: UIViewController, UICollectionViewDataSource, open func handleKeyboardPositionChange(bottomMargin: CGFloat) { self.isAdjustingInputContainer = true - self.inputContainerBottomConstraint.constant = max(bottomMargin, self.bottomLayoutGuide.length) + let value = max(bottomMargin, self.bottomLayoutGuide.length) + self.inputContainerBottomConstraint.constant = value + self.bottomSpaceViewHeightConstraint.constant = value self.view.layoutIfNeeded() self.isAdjustingInputContainer = false } @@ -275,6 +295,7 @@ open class BaseChatViewController: UIViewController, UICollectionViewDataSource, var autoLoadingEnabled: Bool = false var accessoryViewRevealer: AccessoryViewRevealer! public private(set) var inputContainer: UIView! + public private(set) var bottomSpaceView: UIView! var presenterFactory: ChatItemPresenterFactoryProtocol! let presentersByCell = NSMapTable(keyOptions: .weakMemory, valueOptions: .weakMemory) var visibleCells: [IndexPath: UICollectionViewCell] = [:] // @see visibleCellsAreValid(changes:) From df848527c78902628579945de63e3f8db2678616 Mon Sep 17 00:00:00 2001 From: Alexander Zimin Date: Fri, 16 Feb 2018 14:41:06 +0000 Subject: [PATCH 06/12] Simplified code --- Chatto/Source/ChatController/BaseChatViewController.swift | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Chatto/Source/ChatController/BaseChatViewController.swift b/Chatto/Source/ChatController/BaseChatViewController.swift index 2dcbf1b80..227cc6c7d 100644 --- a/Chatto/Source/ChatController/BaseChatViewController.swift +++ b/Chatto/Source/ChatController/BaseChatViewController.swift @@ -177,8 +177,7 @@ open class BaseChatViewController: UIViewController, UICollectionViewDataSource, self.view.addConstraint(NSLayoutConstraint(item: self.bottomSpaceView, attribute: .top, relatedBy: .greaterThanOrEqual, toItem: self.inputContainer, attribute: .bottom, multiplier: 1, constant: 0)) self.view.addConstraint(NSLayoutConstraint(item: self.view, attribute: .leading, relatedBy: .equal, toItem: self.bottomSpaceView, attribute: .leading, multiplier: 1, constant: 0)) self.view.addConstraint(NSLayoutConstraint(item: self.view, attribute: .trailing, relatedBy: .equal, toItem: self.bottomSpaceView, attribute: .trailing, multiplier: 1, constant: 0)) - self.bottomSpaceViewHeightConstraint = NSLayoutConstraint(item: self.bottomSpaceView, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: 0) - self.view.addConstraint(self.bottomSpaceViewHeightConstraint) + self.view.addConstraint(NSLayoutConstraint(item: self.view, attribute: .bottom, relatedBy: .equal, toItem: self.bottomSpaceView, attribute: .bottom, multiplier: 1, constant: 0)) } private func setupInputContainerBottomConstraint() { @@ -194,10 +193,8 @@ open class BaseChatViewController: UIViewController, UICollectionViewDataSource, if navigatedController.hidesBottomBarWhenPushed && (navigationController?.viewControllers.count ?? 0) > 1 && navigationController?.viewControllers.last == navigatedController { self.inputContainerBottomConstraint.constant = 0 - self.bottomSpaceViewHeightConstraint.constant = 0 } else { self.inputContainerBottomConstraint.constant = self.bottomLayoutGuide.length - self.bottomSpaceViewHeightConstraint.constant = self.bottomLayoutGuide.length } } @@ -217,7 +214,6 @@ open class BaseChatViewController: UIViewController, UICollectionViewDataSource, self.isAdjustingInputContainer = true let value = max(bottomMargin, self.bottomLayoutGuide.length) self.inputContainerBottomConstraint.constant = value - self.bottomSpaceViewHeightConstraint.constant = value self.view.layoutIfNeeded() self.isAdjustingInputContainer = false } From a8ad4f853f657cc25646abdc52582c31c1460745 Mon Sep 17 00:00:00 2001 From: Alexander Zimin Date: Fri, 16 Feb 2018 14:57:48 +0000 Subject: [PATCH 07/12] Reverted value property --- Chatto/Source/ChatController/BaseChatViewController.swift | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Chatto/Source/ChatController/BaseChatViewController.swift b/Chatto/Source/ChatController/BaseChatViewController.swift index 227cc6c7d..f161c05bc 100644 --- a/Chatto/Source/ChatController/BaseChatViewController.swift +++ b/Chatto/Source/ChatController/BaseChatViewController.swift @@ -212,8 +212,7 @@ open class BaseChatViewController: UIViewController, UICollectionViewDataSource, open func handleKeyboardPositionChange(bottomMargin: CGFloat) { self.isAdjustingInputContainer = true - let value = max(bottomMargin, self.bottomLayoutGuide.length) - self.inputContainerBottomConstraint.constant = value + self.inputContainerBottomConstraint.constant = max(bottomMargin, self.bottomLayoutGuide.length) self.view.layoutIfNeeded() self.isAdjustingInputContainer = false } From 23c0ab3c5593e932e966f69147ac22803367f6ee Mon Sep 17 00:00:00 2001 From: Alexander Zimin Date: Fri, 16 Feb 2018 15:01:28 +0000 Subject: [PATCH 08/12] Removed unused constraint --- Chatto/Source/ChatController/BaseChatViewController.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/Chatto/Source/ChatController/BaseChatViewController.swift b/Chatto/Source/ChatController/BaseChatViewController.swift index f161c05bc..2796ee614 100644 --- a/Chatto/Source/ChatController/BaseChatViewController.swift +++ b/Chatto/Source/ChatController/BaseChatViewController.swift @@ -167,7 +167,6 @@ open class BaseChatViewController: UIViewController, UICollectionViewDataSource, self.inputContainer.addConstraint(NSLayoutConstraint(item: self.inputContainer, attribute: .trailing, relatedBy: .equal, toItem: inputView, attribute: .trailing, multiplier: 1, constant: 0)) } - private var bottomSpaceViewHeightConstraint: NSLayoutConstraint! private func addBottomSpaceView() { self.bottomSpaceView = UIView(frame: CGRect.zero) self.bottomSpaceView.autoresizingMask = UIViewAutoresizing() From 0628fffd1c871b8374aa4862eb21d14f5e5c9532 Mon Sep 17 00:00:00 2001 From: geegaset Date: Fri, 16 Feb 2018 16:56:28 +0000 Subject: [PATCH 09/12] IOS-15249 (#442) * pod update * Simulator / Device Image Pickers * image extension * project file updated * image picker naming simplified * green is the color --- .../ChattoAdditions.xcodeproj/project.pbxproj | 12 + .../Source/Input/ChatInputBar.swift | 6 +- .../Photos/Camera/DeviceImagePicker.swift | 56 + .../Input/Photos/Camera/ImagePicker.swift | 48 + .../Camera/PhotosInputCameraPicker.swift | 53 +- .../Photos/Camera/SimulatorImagePicker.swift | 88 + ChattoApp/ChattoApp.xcodeproj/project.pbxproj | 20 +- ChattoApp/Podfile.lock | 6 +- ChattoApp/Pods/Manifest.lock | 6 +- ChattoApp/Pods/Pods.xcodeproj/project.pbxproj | 1567 ++++++++--------- .../xcschemes/ChattoAdditions.xcscheme | 2 +- .../Chatto/Chatto.xcconfig | 6 +- .../ChattoAdditions/ChattoAdditions.xcconfig | 8 +- .../Pods-ChattoApp-frameworks.sh | 67 +- .../Pods-ChattoApp-resources.sh | 25 +- .../Pods-ChattoApp.debug.xcconfig | 9 +- .../Pods-ChattoApp.release.xcconfig | 9 +- 17 files changed, 1115 insertions(+), 873 deletions(-) create mode 100644 ChattoAdditions/Source/Input/Photos/Camera/DeviceImagePicker.swift create mode 100644 ChattoAdditions/Source/Input/Photos/Camera/ImagePicker.swift create mode 100644 ChattoAdditions/Source/Input/Photos/Camera/SimulatorImagePicker.swift diff --git a/ChattoAdditions/ChattoAdditions.xcodeproj/project.pbxproj b/ChattoAdditions/ChattoAdditions.xcodeproj/project.pbxproj index 6a0b94761..89b786b6f 100644 --- a/ChattoAdditions/ChattoAdditions.xcodeproj/project.pbxproj +++ b/ChattoAdditions/ChattoAdditions.xcodeproj/project.pbxproj @@ -7,6 +7,8 @@ objects = { /* Begin PBXBuildFile section */ + 0B44651620347C11001ED5F1 /* DeviceImagePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B44651420347C11001ED5F1 /* DeviceImagePicker.swift */; }; + 0B44651720347C11001ED5F1 /* SimulatorImagePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B44651520347C11001ED5F1 /* SimulatorImagePicker.swift */; }; 3907DBAF27F9A201978EDDC1 /* BaseMessageCollectionViewCellDefaultStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3907D74597451AA0F6DAE924 /* BaseMessageCollectionViewCellDefaultStyle.swift */; }; 55ABA5541FC739C300923302 /* Alignment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55ABA5531FC739C300923302 /* Alignment.swift */; }; 55ABA5561FC73A3C00923302 /* CGSize+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55ABA5551FC73A3C00923302 /* CGSize+Additions.swift */; }; @@ -93,6 +95,7 @@ C3C9BC8F1D11540D00F3A54E /* TabInputButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3C9BC8E1D11540D00F3A54E /* TabInputButton.swift */; }; C3EFA6B01C03607A0063CE22 /* BaseMessagePresenterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3EFA6AF1C03607A0063CE22 /* BaseMessagePresenterTests.swift */; }; CA073E791C47F5B9009D5EBF /* Chatto.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA073E781C47F5B9009D5EBF /* Chatto.framework */; }; + CD24064D62EE4023542B905D /* ImagePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD240FA7D32306EC2284C287 /* ImagePicker.swift */; }; CDC60FFD1FD7259200C2588E /* PhotosInputPlaceholderCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDC60FFC1FD7259200C2588E /* PhotosInputPlaceholderCell.swift */; }; CDC60FFE1FD727A200C2588E /* ChatItemDecorationAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3C0CBE01BFE496A0052747C /* ChatItemDecorationAttributes.swift */; }; CDC610041FD80BB900C2588E /* PhotosInputPlaceholderCellProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDC610031FD80BB900C2588E /* PhotosInputPlaceholderCellProvider.swift */; }; @@ -115,6 +118,8 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 0B44651420347C11001ED5F1 /* DeviceImagePicker.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DeviceImagePicker.swift; sourceTree = ""; }; + 0B44651520347C11001ED5F1 /* SimulatorImagePicker.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SimulatorImagePicker.swift; sourceTree = ""; }; 3907D74597451AA0F6DAE924 /* BaseMessageCollectionViewCellDefaultStyle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BaseMessageCollectionViewCellDefaultStyle.swift; sourceTree = ""; }; 55ABA5531FC739C300923302 /* Alignment.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Alignment.swift; sourceTree = ""; }; 55ABA5551FC73A3C00923302 /* CGSize+Additions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CGSize+Additions.swift"; sourceTree = ""; }; @@ -205,6 +210,7 @@ C3C9BC8E1D11540D00F3A54E /* TabInputButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TabInputButton.swift; sourceTree = ""; }; C3EFA6AF1C03607A0063CE22 /* BaseMessagePresenterTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BaseMessagePresenterTests.swift; sourceTree = ""; }; CA073E781C47F5B9009D5EBF /* Chatto.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Chatto.framework; path = "../../../../Library/Developer/Xcode/DerivedData/Chatto-gyrilfusfbpmohajjvmmctphuabr/Build/Products/Debug-iphoneos/Chatto.framework"; sourceTree = ""; }; + CD240FA7D32306EC2284C287 /* ImagePicker.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImagePicker.swift; sourceTree = ""; }; CDC60FFC1FD7259200C2588E /* PhotosInputPlaceholderCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhotosInputPlaceholderCell.swift; sourceTree = ""; }; CDC610031FD80BB900C2588E /* PhotosInputPlaceholderCellProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhotosInputPlaceholderCellProvider.swift; sourceTree = ""; }; CDC610051FD80C2B00C2588E /* PhotosInputPlaceholderDataProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhotosInputPlaceholderDataProvider.swift; sourceTree = ""; }; @@ -519,10 +525,13 @@ CDC610001FD80B4200C2588E /* Camera */ = { isa = PBXGroup; children = ( + 0B44651420347C11001ED5F1 /* DeviceImagePicker.swift */, + 0B44651520347C11001ED5F1 /* SimulatorImagePicker.swift */, C33DEA461D23F8C8002AAD26 /* LiveCameraCaptureSession.swift */, C3C0CC0D1BFE496A0052747C /* LiveCameraCell.swift */, C33DEA441D23F825002AAD26 /* LiveCameraCellPresenter.swift */, C3C0CC101BFE496A0052747C /* PhotosInputCameraPicker.swift */, + CD240FA7D32306EC2284C287 /* ImagePicker.swift */, ); path = Camera; sourceTree = ""; @@ -729,6 +738,7 @@ C3C0CC551BFE496A0052747C /* ExpandableTextView.swift in Sources */, C33DEA451D23F825002AAD26 /* LiveCameraCellPresenter.swift in Sources */, C3C0CC6B1BFE496A0052747C /* CircleProgressView.m in Sources */, + 0B44651720347C11001ED5F1 /* SimulatorImagePicker.swift in Sources */, 55ABA56D1FC74D0400923302 /* UIImage+Additions.swift in Sources */, C3C0CC371BFE496A0052747C /* PhotoMessageViewModel.swift in Sources */, C3C0CC5B1BFE496A0052747C /* PhotosInputCell.swift in Sources */, @@ -740,7 +750,9 @@ C3C0CC301BFE496A0052747C /* ViewDefinitions.swift in Sources */, C3C0CC531BFE496A0052747C /* ChatInputItem.swift in Sources */, C3C0CC421BFE496A0052747C /* TextMessageCollectionViewCell.swift in Sources */, + 0B44651620347C11001ED5F1 /* DeviceImagePicker.swift in Sources */, 3907DBAF27F9A201978EDDC1 /* BaseMessageCollectionViewCellDefaultStyle.swift in Sources */, + CD24064D62EE4023542B905D /* ImagePicker.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/ChattoAdditions/Source/Input/ChatInputBar.swift b/ChattoAdditions/Source/Input/ChatInputBar.swift index 1365d7883..a8c62d132 100644 --- a/ChattoAdditions/Source/Input/ChatInputBar.swift +++ b/ChattoAdditions/Source/Input/ChatInputBar.swift @@ -276,9 +276,9 @@ extension ChatInputBar: UITextViewDelegate { public func textView(_ textView: UITextView, shouldChangeTextIn nsRange: NSRange, replacementText text: String) -> Bool { let range = self.textView.text.bma_rangeFromNSRange(nsRange) if let maxCharactersCount = self.maxCharactersCount { - let currentCount = textView.text.characters.count - let rangeLength = textView.text.substring(with: range).characters.count - let nextCount = currentCount - rangeLength + text.characters.count + let currentCount = textView.text.count + let rangeLength = textView.text.substring(with: range).count + let nextCount = currentCount - rangeLength + text.count return UInt(nextCount) <= maxCharactersCount } return true diff --git a/ChattoAdditions/Source/Input/Photos/Camera/DeviceImagePicker.swift b/ChattoAdditions/Source/Input/Photos/Camera/DeviceImagePicker.swift new file mode 100644 index 000000000..9ea2d56f2 --- /dev/null +++ b/ChattoAdditions/Source/Input/Photos/Camera/DeviceImagePicker.swift @@ -0,0 +1,56 @@ +/* + The MIT License (MIT) + + Copyright (c) 2015-present Badoo Trading Limited. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +class DeviceImagePicker : NSObject, ImagePicker, UIImagePickerControllerDelegate, UINavigationControllerDelegate { + let controller: UIViewController + private weak var delegate: ImagePickerDelegate? + + init(_ delegate: ImagePickerDelegate) { + let pickerController = UIImagePickerController() + self.controller = pickerController + self.delegate = delegate + super.init() + pickerController.delegate = self + pickerController.sourceType = .camera + } + + @objc + func imagePickerController(_ picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String: AnyObject]?) { + self.delegate?.imagePickerDidFinishPickingImage(image) + } + + @objc + func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { + self.delegate?.imagePickerDidCancel() + } +} + +class DeviceImagePickerFactory: ImagePickerFactory { + func pickerController(_ delegate: ImagePickerDelegate) -> ImagePicker? { + guard UIImagePickerController.isSourceTypeAvailable(.camera) else { + return nil + } + return DeviceImagePicker(delegate) + } +} diff --git a/ChattoAdditions/Source/Input/Photos/Camera/ImagePicker.swift b/ChattoAdditions/Source/Input/Photos/Camera/ImagePicker.swift new file mode 100644 index 000000000..d4c2a33f8 --- /dev/null +++ b/ChattoAdditions/Source/Input/Photos/Camera/ImagePicker.swift @@ -0,0 +1,48 @@ +/* + The MIT License (MIT) + + Copyright (c) 2015-present Badoo Trading Limited. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +import UIKit + +protocol ImagePickerDelegate : class { + func imagePickerDidFinishPickingImage(_ image: UIImage?) + func imagePickerDidCancel() +} + +protocol ImagePicker { + var controller: UIViewController { get } +} + +protocol ImagePickerFactory { + func pickerController(_ delegate: ImagePickerDelegate) -> ImagePicker? +} + +struct ImagePickerStore { + static var factory: ImagePickerFactory = { +#if !(arch(i386) || arch(x86_64)) + return DeviceImagePickerFactory() +#else + return SimulatorImagePickerFactory() +#endif + }() +} diff --git a/ChattoAdditions/Source/Input/Photos/Camera/PhotosInputCameraPicker.swift b/ChattoAdditions/Source/Input/Photos/Camera/PhotosInputCameraPicker.swift index e57033ba2..4c684f812 100644 --- a/ChattoAdditions/Source/Input/Photos/Camera/PhotosInputCameraPicker.swift +++ b/ChattoAdditions/Source/Input/Photos/Camera/PhotosInputCameraPicker.swift @@ -24,8 +24,10 @@ import UIKit -class PhotosInputCameraPicker: NSObject { - weak var presentingController: UIViewController? +class PhotosInputCameraPicker : ImagePickerDelegate { + private weak var presentingController: UIViewController? + private var imagePicker: ImagePicker? + init(presentingController: UIViewController?) { self.presentingController = presentingController } @@ -33,41 +35,34 @@ class PhotosInputCameraPicker: NSObject { private var completionBlocks: (onImageTaken: ((UIImage?) -> Void)?, onCameraPickerDismissed: (() -> Void)?)? func presentCameraPicker(onImageTaken: @escaping (UIImage?) -> Void, onCameraPickerDismissed: @escaping () -> Void) { - guard UIImagePickerController.isSourceTypeAvailable(.camera) else { - onImageTaken(nil) - onCameraPickerDismissed() - return - } - - guard let presentingController = self.presentingController else { + if let presentingController = self.presentingController { + self.completionBlocks = (onImageTaken: onImageTaken, onCameraPickerDismissed: onCameraPickerDismissed) + self.imagePicker = ImagePickerStore.factory.pickerController(self) + if let imagePickerBox = self.imagePicker { + presentingController.present(imagePickerBox.controller, animated: true, completion: nil) + } else { + onImageTaken(nil) + onCameraPickerDismissed() + } + } else { onImageTaken(nil) onCameraPickerDismissed() - - return } - - self.completionBlocks = (onImageTaken: onImageTaken, onCameraPickerDismissed: onCameraPickerDismissed) - let controller = UIImagePickerController() - controller.delegate = self - controller.sourceType = .camera - presentingController.present(controller, animated: true, completion: nil) } - fileprivate func finishPickingImage(_ image: UIImage?, fromPicker picker: UIImagePickerController) { - let (onImageTaken, onCameraPickerDismissed) = self.completionBlocks ?? (nil, nil) - picker.dismiss(animated: true, completion: onCameraPickerDismissed) - onImageTaken?(image) + func imagePickerDidFinishPickingImage(_ image: UIImage?) { + self.finishPickingImage(image, fromPicker: self.imagePicker?.controller) } -} -extension PhotosInputCameraPicker: UIImagePickerControllerDelegate, UINavigationControllerDelegate { - @objc - func imagePickerController(_ picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String: AnyObject]?) { - self.finishPickingImage(image, fromPicker: picker) + func imagePickerDidCancel() { + self.finishPickingImage(nil, fromPicker: self.imagePicker?.controller) } - @objc - func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { - self.finishPickingImage(nil, fromPicker: picker) + private func finishPickingImage(_ image: UIImage?, fromPicker picker: UIViewController?) { + let (onImageTaken, onCameraPickerDismissed) = self.completionBlocks ?? (nil, nil) + picker?.dismiss(animated: true, completion: onCameraPickerDismissed) + onImageTaken?(image) + self.completionBlocks = nil + self.imagePicker = nil } } diff --git a/ChattoAdditions/Source/Input/Photos/Camera/SimulatorImagePicker.swift b/ChattoAdditions/Source/Input/Photos/Camera/SimulatorImagePicker.swift new file mode 100644 index 000000000..26a08b7b0 --- /dev/null +++ b/ChattoAdditions/Source/Input/Photos/Camera/SimulatorImagePicker.swift @@ -0,0 +1,88 @@ +/* + The MIT License (MIT) + + Copyright (c) 2015-present Badoo Trading Limited. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +import Foundation + +class SimulatorImagePicker : ImagePicker { + let controller: UIViewController + + init(_ delegate: ImagePickerDelegate) { + let controller = SimulatorImagePickerController() + weak var delegate = delegate + self.controller = controller + controller.didTakePhotoCallback = { + delegate?.imagePickerDidFinishPickingImage(UIImage.bma_imageWithColor(.green, size: CGSize(width: 1024, height: 1024))) + } + controller.didCancelCallback = { + delegate?.imagePickerDidCancel() + } + } +} + +class SimulatorImagePickerController : UIViewController { + private let buttonTakePhoto = UIButton(type: .system) + private let buttonCancel = UIButton(type: .system) + + var didTakePhotoCallback: (() -> Void)? + var didCancelCallback: (() -> Void)? + + override func viewDidLoad() { + super.viewDidLoad() + self.view.backgroundColor = .white + + self.view.addSubview(self.buttonTakePhoto) + self.buttonTakePhoto.setTitle("Take Photo", for: .normal) + self.buttonTakePhoto.addTarget(self, action: #selector(onButtonTakePhoto), for: .touchUpInside) + self.buttonTakePhoto.accessibilityIdentifier = "btn_camera_overlay_take_photo" + self.view.addSubview(self.buttonCancel) + + self.buttonCancel.setTitle("Cancel", for: .normal) + self.buttonCancel.addTarget(self, action: #selector(onButtonCancel), for: .touchUpInside) + self.buttonCancel.accessibilityIdentifier = "btn camera overlay close" + } + + @objc + private func onButtonTakePhoto() { + self.didTakePhotoCallback?() + } + + @objc + private func onButtonCancel() { + self.didCancelCallback?() + } + + override func viewDidLayoutSubviews() { + super.viewDidLayoutSubviews() + let bounds = self.view.bounds + let (slice,remainder) = bounds.divided(atDistance: bounds.height/2, from: .minYEdge) + self.buttonTakePhoto.frame = slice + self.buttonCancel.frame = remainder + } +} + +class SimulatorImagePickerFactory : ImagePickerFactory { + func pickerController(_ delegate: ImagePickerDelegate) -> ImagePicker? { + return SimulatorImagePicker(delegate) + } +} diff --git a/ChattoApp/ChattoApp.xcodeproj/project.pbxproj b/ChattoApp/ChattoApp.xcodeproj/project.pbxproj index 6d1ebd3f7..eae3fe7af 100644 --- a/ChattoApp/ChattoApp.xcodeproj/project.pbxproj +++ b/ChattoApp/ChattoApp.xcodeproj/project.pbxproj @@ -327,9 +327,9 @@ TargetAttributes = { C33FBFA41BDE441C008E3545 = { CreatedOnToolsVersion = 7.1; - DevelopmentTeam = P5G2D29QYJ; + DevelopmentTeam = 923GU4UW4P; LastSwiftMigration = 0900; - ProvisioningStyle = Manual; + ProvisioningStyle = Automatic; }; C33FBFB81BDE441C008E3545 = { CreatedOnToolsVersion = 7.1; @@ -427,7 +427,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; F8D7533B1E7B2E137B143EBD /* [CP] Copy Pods Resources */ = { @@ -627,15 +627,16 @@ baseConfigurationReference = 2CCB5DAFC70B636492325895 /* Pods-ChattoApp.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_STYLE = Manual; - DEVELOPMENT_TEAM = P5G2D29QYJ; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 923GU4UW4P; FRAMEWORK_SEARCH_PATHS = "$(inherited)"; INFOPLIST_FILE = ChattoApp/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.badoo.ChattoApp; PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE = "48f86164-3732-414d-9f7c-6b4e1be6ebfb"; - PROVISIONING_PROFILE_SPECIFIER = "Wildcard Development Profile"; + PROVISIONING_PROFILE = ""; + PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_SWIFT3_OBJC_INFERENCE = Default; SWIFT_VERSION = 4.0; }; @@ -646,8 +647,9 @@ baseConfigurationReference = 6DABD92E2BA40464C1727DA2 /* Pods-ChattoApp.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_STYLE = Manual; - DEVELOPMENT_TEAM = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 923GU4UW4P; FRAMEWORK_SEARCH_PATHS = "$(inherited)"; INFOPLIST_FILE = ChattoApp/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; diff --git a/ChattoApp/Podfile.lock b/ChattoApp/Podfile.lock index baa4a1ca4..00f7ead81 100644 --- a/ChattoApp/Podfile.lock +++ b/ChattoApp/Podfile.lock @@ -14,9 +14,9 @@ EXTERNAL SOURCES: :path: .. SPEC CHECKSUMS: - Chatto: 49676707c36ccb831ecb23e0969b890b2da91f08 - ChattoAdditions: c4c8827790b9c9885002f6b91f210fd3632dc60a + Chatto: c12efd50b08620f3eec3c5855bf99bec69bac3bb + ChattoAdditions: 3078c5176bf6b443e082fe6be37f39c3029d7a72 PODFILE CHECKSUM: 1d3260c9c7c4e7959c1f82d6d23323008391b149 -COCOAPODS: 1.2.0 +COCOAPODS: 1.4.0 diff --git a/ChattoApp/Pods/Manifest.lock b/ChattoApp/Pods/Manifest.lock index baa4a1ca4..00f7ead81 100644 --- a/ChattoApp/Pods/Manifest.lock +++ b/ChattoApp/Pods/Manifest.lock @@ -14,9 +14,9 @@ EXTERNAL SOURCES: :path: .. SPEC CHECKSUMS: - Chatto: 49676707c36ccb831ecb23e0969b890b2da91f08 - ChattoAdditions: c4c8827790b9c9885002f6b91f210fd3632dc60a + Chatto: c12efd50b08620f3eec3c5855bf99bec69bac3bb + ChattoAdditions: 3078c5176bf6b443e082fe6be37f39c3029d7a72 PODFILE CHECKSUM: 1d3260c9c7c4e7959c1f82d6d23323008391b149 -COCOAPODS: 1.2.0 +COCOAPODS: 1.4.0 diff --git a/ChattoApp/Pods/Pods.xcodeproj/project.pbxproj b/ChattoApp/Pods/Pods.xcodeproj/project.pbxproj index 5edd0f771..71f039ecb 100644 --- a/ChattoApp/Pods/Pods.xcodeproj/project.pbxproj +++ b/ChattoApp/Pods/Pods.xcodeproj/project.pbxproj @@ -7,106 +7,109 @@ objects = { /* Begin PBXBuildFile section */ - 00E7CFDA07DB9D3C1349719B5F30B4DA /* SerialTaskQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = E89F916D99A1180299922EB3BE164AFA /* SerialTaskQueue.swift */; }; - 0377DDE546365121E36564598F636E11 /* PhotoMessagePresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2EEE869EC0416F4D02E2FFEEC765394 /* PhotoMessagePresenter.swift */; }; - 0908F28782860638539F67028CA33880 /* TextMessageModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = E0CA3E92F2A43A456D7084B031D4CF51 /* TextMessageModel.swift */; }; - 09C3BA0AC03C054EF21C73B417C47F0B /* ChatItemProtocolDefinitions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F3D46E991C6D9AEA22D702952C55325 /* ChatItemProtocolDefinitions.swift */; }; - 0D5098FA67D7F514DB44D87A6D9AE2A3 /* Photos.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D2B2293D7D418420AB03F0584A71EB69 /* Photos.xcassets */; }; - 0E3A877EFED45D642822D20A5E9130ED /* DummyChatItemPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC9D06B156044BFD612301944D5EE108 /* DummyChatItemPresenter.swift */; }; - 1053BEAE885884DFDCEC8FBC4FB7136C /* LiveCameraCaptureSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = F723EDCBADAEA4756C1A3BB21FD658BF /* LiveCameraCaptureSession.swift */; }; - 116F2DBEE6F8A35F42C2BDA11265CD74 /* LiveCameraCellPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67DDD937E461DDAB00ECD53C1088BB85 /* LiveCameraCellPresenter.swift */; }; - 13A6CB81528D52C7BC3E571B84800866 /* BaseChatViewController+AccessoryViewRevealer.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC191FB58DACFA33032B5769FE61B57A /* BaseChatViewController+AccessoryViewRevealer.swift */; }; - 178BBA9F9E0917F778E1D723A36AB6BE /* PhotosInputCameraPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = E59FE62630BF2B921146B5A00041566A /* PhotosInputCameraPicker.swift */; }; - 1B7E27A2ABC74CA4337F07AB65F7A104 /* Chatto-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 42D8BFA51D1A4D7997DDA3DAEEC7BB3A /* Chatto-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1C8A0EFD3EB2A1802B0686B26770CA00 /* BaseChatViewController+Changes.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFC3B2987C5F0E4637488241C0011017 /* BaseChatViewController+Changes.swift */; }; - 206F482C0C6CA1A1D631425FC7B061D3 /* UIScreen+Scale.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C9D3C524326F412C004249E9C380E28 /* UIScreen+Scale.swift */; }; - 218809CDAE0153784F84C63409B7C855 /* CircleProgressView.h in Headers */ = {isa = PBXBuildFile; fileRef = A646D9D63ADF946D93A9137B1C163530 /* CircleProgressView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 22ED2E6A2FBE9CA5AF0A23212A215352 /* ChatItemDecorationAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 059AFEC9271D0C315E234306D36AAD8D /* ChatItemDecorationAttributes.swift */; }; - 23E3BD896792D82204A618B40DDAF87E /* ChatInputItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 723D37912F092CDC7FE07C7680E7DB91 /* ChatInputItemView.swift */; }; - 273488FCB19BF7432E84B75D980EB1DF /* BaseMessageCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CEA2DA3812AB02CD792CB48D880697F /* BaseMessageCollectionViewCell.swift */; }; - 292DE5C69D726099DBDAB24E90704D09 /* PhotoMessageCollectionViewCellDefaultStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97797641F10F6F78BA754D219BF891A2 /* PhotoMessageCollectionViewCellDefaultStyle.swift */; }; - 2BD76CF4C9A3B6A260DD0525EE1610D2 /* TextChatInputItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 279C535A891EDEB34E1778086FB93E5C /* TextChatInputItem.swift */; }; - 2FCE4E038352892BCC8C4058441EEC76 /* PhotoBubbleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9192DB6AAAF89AE38AC08CE60442106C /* PhotoBubbleView.swift */; }; - 321CA728E73B9212E43539EAF0608ADF /* HorizontalStackScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AE35F493B6DBB049F8F4B563D5B5FCB /* HorizontalStackScrollView.swift */; }; - 33AF3D397BE3CEF084CD4B3779768A21 /* PhotosInputDataProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C05B24F61DAA2992ECE5587F507A825 /* PhotosInputDataProvider.swift */; }; - 3ACB8DF2E370A0E0B55654577571CF4C /* PhotosInputPlaceholderCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB80459D7464709D9459210A697ABEB1 /* PhotosInputPlaceholderCell.swift */; }; - 3AFCF8BD14A727B60317F765E63BA5A3 /* ChatDataSourceProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = E8284E5CBE4A071FF40F6A671DEC2421 /* ChatDataSourceProtocol.swift */; }; - 3B51C41F3877FA70C0B935E8B353C0B0 /* PhotosInputPlaceholderDataProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61E979305AA9460ED6872E997D1E332B /* PhotosInputPlaceholderDataProvider.swift */; }; - 414D7F5D9C00445F6C34865BBE736FD0 /* Alignment.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3F4F4B83967BC9B3CE9BE3A0AA9FFA4 /* Alignment.swift */; }; - 427197CCD51E95F64AC5D979F636E4AF /* ReusableXibView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 516E654504B5E5266DAF101BBC037C0C /* ReusableXibView.swift */; }; - 4717A39922B564C6F7D3099C5BB09865 /* CircleProgressView.m in Sources */ = {isa = PBXBuildFile; fileRef = E8306AB2416FCEB2E790EE0B8CE80E5D /* CircleProgressView.m */; }; - 48AEA441275A3ECAB76E063A3A160C76 /* CircleIconView.m in Sources */ = {isa = PBXBuildFile; fileRef = 1FAD51A26D811C9AF2E6D980CB765EA5 /* CircleIconView.m */; }; - 49A9C8E7E321C59D0A4788EF6922D3D1 /* ViewDefinitions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A82EFB6060E3E0BD7CF641642BF1F35 /* ViewDefinitions.swift */; }; - 4A5F444E097190951A984B0E9F92A854 /* BaseMessageAssets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 667C1CA3478EA3D81ADADD11F7EFB62C /* BaseMessageAssets.xcassets */; }; - 4BF1A190683FB1C28990E664A58C241F /* BaseMessageViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3752B2DDCCEC3777240C81FDF4835CB /* BaseMessageViewModel.swift */; }; - 4F9329574A81360A5B6B8D962D8BA736 /* UIView+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AEA132001D95F5226910B89D775F59E /* UIView+Additions.swift */; }; - 4FF7351F95B481A0BB97CF70FF00BB84 /* TextMessagePresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = C086177508249FD5E65C98CDC6E8655B /* TextMessagePresenter.swift */; }; - 5052993A379605DE3771A704AB9B3BCD /* BaseMessagePresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B693A67F54700AC9E1CEFFAD94AC6B7 /* BaseMessagePresenter.swift */; }; - 532F79E733CD3D076495827F49F46150 /* CGRect+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 982E2B0589FCEB087B5B8CD7D921E249 /* CGRect+Additions.swift */; }; - 54B4530688F6EC423AACEF083D286FF9 /* KeyboardTracker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95FE43AE16BC2356351CE54411E7A09B /* KeyboardTracker.swift */; }; - 551E32A56BA1409332FCA489D1F2BD18 /* BaseChatItemPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 191AD5777B77BF6B5AD967A434ACDFEE /* BaseChatItemPresenter.swift */; }; - 59A28A3E3DFD01AFF0B4C84D68C1DFC1 /* TextBubbleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50CA29BA4DBF1F3595D1EF66E51A846A /* TextBubbleView.swift */; }; - 5F29366244D8C4D898D869CDED78FB1F /* TextMessagePresenterBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6268AA14B10D8D6C7F3D82EC391C2FC7 /* TextMessagePresenterBuilder.swift */; }; - 61D1AC5288329A48167EB0B1AE56783D /* Chatto.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0A636ED63D4950987B5410B6B50F1B4 /* Chatto.framework */; }; - 642ABB656474A70303ED5D1784CEE307 /* BaseChatViewControllerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 601C752037109750FE6479BE085EBE97 /* BaseChatViewControllerView.swift */; }; - 67DF62CE955F0664E2F13AE4FEC7FE0D /* ChatInputBar.xib in Resources */ = {isa = PBXBuildFile; fileRef = 64098046251F40CFE18AABFF28F8AF30 /* ChatInputBar.xib */; }; - 6EB65F7502843EA07E53805FEA7CA6DB /* ChattoAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = BF350EE5E9F81D532C1D8720B5E2E96B /* ChattoAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 6FD3B2B0E4D4345FD6BAFBEAEC42B2EF /* ChatInputBarAppearance.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1283CB1C7D70ACC15E0602BF3FC8B460 /* ChatInputBarAppearance.swift */; }; - 72553F5E91B91B9401218D8DA70B6D57 /* PhotoMessageViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63F8D0477799F45033C624E68A0911EC /* PhotoMessageViewModel.swift */; }; - 726C03A23ADD2E9B9DA8045F6ED9BF3F /* PhotosInputWithPlaceholdersDataProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CEC1807AADFF36C9C1C2D816DB9FCB0 /* PhotosInputWithPlaceholdersDataProvider.swift */; }; - 733ECA7D1AEA031AA153E7A49C281A19 /* Pods-ChattoApp-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 7980454BC9FD75106EBBF49DA18E603B /* Pods-ChattoApp-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 00D6D10980978A3AD87F2EFA18D5FA53 /* BaseMessageCollectionViewCellDefaultStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E6B9EFA482498A8F7626B346CDED36D /* BaseMessageCollectionViewCellDefaultStyle.swift */; }; + 00E3F827CF29D95C20BC041DE0B3E415 /* ChatInputBar.xib in Resources */ = {isa = PBXBuildFile; fileRef = B1309CFDDC69D430EF26B5A607907C80 /* ChatInputBar.xib */; }; + 010040154F5F454E72EF1468790FA4CD /* BaseChatViewController+Scrolling.swift in Sources */ = {isa = PBXBuildFile; fileRef = AFB8A0CFBD7C0AE7CB03BF74160D4DBA /* BaseChatViewController+Scrolling.swift */; }; + 0C16A79AD329A1AE31DCB63829C8C87B /* PhotosInputView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D6F0E45378AD0C6B71082D352CC260B /* PhotosInputView.swift */; }; + 0D505833F07BC65FEBC299D37006365D /* HorizontalStackScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2DD8E4BB9487A80F70C29231EA1E6295 /* HorizontalStackScrollView.swift */; }; + 0D523E4FE6115F7A55C3AC1084204E4B /* BaseChatViewController+AccessoryViewRevealer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 425AA302DBD7925EAF5AC414D86AEA0B /* BaseChatViewController+AccessoryViewRevealer.swift */; }; + 0EA4A981038BAA87CFD193759A602F8F /* PhotosInputDataProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBA64E0B302B8C3DAD22C389E3F73CFB /* PhotosInputDataProvider.swift */; }; + 0FD9575740CF2F8B25FF917D414DD453 /* BaseChatViewController+Presenters.swift in Sources */ = {isa = PBXBuildFile; fileRef = C7A3114802D19936B30971AC47A85BAD /* BaseChatViewController+Presenters.swift */; }; + 13F170B91F743BE7E900034704945334 /* TabInputButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = A500CFC58AF814D90C69A58ED2780972 /* TabInputButton.swift */; }; + 14E1077906B79E35EB6C0D452E98E102 /* PhotosInputPlaceholderCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 593C30E9D0A0055838C2854296640A47 /* PhotosInputPlaceholderCell.swift */; }; + 16361DBD3920836499A58C212E9B825F /* PhotosInputCellProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E8F42B307C00B2A41B5509D17EE211A /* PhotosInputCellProvider.swift */; }; + 1B5BAA97C46FBC289D2B770A2CF26195 /* Photos.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4A4DFA43E1F3E4B1A85CEFCEFC38500E /* Photos.xcassets */; }; + 1C0E2D574DEAA28340343074A044380C /* PhotoMessagePresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA0E54B122003939CAFC03AE0FA4B5DC /* PhotoMessagePresenter.swift */; }; + 1D22A8C6A20F2FE60BB35918061C3ECB /* ChatDataSourceProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = D9E20DA473442F4FE951198139ADCB9A /* ChatDataSourceProtocol.swift */; }; + 1EBAAE2E59B3FDA14AAD805DFC2707D6 /* AccessoryViewRevealer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6689FB692180AEBAC101759EAD0116C2 /* AccessoryViewRevealer.swift */; }; + 217914BBAE3847BF873C1386E1FAE9AA /* BaseChatItemPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8FE7CDA883280C5BDFD7A2E6C025833A /* BaseChatItemPresenter.swift */; }; + 2500D71C245FFE4D6B9BFD4A2A1EDB85 /* CGSize+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C59631DCA268A4285E100821B4E160B /* CGSize+Additions.swift */; }; + 259AE37389BAB08398971B61C68C0202 /* PhotosInputWithPlaceholdersDataProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7C9C727136FE97562C19E9EED6E66C0 /* PhotosInputWithPlaceholdersDataProvider.swift */; }; + 28075012B4DC5D40D6B054A83AA81BF8 /* Alignment.swift in Sources */ = {isa = PBXBuildFile; fileRef = F207983FB08AF781AE4FF881D8960FF0 /* Alignment.swift */; }; + 2CB7713B0D33C9E905F429EF16FB86DF /* DummyChatItemPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B80E0E9904F4BFCCEA00B151D33F58 /* DummyChatItemPresenter.swift */; }; + 2CDB23CA2683F68395293EE5DBD427A8 /* LiveCameraCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 129420675D0E892156C6D5F890C31DE9 /* LiveCameraCell.swift */; }; + 2EDA353EE9074C181A7F628FF5255F35 /* PhotoMessagePresenterBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 054266A433FDCDF6CE22033EFC757A22 /* PhotoMessagePresenterBuilder.swift */; }; + 2F96149719263B6CB07600157780AF21 /* BaseChatViewControllerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E3235B63095189632DAF591C60640F6 /* BaseChatViewControllerView.swift */; }; + 31157864FC8DD8494902BD87CAEC950E /* TextMessagePresenterBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48A04A3FAAAFC0C4AAF832BBDE30C8D2 /* TextMessagePresenterBuilder.swift */; }; + 33C9126C93D8B4F3D6A1543B4C98618E /* ChatItemProtocolDefinitions.swift in Sources */ = {isa = PBXBuildFile; fileRef = FFD942A947D0F30C8639C1CBAB4AF302 /* ChatItemProtocolDefinitions.swift */; }; + 39FE01D5BD4A9F43AE61C39CCFC868D8 /* UIView+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A8F4A40C1DC22FF561A2874120DDC74 /* UIView+Additions.swift */; }; + 3A87BB2197D9516F6A159670B8E98C26 /* TextMessageCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7415D56E6E1F58660510D91A8808D437 /* TextMessageCollectionViewCell.swift */; }; + 3B378B2BBAC42362BDF8AB7F08688E8B /* Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = E7F3B7809E5A273EF73736CF423B9CB5 /* Utils.swift */; }; + 3E008FC7A2FDDCCCF61C7BD94C131EBE /* PhotoBubbleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F34BC85B23764467817891963F9FC304 /* PhotoBubbleView.swift */; }; + 3E32D7EA354D45031B987D3B0BA6B1F8 /* LiveCameraCellPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA258F8A88B4DE305AF692CEE5C855A7 /* LiveCameraCellPresenter.swift */; }; + 3E43C0A2E3955FC38026140E26B4E602 /* CircleProgressView.h in Headers */ = {isa = PBXBuildFile; fileRef = B9CD5BEE75214684960D2D0186F18D39 /* CircleProgressView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3FB5355485D2570D0EE541C1C640812F /* ReadOnlyOrderedDictionary.swift in Sources */ = {isa = PBXBuildFile; fileRef = A20874338A13B082557F5D7D5DAD78FE /* ReadOnlyOrderedDictionary.swift */; }; + 3FE7D49AAD12760C3809D3EF079033DF /* UIScreen+Scale.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8A201C1EFC6CB61F9E130E8293153B4 /* UIScreen+Scale.swift */; }; + 406F0C247B841E15DC8D6F0FF0420D73 /* KeyboardTracker.swift in Sources */ = {isa = PBXBuildFile; fileRef = F00A8A9ECFF12DCE30DABCE3E5E136D1 /* KeyboardTracker.swift */; }; + 43EB2F4B3C928EC0ABDE758E9A027F61 /* CircleProgressView.m in Sources */ = {isa = PBXBuildFile; fileRef = D5AC84164493C29F99955F0D66AA4184 /* CircleProgressView.m */; }; + 48592135C286A8497752C7ED03A23CEE /* BaseMessageModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8F1E432BC15A34A52E6583F21C1D526 /* BaseMessageModel.swift */; }; + 4C1E87BDED189A0548E50B02C69062B4 /* BaseMessageViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 124000A3BF8B8398B7A22D9123A19ED0 /* BaseMessageViewModel.swift */; }; + 512A57DEB9B46A901C1FC10527041D36 /* ChatInputBarPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1270F50E949DF5F1FB5E317CBFC4E308 /* ChatInputBarPresenter.swift */; }; + 532E7EF69E5BE6723F2A4EFAB7ED6607 /* CollectionChanges.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05D5600D8E7D22AC3E225129F527765E /* CollectionChanges.swift */; }; + 59F5745760DD39E7FDE89A10CA21B948 /* CircleProgressIndicator.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 42EB7C4A601A189E1ED3EF6E420EEDA7 /* CircleProgressIndicator.xcassets */; }; + 5DB4ECF73BD0118F052100A502727579 /* TextMessagePresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09802F0177B7395415243C806A52ECE0 /* TextMessagePresenter.swift */; }; + 60C8B2C6A1B1CE596A82309FDB96EE56 /* ImagePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C3A8A70E90E0D7AF0C7506702585A4E /* ImagePicker.swift */; }; + 6355C90A3190FD3F4F748D9A50907DDE /* ChatItemDecorationAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7345926803B4C970357560D78597DB8 /* ChatItemDecorationAttributes.swift */; }; + 6CB02D239F26C9991C816CD677715057 /* Chatto-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 50A7B423BC8E6016073DE574AF7AB1F2 /* Chatto-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6D7F13AD0766C7171AA27435010DBD51 /* CircleIconView.h in Headers */ = {isa = PBXBuildFile; fileRef = 8ECE055A1AC334A37ED070AB2F0BA28D /* CircleIconView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 71E16DAE8DC770EB8839FFCED579143E /* Chatto.h in Headers */ = {isa = PBXBuildFile; fileRef = 3ED7B54C4A2CE71FF6F698ED3A75D087 /* Chatto.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 733ECA7D1AEA031AA153E7A49C281A19 /* Pods-ChattoApp-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = D26F81AF79CA37D208D3C6511A534949 /* Pods-ChattoApp-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7507614804E28F304AD99EE5C8B67C43 /* LiveCameraCaptureSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9ABAEAD42B233C4C72F4D8C62D264AC /* LiveCameraCaptureSession.swift */; }; + 759100F5B47B2E76F5CA16E2F37532D3 /* Text.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D410A8560196ED567FD09A0BBCAAC9F8 /* Text.xcassets */; }; 77E6F472B22328E2F6962FB06D4E8475 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C9FB20ED66AF2A93EB50539902AE6733 /* Foundation.framework */; }; + 78F46BA4780730F9A3B1D419A4DC56BF /* PhotoMessageModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE1FCDE5DEF7DF407DE4318DBB83DB2D /* PhotoMessageModel.swift */; }; + 7B0EBDA75601E029EA64F03E579D0663 /* ChatCollectionViewLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F938377FA02F6C0D99FD8706AC3C3D0 /* ChatCollectionViewLayout.swift */; }; + 7D20450EADD4BAEBAC1E1028D9768995 /* PhotoMessageAssets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = F7B09B7BBFF294077116E789BA62D48C /* PhotoMessageAssets.xcassets */; }; 7F663761FE373B0CB90C3906DC50E832 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C9FB20ED66AF2A93EB50539902AE6733 /* Foundation.framework */; }; - 8077AF8BB8ED80B9F65E5889B7BF18F9 /* CircleIconView.h in Headers */ = {isa = PBXBuildFile; fileRef = F9AF71BED6F86BF658FF23DC8C2E18E8 /* CircleIconView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 810519B1702F6D3E5BD0D753548D2516 /* TextMessageCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43BD266E3B81098EFFBADE067D9635B3 /* TextMessageCollectionViewCell.swift */; }; - 840E9EC534B91037C1E71C98305D9360 /* CGSize+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B988C88B34FC72601AB485784C9FFE9 /* CGSize+Additions.swift */; }; - 84C0E170146FF3AE917C0F70D7ABE740 /* BaseChatViewController+Presenters.swift in Sources */ = {isa = PBXBuildFile; fileRef = 073E6EA5A36F5D62CADA17515C40FCA7 /* BaseChatViewController+Presenters.swift */; }; - 87EB590F2C8DF9875384E8038CF9B441 /* CircleProgressIndicatorView.m in Sources */ = {isa = PBXBuildFile; fileRef = 06A452DBBD75B075E4E8AB74245A53B8 /* CircleProgressIndicatorView.m */; }; - 88FA3F7DE4449E92AED3A7F972B1C120 /* CircleProgressIndicatorView.h in Headers */ = {isa = PBXBuildFile; fileRef = 67BCD535A4BD5454C9FCCD2788DDDB23 /* CircleProgressIndicatorView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 938553A9900F0ED129896CE9335247EC /* CollectionChanges.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9168D664DBAFF3A3F4A461E34999CCAB /* CollectionChanges.swift */; }; - 93AC0348CFA081A20308C0FFA9A85A3A /* Pods-ChattoApp-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 52D72C6BD70BD003D7302046B549A377 /* Pods-ChattoApp-dummy.m */; }; - 93DF1C22384B663AEA6FC1A9CB8D60C4 /* Chatto-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 41A9B2AAC21030F2945A94BC7CBD1423 /* Chatto-dummy.m */; }; - 940040010AFE7B2393D460C463784854 /* PhotosChatInputItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F09EDCE4FD50C91A4AFE28C62E6B262 /* PhotosChatInputItem.swift */; }; - 9D7852562750FC8C3A15D028835135F4 /* ChatInputItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1C0E180CDC74BB787830995596759BB /* ChatInputItem.swift */; }; - 9E026BE35745F76D3F41CF75A2AAAD1B /* ChatInputBarPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CAFC912E0E6C2F1E9118701E9CC0C67 /* ChatInputBarPresenter.swift */; }; - 9E0879FB9F4E503B226F826947D0C238 /* AccessoryViewRevealer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E8BD3DC93B8EF607B5A8A310BE706B5 /* AccessoryViewRevealer.swift */; }; - A20E1E4D0B51D330521A038B1C171283 /* PhotoMessageCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B08B68DC4CF9C40224E26AF22C1C201 /* PhotoMessageCollectionViewCell.swift */; }; - A227FCB9E4096C8B68E62E3C302450A3 /* ChatInputBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = A2B4874B2572ABB358BD849D7ACA87CF /* ChatInputBar.swift */; }; - A442B461BE91D0FECB142345E0301ECE /* UIEdgeInsets+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17DFFF33E8AA17666C7538D5B4FACC48 /* UIEdgeInsets+Additions.swift */; }; - A82CAFD9B68DB130FC3153E3B1ECFC78 /* CircleProgressIndicator.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DA69C4842198E41E23867E01B0161612 /* CircleProgressIndicator.xcassets */; }; - A845CC193EC7C2DB469C981A38833BE6 /* ChatCollectionViewLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CC12F31AA8B7C20FD1784C4E98C7A9D /* ChatCollectionViewLayout.swift */; }; - AB66066339703AF177504A94913154AF /* Chatto.h in Headers */ = {isa = PBXBuildFile; fileRef = 0B5D4369BA1DB086393AC1B9A92A22E5 /* Chatto.h */; settings = {ATTRIBUTES = (Public, ); }; }; - AD8CA62F9FC1D181F98A45D8E482CA19 /* ChattoAdditions-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 5A4BF7E99DD1960EA3ACDCE6F29D58BB /* ChattoAdditions-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B682C23FD898157CD88987D206F662DF /* BaseMessageCollectionViewCellDefaultStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12DA3EB29892458F3C380BEFA109F455 /* BaseMessageCollectionViewCellDefaultStyle.swift */; }; - BBE106C464EDA83E8FE45D2F4600219C /* Observable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8EC3D00120D564DF1693470D628B4F20 /* Observable.swift */; }; - BE2105E7A04C9EBF4F1AC98F089BF0E5 /* LiveCameraCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = EF50565048825E6E2A3A0747B0525165 /* LiveCameraCell.swift */; }; - BEBEDDB6DB64A74879929323D7FF3BE0 /* Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AC89C37B73E5085F85C15F6D398BC06 /* Utils.swift */; }; - BEDDA117D39966B4ADC066A869B73861 /* PhotosInputCellProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52D16A9323DBD7ED29D4E2C00BBBCA01 /* PhotosInputCellProvider.swift */; }; - BF344AF6015129DA9281F11EF345F69A /* TabInputButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB90477F384297E79AA65A34723FAEFF /* TabInputButton.swift */; }; - BF49B6C57AAA1D30BA96F5A441C7E243 /* PhotosInputView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3ED3BA424A1D40D404A39054EB5C078 /* PhotosInputView.swift */; }; - C0444770A88F1C893336E24773711D95 /* PhotoMessageModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A702EF246DE1ED4D4F1B34A7D9A5FCD3 /* PhotoMessageModel.swift */; }; - C12427076692D9528A8D85B3CC5282AF /* AnimationUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = D9C0DFBB022F918F067C3508B631D46C /* AnimationUtils.swift */; }; - C37E6371A36AA5A01B9728926E539097 /* ReadOnlyOrderedDictionary.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2E90819091BCEF228F57100FF8C977E /* ReadOnlyOrderedDictionary.swift */; }; - C4DB841966496979B3DBB024F5A67921 /* BaseMessageModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 832A168C41D7A7AA627E966DF2A8C356 /* BaseMessageModel.swift */; }; - C97B858B3DCA74018CBC3CE09B013DF6 /* TextMessageCollectionViewCellDefaultStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DA84AD18B49FDB43FF7F5AA7617AA47 /* TextMessageCollectionViewCellDefaultStyle.swift */; }; - C994312CE7B555897DEE0E92C38EAB07 /* PhotosInputCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FFF61B6160D563242F94B8AF99ADFAC /* PhotosInputCell.swift */; }; - C9BD3038AE74FDD4F3BD3601D7FFF83B /* UIColor+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9918F3D21890AF0CC91778D2BCD42999 /* UIColor+Additions.swift */; }; - D211781B9A7359B64504CEF607B33539 /* BaseChatViewController+Scrolling.swift in Sources */ = {isa = PBXBuildFile; fileRef = 882CCF9E1FA68D196280E4AB07D2ACE4 /* BaseChatViewController+Scrolling.swift */; }; - D44EF0A6DF582C0FD1207CD4566CB8DA /* ChattoAdditions-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = FB5030FB81D772482E145FF745310021 /* ChattoAdditions-dummy.m */; }; - D7502DE46962489626E08273BB2F7305 /* Text.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 2A0D073A6C8292215CF9C18BDE409BE1 /* Text.xcassets */; }; - D7BC6DD82B0DE5B63EE0AF36503B39CF /* ChatItemCompanion.swift in Sources */ = {isa = PBXBuildFile; fileRef = D589B8099ABF7FF77450197D733032D5 /* ChatItemCompanion.swift */; }; - D9F3F80693F694583820F71692B152FC /* ChatItemPresenterFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FB3E6351A0819A36E159219A89F6F1B /* ChatItemPresenterFactory.swift */; }; - DB110C7A53F27B3AD41017CE93966236 /* PhotosInputViewItemSizeCalculator.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9D8C989703AEA8071225BBE63439617 /* PhotosInputViewItemSizeCalculator.swift */; }; - DBC4A7969FBE1B60FAE02682057C1724 /* PhotosInputPlaceholderCellProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5954FF8781271F1399D91694F019C895 /* PhotosInputPlaceholderCellProvider.swift */; }; - E21B42AF9CC775F6394F72FE4ABAF6CF /* PhotoMessagePresenterBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BCB925A7AD25721C63462627729179A /* PhotoMessagePresenterBuilder.swift */; }; - E584A50DEA4E624D5517C201509FF453 /* CGPoint+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 843ABB13513C10E807F86CC18C34C28A /* CGPoint+Additions.swift */; }; - E86FE22E08CD5EC6B1268D6444166CD8 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C9FB20ED66AF2A93EB50539902AE6733 /* Foundation.framework */; }; - F262790F0C84E6FD8003C3066A872EFD /* PhotoMessageAssets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 7BFD9A3C31260386847F9B7920E6FC80 /* PhotoMessageAssets.xcassets */; }; - F42FD998FF7FF4E4807A990BFDF37340 /* CGFloat+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78B15F2E139A973129D3B796443940EA /* CGFloat+Additions.swift */; }; - F6AD5CDB17D9D3D8B175C4B96232D043 /* UIImage+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 758F9F275BCBC117A58411FFD5CD29D5 /* UIImage+Additions.swift */; }; - F6CF2E800519B4B517D8EF399148740C /* ExpandableTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B534E5DFA8AC796EA37D37E61883101 /* ExpandableTextView.swift */; }; - F97A060F8F8A4EA5625817B853DE24EA /* BaseChatViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F665EFEF85A414EA8DF1B5518183440D /* BaseChatViewController.swift */; }; - FAB63FBEFA74B1AE08945265914E12DC /* TextMessageViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CAF6F253937B1924C73650A7840C133 /* TextMessageViewModel.swift */; }; + 8060B6D103DA4161BF922E14847B8736 /* TextMessageViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58BEF5E6331B2CB05F56D9E10C66A901 /* TextMessageViewModel.swift */; }; + 826A43BDFAD7AD06AE209B47592E31D0 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C9FB20ED66AF2A93EB50539902AE6733 /* Foundation.framework */; }; + 831E03B95B8F5E02ACF2250807749B41 /* SerialTaskQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1985774D53B3A1654C7775FD6A07A399 /* SerialTaskQueue.swift */; }; + 8867B0709DE6851C45CD27BC45D5E4E7 /* ChatItemPresenterFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19441BE50AD243FC9F2E75C3DE5B8E80 /* ChatItemPresenterFactory.swift */; }; + 8B417560642B39B55AB772AAAB4A5E25 /* PhotosInputCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43B11277D4132D3470FC06F6E567361A /* PhotosInputCell.swift */; }; + 8F80B5B62BFD9C705AB6108ED449CCC1 /* PhotosChatInputItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A352E08BEB4912F511344FF68E6BF19 /* PhotosChatInputItem.swift */; }; + 902FA0B2997BA4D8AA0B17164278BBA7 /* UIColor+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4DF0809CC047786F4137E42373F4134 /* UIColor+Additions.swift */; }; + 919F6A1D05D00F1D815A5D6E30C16822 /* PhotosInputPlaceholderDataProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = D380068E3A21DDCA854A552D0681F12A /* PhotosInputPlaceholderDataProvider.swift */; }; + 93AC0348CFA081A20308C0FFA9A85A3A /* Pods-ChattoApp-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E3F504B152268D2F40F52A62C446408 /* Pods-ChattoApp-dummy.m */; }; + 93CD8A20A6A2DAA0C36A20F67C103030 /* BaseMessagePresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B229F9BCB567E2FBB872000A9E0ECD2 /* BaseMessagePresenter.swift */; }; + 9ECEBD5C0D9255BF6888EB9D5D19D77A /* PhotosInputCameraPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF479F563BA6247F15B5BA474AF80975 /* PhotosInputCameraPicker.swift */; }; + A06C6E4AAEF5C39720886BA18621C919 /* AnimationUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB7CAC59BED45C08C2E61CC07F82A24E /* AnimationUtils.swift */; }; + A1807B0B711E646B1E57F637E3D467FF /* CircleIconView.m in Sources */ = {isa = PBXBuildFile; fileRef = BF40955EBCA1F843EB6FD57E0B53E165 /* CircleIconView.m */; }; + A528EB120A5E7DC270E7E2F133D85B3C /* CGRect+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2AE9343D0A945ED2AC24F7B0A390A4E7 /* CGRect+Additions.swift */; }; + A58BD56650DE9663F4A6B51B114E8921 /* PhotoMessageCollectionViewCellDefaultStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = E90B6821F7D9C990696D159A8A8F3885 /* PhotoMessageCollectionViewCellDefaultStyle.swift */; }; + A6A57EC7C8F3AA159B14477221F8C91A /* TextMessageCollectionViewCellDefaultStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE380B5B75A6D0600DBDE77FF958ADAE /* TextMessageCollectionViewCellDefaultStyle.swift */; }; + AA0B570656617383FE7AFCC873A3F6C0 /* PhotoMessageCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCD5E1BC57BB87C53CABBB55C3A86CE1 /* PhotoMessageCollectionViewCell.swift */; }; + AAC97E757D1592775A9A9499FB555858 /* BaseMessageAssets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 8E530272C9C6DF0ABC40B6E61D3DD29C /* BaseMessageAssets.xcassets */; }; + BD92A029D5888E3E83B13232899832BB /* PhotosInputViewItemSizeCalculator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D0430B2B18F1C6A279939FE7FEAB97C /* PhotosInputViewItemSizeCalculator.swift */; }; + C12D5C1C7CF2DCC15D64201569A6A107 /* ReusableXibView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F14F86937C99E9B9182BDC8D3D66B884 /* ReusableXibView.swift */; }; + C5CA29B99659A34C87C587840BE8B1CA /* CircleProgressIndicatorView.h in Headers */ = {isa = PBXBuildFile; fileRef = CA346CB6808EFE01AE75836A1F7A0698 /* CircleProgressIndicatorView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C888A6F89201A5B9148B199FCC3A1329 /* ChattoAdditions-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 11540919D58B7B56085DA340933B0FC1 /* ChattoAdditions-dummy.m */; }; + CABD18923698A9608DFCC1A0A27A0C80 /* UIEdgeInsets+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 653AC366611432A9FD809ECC143989E4 /* UIEdgeInsets+Additions.swift */; }; + CC1DC524A231D132832C59A91CB5F2BC /* TextMessageModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 128C8DC0F70D827A45AA0DD49B3689D6 /* TextMessageModel.swift */; }; + CC4F915B4A3E45BBFE4F9C409C345A2F /* ExpandableTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D001EAE1C66ADDE971DE7417AA9FC5D /* ExpandableTextView.swift */; }; + CD240780265A33455A58308A /* DeviceImagePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD2407785B3CE07C044E5860 /* DeviceImagePicker.swift */; }; + CD240FBFE867CEE2C20A2C71 /* SimulatorImagePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD240F278096B97B5422DDEC /* SimulatorImagePicker.swift */; }; + CEB217F536637B792CD39700C6C09996 /* ChatInputBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92B5B3D91CB163330A0FD333E60DDCAB /* ChatInputBar.swift */; }; + D383F5FDC2D260D8358A206310B7FC68 /* ViewDefinitions.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE00EA2B2F8904F2E6F64C976F9FC256 /* ViewDefinitions.swift */; }; + D653E8F4A1DAF0E61DF020F622DBA1D1 /* BaseMessageCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88C185C185C37220F2DB10F36D736542 /* BaseMessageCollectionViewCell.swift */; }; + D9F713EAC4BD81B407957E3E29FEDE79 /* ChattoAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = AD9B97CEBDD8AFB58128F14ACBBBC412 /* ChattoAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DAD6EDFF6F4E25EFB1DC50E550732E15 /* CGFloat+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C40601F885EEF498338F0F3D0940B99F /* CGFloat+Additions.swift */; }; + DF03B550764571CA287E0B4B8CFD5DB2 /* CGPoint+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD28FF28BA5E3CE8FC894E71C061E5F3 /* CGPoint+Additions.swift */; }; + DF0DD294440693888AE371BD30638C9A /* ChatInputItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5AA587742C30D113BA584FA54710FD0A /* ChatInputItemView.swift */; }; + DFB12A9A065E868FE0EE84C6126EA37C /* CircleProgressIndicatorView.m in Sources */ = {isa = PBXBuildFile; fileRef = 2E72656362E555629AE7C98D6A4F14B3 /* CircleProgressIndicatorView.m */; }; + E087569EF5E356913098318056B77BE3 /* ChatInputItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84E401C6009E6CBFD1139547BA604FB9 /* ChatInputItem.swift */; }; + E3FF292D87A07BA67A729AD36AEF5076 /* BaseChatViewController+Changes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46581CCBDE0B2F41FF3265FC82B1E001 /* BaseChatViewController+Changes.swift */; }; + E601017C14729E02A50CC61844F9FC16 /* Observable.swift in Sources */ = {isa = PBXBuildFile; fileRef = A62614FA915BDC7A6FA98EC080BC0FE2 /* Observable.swift */; }; + ED3A9540FCF8929A92605DD482096345 /* ChattoAdditions-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 65540FDB9B6009E3AE2CD01F047293D9 /* ChattoAdditions-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + ED8761914EA48870B07EF342B4C412B1 /* PhotosInputPlaceholderCellProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 663915E51C99CC0E3FF755D7D7C9B964 /* PhotosInputPlaceholderCellProvider.swift */; }; + F0A451A28135770A80CAE3312B2E396F /* ChatInputBarAppearance.swift in Sources */ = {isa = PBXBuildFile; fileRef = 247A5E9062AE185F8515C9C35998CD31 /* ChatInputBarAppearance.swift */; }; + F122757D5AE43AEA5224C57D6BC791F3 /* Chatto.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0A636ED63D4950987B5410B6B50F1B4 /* Chatto.framework */; }; + F44F9E965318C8D275A6D6F27D2BB14E /* Chatto-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 55826B807503BE7DDC77A0B9310616CF /* Chatto-dummy.m */; }; + F6A0282EDBB0B7785CC58190CCFE9F8B /* BaseChatViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC6D20F1A27D9120A64F63AE5A503034 /* BaseChatViewController.swift */; }; + F721CCDBC314636F25FC84F9002014A3 /* TextBubbleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB3BA07DBA51A986FB2A3D18DBB01B96 /* TextBubbleView.swift */; }; + FA5A27A37622D781F82E51B25551880F /* UIImage+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD6D7F742DFE0768F96231D1F0733523 /* UIImage+Additions.swift */; }; + FB8866C5639D10A9D6EF04ADC4667542 /* TextChatInputItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53D247BEFAB9EF120E4F010A1F91C4C6 /* TextChatInputItem.swift */; }; + FC9C847E639368AE9DCD4F4C0D745EF3 /* ChatItemCompanion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4510561EB01709E73B706E8CD931E27D /* ChatItemCompanion.swift */; }; + FD053593E7C6C6E82265C241782F45F9 /* PhotoMessageViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAE542D15277B59EF8C23E3086B388A7 /* PhotoMessageViewModel.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -114,7 +117,7 @@ isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 43BDE8C9B9E5D63986DBEFDF1B4BA044; + remoteGlobalIDString = DCD24D044DCB3D3A8BB5461EC53DE4E2; remoteInfo = ChattoAdditions; }; 919991093F4ADC46C15C3FE1FE49290F /* PBXContainerItemProxy */ = { @@ -124,7 +127,7 @@ remoteGlobalIDString = 0564C2782D1F2F8E464CB332E0FE7246; remoteInfo = Chatto; }; - BF65737F0062B82A2CF15094471FB93C /* PBXContainerItemProxy */ = { + E15D700B0C37BBB75A542999FE2533A3 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; @@ -134,124 +137,129 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 059AFEC9271D0C315E234306D36AAD8D /* ChatItemDecorationAttributes.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatItemDecorationAttributes.swift; sourceTree = ""; }; - 06A452DBBD75B075E4E8AB74245A53B8 /* CircleProgressIndicatorView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = CircleProgressIndicatorView.m; sourceTree = ""; }; - 073E6EA5A36F5D62CADA17515C40FCA7 /* BaseChatViewController+Presenters.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "BaseChatViewController+Presenters.swift"; sourceTree = ""; }; - 0B5D4369BA1DB086393AC1B9A92A22E5 /* Chatto.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = Chatto.h; sourceTree = ""; }; + 050EA91E2E5DB5E650DBAF3DD412C1FB /* Chatto.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; path = Chatto.podspec; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + 054266A433FDCDF6CE22033EFC757A22 /* PhotoMessagePresenterBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotoMessagePresenterBuilder.swift; sourceTree = ""; }; + 05D5600D8E7D22AC3E225129F527765E /* CollectionChanges.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CollectionChanges.swift; sourceTree = ""; }; + 09802F0177B7395415243C806A52ECE0 /* TextMessagePresenter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TextMessagePresenter.swift; sourceTree = ""; }; 0E8CD230BF38884D8498CDDAC2BD0AE7 /* Chatto.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Chatto.framework; path = Chatto.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 1283CB1C7D70ACC15E0602BF3FC8B460 /* ChatInputBarAppearance.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatInputBarAppearance.swift; sourceTree = ""; }; - 12DA3EB29892458F3C380BEFA109F455 /* BaseMessageCollectionViewCellDefaultStyle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BaseMessageCollectionViewCellDefaultStyle.swift; sourceTree = ""; }; - 17DFFF33E8AA17666C7538D5B4FACC48 /* UIEdgeInsets+Additions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "UIEdgeInsets+Additions.swift"; sourceTree = ""; }; - 191AD5777B77BF6B5AD967A434ACDFEE /* BaseChatItemPresenter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BaseChatItemPresenter.swift; sourceTree = ""; }; - 1CEA2DA3812AB02CD792CB48D880697F /* BaseMessageCollectionViewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BaseMessageCollectionViewCell.swift; sourceTree = ""; }; - 1CEC1807AADFF36C9C1C2D816DB9FCB0 /* PhotosInputWithPlaceholdersDataProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotosInputWithPlaceholdersDataProvider.swift; sourceTree = ""; }; - 1FAD51A26D811C9AF2E6D980CB765EA5 /* CircleIconView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = CircleIconView.m; sourceTree = ""; }; - 1FB3E6351A0819A36E159219A89F6F1B /* ChatItemPresenterFactory.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatItemPresenterFactory.swift; sourceTree = ""; }; - 1FFF61B6160D563242F94B8AF99ADFAC /* PhotosInputCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotosInputCell.swift; sourceTree = ""; }; - 230194971784138EFDD356DD09D531CB /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 279C535A891EDEB34E1778086FB93E5C /* TextChatInputItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TextChatInputItem.swift; sourceTree = ""; }; - 2A0D073A6C8292215CF9C18BDE409BE1 /* Text.xcassets */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder.assetcatalog; path = Text.xcassets; sourceTree = ""; }; - 3AEA132001D95F5226910B89D775F59E /* UIView+Additions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "UIView+Additions.swift"; sourceTree = ""; }; - 3C05B24F61DAA2992ECE5587F507A825 /* PhotosInputDataProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotosInputDataProvider.swift; sourceTree = ""; }; - 3CAF6F253937B1924C73650A7840C133 /* TextMessageViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TextMessageViewModel.swift; sourceTree = ""; }; - 41A9B2AAC21030F2945A94BC7CBD1423 /* Chatto-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Chatto-dummy.m"; sourceTree = ""; }; - 42D8BFA51D1A4D7997DDA3DAEEC7BB3A /* Chatto-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Chatto-umbrella.h"; sourceTree = ""; }; - 43BD266E3B81098EFFBADE067D9635B3 /* TextMessageCollectionViewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TextMessageCollectionViewCell.swift; sourceTree = ""; }; - 46482F96934733214320322EC2918D88 /* Pods-ChattoApp.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = "Pods-ChattoApp.modulemap"; sourceTree = ""; }; - 4B988C88B34FC72601AB485784C9FFE9 /* CGSize+Additions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "CGSize+Additions.swift"; sourceTree = ""; }; - 4DA84AD18B49FDB43FF7F5AA7617AA47 /* TextMessageCollectionViewCellDefaultStyle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TextMessageCollectionViewCellDefaultStyle.swift; sourceTree = ""; }; - 50CA29BA4DBF1F3595D1EF66E51A846A /* TextBubbleView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TextBubbleView.swift; sourceTree = ""; }; - 516E654504B5E5266DAF101BBC037C0C /* ReusableXibView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ReusableXibView.swift; sourceTree = ""; }; - 52D16A9323DBD7ED29D4E2C00BBBCA01 /* PhotosInputCellProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotosInputCellProvider.swift; sourceTree = ""; }; - 52D72C6BD70BD003D7302046B549A377 /* Pods-ChattoApp-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-ChattoApp-dummy.m"; sourceTree = ""; }; - 5954FF8781271F1399D91694F019C895 /* PhotosInputPlaceholderCellProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotosInputPlaceholderCellProvider.swift; sourceTree = ""; }; - 5A4BF7E99DD1960EA3ACDCE6F29D58BB /* ChattoAdditions-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ChattoAdditions-umbrella.h"; sourceTree = ""; }; - 5C9D3C524326F412C004249E9C380E28 /* UIScreen+Scale.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "UIScreen+Scale.swift"; sourceTree = ""; }; - 5F3D46E991C6D9AEA22D702952C55325 /* ChatItemProtocolDefinitions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatItemProtocolDefinitions.swift; sourceTree = ""; }; - 601C752037109750FE6479BE085EBE97 /* BaseChatViewControllerView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BaseChatViewControllerView.swift; sourceTree = ""; }; - 61E979305AA9460ED6872E997D1E332B /* PhotosInputPlaceholderDataProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotosInputPlaceholderDataProvider.swift; sourceTree = ""; }; - 6268AA14B10D8D6C7F3D82EC391C2FC7 /* TextMessagePresenterBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TextMessagePresenterBuilder.swift; sourceTree = ""; }; - 63F8D0477799F45033C624E68A0911EC /* PhotoMessageViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotoMessageViewModel.swift; sourceTree = ""; }; - 64098046251F40CFE18AABFF28F8AF30 /* ChatInputBar.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; path = ChatInputBar.xib; sourceTree = ""; }; - 664656BDB7A47AC9ECBA2D58EB550D51 /* Chatto.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = Chatto.modulemap; sourceTree = ""; }; - 667C1CA3478EA3D81ADADD11F7EFB62C /* BaseMessageAssets.xcassets */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder.assetcatalog; path = BaseMessageAssets.xcassets; sourceTree = ""; }; - 67BCD535A4BD5454C9FCCD2788DDDB23 /* CircleProgressIndicatorView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = CircleProgressIndicatorView.h; sourceTree = ""; }; - 67DDD937E461DDAB00ECD53C1088BB85 /* LiveCameraCellPresenter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = LiveCameraCellPresenter.swift; sourceTree = ""; }; - 6AC89C37B73E5085F85C15F6D398BC06 /* Utils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Utils.swift; sourceTree = ""; }; - 6CAFC912E0E6C2F1E9118701E9CC0C67 /* ChatInputBarPresenter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatInputBarPresenter.swift; sourceTree = ""; }; + 11540919D58B7B56085DA340933B0FC1 /* ChattoAdditions-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "ChattoAdditions-dummy.m"; sourceTree = ""; }; + 124000A3BF8B8398B7A22D9123A19ED0 /* BaseMessageViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BaseMessageViewModel.swift; sourceTree = ""; }; + 1270F50E949DF5F1FB5E317CBFC4E308 /* ChatInputBarPresenter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatInputBarPresenter.swift; sourceTree = ""; }; + 128C8DC0F70D827A45AA0DD49B3689D6 /* TextMessageModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TextMessageModel.swift; sourceTree = ""; }; + 129420675D0E892156C6D5F890C31DE9 /* LiveCameraCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = LiveCameraCell.swift; sourceTree = ""; }; + 14B80E0E9904F4BFCCEA00B151D33F58 /* DummyChatItemPresenter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = DummyChatItemPresenter.swift; sourceTree = ""; }; + 19441BE50AD243FC9F2E75C3DE5B8E80 /* ChatItemPresenterFactory.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatItemPresenterFactory.swift; sourceTree = ""; }; + 196E807B9D564A10BFF03F9C19F2A61B /* Pods-ChattoApp.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ChattoApp.release.xcconfig"; sourceTree = ""; }; + 1985774D53B3A1654C7775FD6A07A399 /* SerialTaskQueue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SerialTaskQueue.swift; path = Chatto/Source/SerialTaskQueue.swift; sourceTree = ""; }; + 1D001EAE1C66ADDE971DE7417AA9FC5D /* ExpandableTextView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ExpandableTextView.swift; sourceTree = ""; }; + 247A5E9062AE185F8515C9C35998CD31 /* ChatInputBarAppearance.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatInputBarAppearance.swift; sourceTree = ""; }; + 29247C83C1B2146FA34637DA7510391C /* Chatto.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Chatto.modulemap; sourceTree = ""; }; + 2A8F4A40C1DC22FF561A2874120DDC74 /* UIView+Additions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "UIView+Additions.swift"; sourceTree = ""; }; + 2AE9343D0A945ED2AC24F7B0A390A4E7 /* CGRect+Additions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "CGRect+Additions.swift"; sourceTree = ""; }; + 2DD8E4BB9487A80F70C29231EA1E6295 /* HorizontalStackScrollView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = HorizontalStackScrollView.swift; sourceTree = ""; }; + 2E72656362E555629AE7C98D6A4F14B3 /* CircleProgressIndicatorView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = CircleProgressIndicatorView.m; sourceTree = ""; }; + 2E8F42B307C00B2A41B5509D17EE211A /* PhotosInputCellProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotosInputCellProvider.swift; sourceTree = ""; }; + 2F938377FA02F6C0D99FD8706AC3C3D0 /* ChatCollectionViewLayout.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatCollectionViewLayout.swift; sourceTree = ""; }; + 3C3A8A70E90E0D7AF0C7506702585A4E /* ImagePicker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ImagePicker.swift; sourceTree = ""; }; + 3ED7B54C4A2CE71FF6F698ED3A75D087 /* Chatto.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Chatto.h; path = Chatto/Source/Chatto.h; sourceTree = ""; }; + 425AA302DBD7925EAF5AC414D86AEA0B /* BaseChatViewController+AccessoryViewRevealer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "BaseChatViewController+AccessoryViewRevealer.swift"; sourceTree = ""; }; + 42EB7C4A601A189E1ED3EF6E420EEDA7 /* CircleProgressIndicator.xcassets */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder.assetcatalog; path = CircleProgressIndicator.xcassets; sourceTree = ""; }; + 43B11277D4132D3470FC06F6E567361A /* PhotosInputCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotosInputCell.swift; sourceTree = ""; }; + 4510561EB01709E73B706E8CD931E27D /* ChatItemCompanion.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatItemCompanion.swift; sourceTree = ""; }; + 46581CCBDE0B2F41FF3265FC82B1E001 /* BaseChatViewController+Changes.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "BaseChatViewController+Changes.swift"; sourceTree = ""; }; + 48A04A3FAAAFC0C4AAF832BBDE30C8D2 /* TextMessagePresenterBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TextMessagePresenterBuilder.swift; sourceTree = ""; }; + 4A4DFA43E1F3E4B1A85CEFCEFC38500E /* Photos.xcassets */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder.assetcatalog; path = Photos.xcassets; sourceTree = ""; }; + 4E3F504B152268D2F40F52A62C446408 /* Pods-ChattoApp-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-ChattoApp-dummy.m"; sourceTree = ""; }; + 4F90FA6D4FBA6832B0032AB803E89430 /* Chatto.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Chatto.xcconfig; sourceTree = ""; }; + 504410F6DF88345B0FC1D58FA4067A66 /* Pods-ChattoApp-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-ChattoApp-acknowledgements.markdown"; sourceTree = ""; }; + 50A7B423BC8E6016073DE574AF7AB1F2 /* Chatto-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Chatto-umbrella.h"; sourceTree = ""; }; + 53D247BEFAB9EF120E4F010A1F91C4C6 /* TextChatInputItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TextChatInputItem.swift; sourceTree = ""; }; + 55826B807503BE7DDC77A0B9310616CF /* Chatto-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Chatto-dummy.m"; sourceTree = ""; }; + 58BEF5E6331B2CB05F56D9E10C66A901 /* TextMessageViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TextMessageViewModel.swift; sourceTree = ""; }; + 593C30E9D0A0055838C2854296640A47 /* PhotosInputPlaceholderCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotosInputPlaceholderCell.swift; sourceTree = ""; }; + 5AA587742C30D113BA584FA54710FD0A /* ChatInputItemView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatInputItemView.swift; sourceTree = ""; }; + 5D0430B2B18F1C6A279939FE7FEAB97C /* PhotosInputViewItemSizeCalculator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotosInputViewItemSizeCalculator.swift; sourceTree = ""; }; + 65042A58B2844DF8AA45E985932D0640 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 653AC366611432A9FD809ECC143989E4 /* UIEdgeInsets+Additions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "UIEdgeInsets+Additions.swift"; sourceTree = ""; }; + 65540FDB9B6009E3AE2CD01F047293D9 /* ChattoAdditions-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ChattoAdditions-umbrella.h"; sourceTree = ""; }; + 663915E51C99CC0E3FF755D7D7C9B964 /* PhotosInputPlaceholderCellProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotosInputPlaceholderCellProvider.swift; sourceTree = ""; }; + 6689FB692180AEBAC101759EAD0116C2 /* AccessoryViewRevealer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AccessoryViewRevealer.swift; sourceTree = ""; }; + 6A352E08BEB4912F511344FF68E6BF19 /* PhotosChatInputItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotosChatInputItem.swift; sourceTree = ""; }; 6DAEAB5DAC1307E56BDF15E9DDC72623 /* Pods_ChattoApp.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_ChattoApp.framework; path = "Pods-ChattoApp.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; - 6E8BD3DC93B8EF607B5A8A310BE706B5 /* AccessoryViewRevealer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AccessoryViewRevealer.swift; sourceTree = ""; }; - 6F09EDCE4FD50C91A4AFE28C62E6B262 /* PhotosChatInputItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotosChatInputItem.swift; sourceTree = ""; }; - 723D37912F092CDC7FE07C7680E7DB91 /* ChatInputItemView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatInputItemView.swift; sourceTree = ""; }; - 758F9F275BCBC117A58411FFD5CD29D5 /* UIImage+Additions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "UIImage+Additions.swift"; sourceTree = ""; }; + 6E3235B63095189632DAF591C60640F6 /* BaseChatViewControllerView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BaseChatViewControllerView.swift; sourceTree = ""; }; + 7415D56E6E1F58660510D91A8808D437 /* TextMessageCollectionViewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TextMessageCollectionViewCell.swift; sourceTree = ""; }; 75A4D0F8C860BD4281E8AED08E680907 /* ChattoAdditions.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = ChattoAdditions.framework; path = ChattoAdditions.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 78B15F2E139A973129D3B796443940EA /* CGFloat+Additions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "CGFloat+Additions.swift"; sourceTree = ""; }; - 7980454BC9FD75106EBBF49DA18E603B /* Pods-ChattoApp-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-ChattoApp-umbrella.h"; sourceTree = ""; }; - 7A82EFB6060E3E0BD7CF641642BF1F35 /* ViewDefinitions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ViewDefinitions.swift; sourceTree = ""; }; - 7AE35F493B6DBB049F8F4B563D5B5FCB /* HorizontalStackScrollView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = HorizontalStackScrollView.swift; sourceTree = ""; }; - 7B693A67F54700AC9E1CEFFAD94AC6B7 /* BaseMessagePresenter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BaseMessagePresenter.swift; sourceTree = ""; }; - 7BFD9A3C31260386847F9B7920E6FC80 /* PhotoMessageAssets.xcassets */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder.assetcatalog; path = PhotoMessageAssets.xcassets; sourceTree = ""; }; - 832A168C41D7A7AA627E966DF2A8C356 /* BaseMessageModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BaseMessageModel.swift; sourceTree = ""; }; - 843ABB13513C10E807F86CC18C34C28A /* CGPoint+Additions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "CGPoint+Additions.swift"; sourceTree = ""; }; - 882CCF9E1FA68D196280E4AB07D2ACE4 /* BaseChatViewController+Scrolling.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "BaseChatViewController+Scrolling.swift"; sourceTree = ""; }; - 8B08B68DC4CF9C40224E26AF22C1C201 /* PhotoMessageCollectionViewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotoMessageCollectionViewCell.swift; sourceTree = ""; }; - 8B534E5DFA8AC796EA37D37E61883101 /* ExpandableTextView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ExpandableTextView.swift; sourceTree = ""; }; - 8EC3D00120D564DF1693470D628B4F20 /* Observable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Observable.swift; sourceTree = ""; }; - 9168D664DBAFF3A3F4A461E34999CCAB /* CollectionChanges.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CollectionChanges.swift; sourceTree = ""; }; - 9192DB6AAAF89AE38AC08CE60442106C /* PhotoBubbleView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotoBubbleView.swift; sourceTree = ""; }; + 76C8CE48F21BBD79C3E57E7C28E5A051 /* Pods-ChattoApp.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-ChattoApp.modulemap"; sourceTree = ""; }; + 84E401C6009E6CBFD1139547BA604FB9 /* ChatInputItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatInputItem.swift; sourceTree = ""; }; + 88C185C185C37220F2DB10F36D736542 /* BaseMessageCollectionViewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BaseMessageCollectionViewCell.swift; sourceTree = ""; }; + 8A58C02B190EA9F6AE9FB698D29DCBC1 /* ChattoAdditions.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = ChattoAdditions.xcconfig; sourceTree = ""; }; + 8B229F9BCB567E2FBB872000A9E0ECD2 /* BaseMessagePresenter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BaseMessagePresenter.swift; sourceTree = ""; }; + 8C59631DCA268A4285E100821B4E160B /* CGSize+Additions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "CGSize+Additions.swift"; sourceTree = ""; }; + 8E530272C9C6DF0ABC40B6E61D3DD29C /* BaseMessageAssets.xcassets */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder.assetcatalog; path = BaseMessageAssets.xcassets; sourceTree = ""; }; + 8E6B9EFA482498A8F7626B346CDED36D /* BaseMessageCollectionViewCellDefaultStyle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BaseMessageCollectionViewCellDefaultStyle.swift; sourceTree = ""; }; + 8ECE055A1AC334A37ED070AB2F0BA28D /* CircleIconView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = CircleIconView.h; sourceTree = ""; }; + 8FE7CDA883280C5BDFD7A2E6C025833A /* BaseChatItemPresenter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BaseChatItemPresenter.swift; sourceTree = ""; }; + 92B5B3D91CB163330A0FD333E60DDCAB /* ChatInputBar.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatInputBar.swift; sourceTree = ""; }; 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - 95FE43AE16BC2356351CE54411E7A09B /* KeyboardTracker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = KeyboardTracker.swift; sourceTree = ""; }; - 9661D8308C0146658FC05299FF59AA85 /* Pods-ChattoApp.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ChattoApp.debug.xcconfig"; sourceTree = ""; }; - 97797641F10F6F78BA754D219BF891A2 /* PhotoMessageCollectionViewCellDefaultStyle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotoMessageCollectionViewCellDefaultStyle.swift; sourceTree = ""; }; - 982E2B0589FCEB087B5B8CD7D921E249 /* CGRect+Additions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "CGRect+Additions.swift"; sourceTree = ""; }; - 9918F3D21890AF0CC91778D2BCD42999 /* UIColor+Additions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "UIColor+Additions.swift"; sourceTree = ""; }; - 9BCB925A7AD25721C63462627729179A /* PhotoMessagePresenterBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotoMessagePresenterBuilder.swift; sourceTree = ""; }; - 9CC12F31AA8B7C20FD1784C4E98C7A9D /* ChatCollectionViewLayout.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatCollectionViewLayout.swift; sourceTree = ""; }; - A210C8B9CA993A2C831727CE2515A3DE /* ChattoAdditions-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ChattoAdditions-prefix.pch"; sourceTree = ""; }; - A2368BEEF11E9E87C42E3D6D3082D97D /* Pods-ChattoApp-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ChattoApp-frameworks.sh"; sourceTree = ""; }; - A2B4874B2572ABB358BD849D7ACA87CF /* ChatInputBar.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatInputBar.swift; sourceTree = ""; }; - A646D9D63ADF946D93A9137B1C163530 /* CircleProgressView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = CircleProgressView.h; sourceTree = ""; }; - A65DE185A12E70BE17EFA373F195C9E6 /* Chatto.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Chatto.xcconfig; sourceTree = ""; }; - A702EF246DE1ED4D4F1B34A7D9A5FCD3 /* PhotoMessageModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotoMessageModel.swift; sourceTree = ""; }; - A8AFCDC34A96C2B57F7A1C1A332382CB /* Pods-ChattoApp-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ChattoApp-resources.sh"; sourceTree = ""; }; - AB80459D7464709D9459210A697ABEB1 /* PhotosInputPlaceholderCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotosInputPlaceholderCell.swift; sourceTree = ""; }; - AF3827E052F4369A86F32B555BFE2E80 /* Chatto-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Chatto-prefix.pch"; sourceTree = ""; }; - AF5BD772CABAA008A4802F6B3A73307E /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - B1C0E180CDC74BB787830995596759BB /* ChatInputItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatInputItem.swift; sourceTree = ""; }; - B20598F484478DFEE1B31B07C6FA131F /* Pods-ChattoApp.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ChattoApp.release.xcconfig"; sourceTree = ""; }; - B2EEE869EC0416F4D02E2FFEEC765394 /* PhotoMessagePresenter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotoMessagePresenter.swift; sourceTree = ""; }; - B3F4F4B83967BC9B3CE9BE3A0AA9FFA4 /* Alignment.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Alignment.swift; sourceTree = ""; }; - B9D8C989703AEA8071225BBE63439617 /* PhotosInputViewItemSizeCalculator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotosInputViewItemSizeCalculator.swift; sourceTree = ""; }; - BF350EE5E9F81D532C1D8720B5E2E96B /* ChattoAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = ChattoAdditions.h; sourceTree = ""; }; - BFC3B2987C5F0E4637488241C0011017 /* BaseChatViewController+Changes.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "BaseChatViewController+Changes.swift"; sourceTree = ""; }; - C086177508249FD5E65C98CDC6E8655B /* TextMessagePresenter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TextMessagePresenter.swift; sourceTree = ""; }; - C117BD8C68DD05EFED4E96C19B341962 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - C2E90819091BCEF228F57100FF8C977E /* ReadOnlyOrderedDictionary.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ReadOnlyOrderedDictionary.swift; sourceTree = ""; }; - C5CB3BCEEF59DC9F22F70C7D1B1E98F5 /* Pods-ChattoApp-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-ChattoApp-acknowledgements.plist"; sourceTree = ""; }; + 97A51306EDB159C470E24D9B26BBB9E4 /* ChattoAdditions.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; path = ChattoAdditions.podspec; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + 9D6AE0AE7C9D70F0256D868912937354 /* Pods-ChattoApp.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ChattoApp.debug.xcconfig"; sourceTree = ""; }; + 9D6F0E45378AD0C6B71082D352CC260B /* PhotosInputView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotosInputView.swift; sourceTree = ""; }; + A20874338A13B082557F5D7D5DAD78FE /* ReadOnlyOrderedDictionary.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ReadOnlyOrderedDictionary.swift; path = Chatto/Source/ReadOnlyOrderedDictionary.swift; sourceTree = ""; }; + A500CFC58AF814D90C69A58ED2780972 /* TabInputButton.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TabInputButton.swift; sourceTree = ""; }; + A62614FA915BDC7A6FA98EC080BC0FE2 /* Observable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Observable.swift; sourceTree = ""; }; + A7C9C727136FE97562C19E9EED6E66C0 /* PhotosInputWithPlaceholdersDataProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotosInputWithPlaceholdersDataProvider.swift; sourceTree = ""; }; + AB7CAC59BED45C08C2E61CC07F82A24E /* AnimationUtils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AnimationUtils.swift; sourceTree = ""; }; + AD6D7F742DFE0768F96231D1F0733523 /* UIImage+Additions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "UIImage+Additions.swift"; sourceTree = ""; }; + AD9B97CEBDD8AFB58128F14ACBBBC412 /* ChattoAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ChattoAdditions.h; path = ChattoAdditions/Source/ChattoAdditions.h; sourceTree = ""; }; + AE1FCDE5DEF7DF407DE4318DBB83DB2D /* PhotoMessageModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotoMessageModel.swift; sourceTree = ""; }; + AFB8A0CFBD7C0AE7CB03BF74160D4DBA /* BaseChatViewController+Scrolling.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "BaseChatViewController+Scrolling.swift"; sourceTree = ""; }; + B1309CFDDC69D430EF26B5A607907C80 /* ChatInputBar.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; path = ChatInputBar.xib; sourceTree = ""; }; + B4DF0809CC047786F4137E42373F4134 /* UIColor+Additions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "UIColor+Additions.swift"; sourceTree = ""; }; + B9CD5BEE75214684960D2D0186F18D39 /* CircleProgressView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = CircleProgressView.h; sourceTree = ""; }; + BCB8F6E24C6E77A45A1B8328196C855C /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + BCD5E1BC57BB87C53CABBB55C3A86CE1 /* PhotoMessageCollectionViewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotoMessageCollectionViewCell.swift; sourceTree = ""; }; + BE380B5B75A6D0600DBDE77FF958ADAE /* TextMessageCollectionViewCellDefaultStyle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TextMessageCollectionViewCellDefaultStyle.swift; sourceTree = ""; }; + BF40955EBCA1F843EB6FD57E0B53E165 /* CircleIconView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = CircleIconView.m; sourceTree = ""; }; + BF479F563BA6247F15B5BA474AF80975 /* PhotosInputCameraPicker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotosInputCameraPicker.swift; sourceTree = ""; }; + C40601F885EEF498338F0F3D0940B99F /* CGFloat+Additions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "CGFloat+Additions.swift"; sourceTree = ""; }; + C69DB6FA1411C4887C437DA609C8019E /* ChattoAdditions.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = ChattoAdditions.modulemap; sourceTree = ""; }; + C7A3114802D19936B30971AC47A85BAD /* BaseChatViewController+Presenters.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "BaseChatViewController+Presenters.swift"; sourceTree = ""; }; C9FB20ED66AF2A93EB50539902AE6733 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; - CB90477F384297E79AA65A34723FAEFF /* TabInputButton.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TabInputButton.swift; sourceTree = ""; }; + CA0E54B122003939CAFC03AE0FA4B5DC /* PhotoMessagePresenter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotoMessagePresenter.swift; sourceTree = ""; }; + CA346CB6808EFE01AE75836A1F7A0698 /* CircleProgressIndicatorView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = CircleProgressIndicatorView.h; sourceTree = ""; }; + CD2407785B3CE07C044E5860 /* DeviceImagePicker.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DeviceImagePicker.swift; sourceTree = ""; }; + CD240F278096B97B5422DDEC /* SimulatorImagePicker.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SimulatorImagePicker.swift; sourceTree = ""; }; D0A636ED63D4950987B5410B6B50F1B4 /* Chatto.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Chatto.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - D2B2293D7D418420AB03F0584A71EB69 /* Photos.xcassets */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder.assetcatalog; path = Photos.xcassets; sourceTree = ""; }; - D589B8099ABF7FF77450197D733032D5 /* ChatItemCompanion.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatItemCompanion.swift; sourceTree = ""; }; - D9C0DFBB022F918F067C3508B631D46C /* AnimationUtils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AnimationUtils.swift; sourceTree = ""; }; - DA69C4842198E41E23867E01B0161612 /* CircleProgressIndicator.xcassets */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder.assetcatalog; path = CircleProgressIndicator.xcassets; sourceTree = ""; }; - DD7E5A5969A01E3A504D0135C6F25CFF /* ChattoAdditions.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = ChattoAdditions.xcconfig; sourceTree = ""; }; - E0CA3E92F2A43A456D7084B031D4CF51 /* TextMessageModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TextMessageModel.swift; sourceTree = ""; }; - E3ED3BA424A1D40D404A39054EB5C078 /* PhotosInputView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotosInputView.swift; sourceTree = ""; }; - E59FE62630BF2B921146B5A00041566A /* PhotosInputCameraPicker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotosInputCameraPicker.swift; sourceTree = ""; }; - E8284E5CBE4A071FF40F6A671DEC2421 /* ChatDataSourceProtocol.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatDataSourceProtocol.swift; sourceTree = ""; }; - E8306AB2416FCEB2E790EE0B8CE80E5D /* CircleProgressView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = CircleProgressView.m; sourceTree = ""; }; - E89F916D99A1180299922EB3BE164AFA /* SerialTaskQueue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SerialTaskQueue.swift; sourceTree = ""; }; - E94E7905DA30FCDE6EE3BAEB5579CC80 /* Pods-ChattoApp-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-ChattoApp-acknowledgements.markdown"; sourceTree = ""; }; - EF50565048825E6E2A3A0747B0525165 /* LiveCameraCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = LiveCameraCell.swift; sourceTree = ""; }; - F3752B2DDCCEC3777240C81FDF4835CB /* BaseMessageViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BaseMessageViewModel.swift; sourceTree = ""; }; - F665EFEF85A414EA8DF1B5518183440D /* BaseChatViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BaseChatViewController.swift; sourceTree = ""; }; - F723EDCBADAEA4756C1A3BB21FD658BF /* LiveCameraCaptureSession.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = LiveCameraCaptureSession.swift; sourceTree = ""; }; - F9AF71BED6F86BF658FF23DC8C2E18E8 /* CircleIconView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = CircleIconView.h; sourceTree = ""; }; - FB5030FB81D772482E145FF745310021 /* ChattoAdditions-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "ChattoAdditions-dummy.m"; sourceTree = ""; }; - FC191FB58DACFA33032B5769FE61B57A /* BaseChatViewController+AccessoryViewRevealer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "BaseChatViewController+AccessoryViewRevealer.swift"; sourceTree = ""; }; - FC4E873D2874D2207B97F63437C9827E /* ChattoAdditions.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = ChattoAdditions.modulemap; sourceTree = ""; }; - FC9D06B156044BFD612301944D5EE108 /* DummyChatItemPresenter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = DummyChatItemPresenter.swift; sourceTree = ""; }; + D2408AA70D73DDBDEFCBB4C7ADE29172 /* Pods-ChattoApp-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ChattoApp-resources.sh"; sourceTree = ""; }; + D26F81AF79CA37D208D3C6511A534949 /* Pods-ChattoApp-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-ChattoApp-umbrella.h"; sourceTree = ""; }; + D380068E3A21DDCA854A552D0681F12A /* PhotosInputPlaceholderDataProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotosInputPlaceholderDataProvider.swift; sourceTree = ""; }; + D410A8560196ED567FD09A0BBCAAC9F8 /* Text.xcassets */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder.assetcatalog; path = Text.xcassets; sourceTree = ""; }; + D5AC84164493C29F99955F0D66AA4184 /* CircleProgressView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = CircleProgressView.m; sourceTree = ""; }; + D9E20DA473442F4FE951198139ADCB9A /* ChatDataSourceProtocol.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatDataSourceProtocol.swift; sourceTree = ""; }; + DA258F8A88B4DE305AF692CEE5C855A7 /* LiveCameraCellPresenter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = LiveCameraCellPresenter.swift; sourceTree = ""; }; + DAE542D15277B59EF8C23E3086B388A7 /* PhotoMessageViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotoMessageViewModel.swift; sourceTree = ""; }; + DB3BA07DBA51A986FB2A3D18DBB01B96 /* TextBubbleView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TextBubbleView.swift; sourceTree = ""; }; + DBA64E0B302B8C3DAD22C389E3F73CFB /* PhotosInputDataProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotosInputDataProvider.swift; sourceTree = ""; }; + DC63AB949B66E4124657A68C82D45349 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + DC6D20F1A27D9120A64F63AE5A503034 /* BaseChatViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BaseChatViewController.swift; sourceTree = ""; }; + DE00EA2B2F8904F2E6F64C976F9FC256 /* ViewDefinitions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ViewDefinitions.swift; sourceTree = ""; }; + E6E414FA5AE66A6E8074D4AAED7C914E /* Pods-ChattoApp-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ChattoApp-frameworks.sh"; sourceTree = ""; }; + E7F3B7809E5A273EF73736CF423B9CB5 /* Utils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Utils.swift; path = Chatto/Source/Utils.swift; sourceTree = ""; }; + E90B6821F7D9C990696D159A8A8F3885 /* PhotoMessageCollectionViewCellDefaultStyle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotoMessageCollectionViewCellDefaultStyle.swift; sourceTree = ""; }; + E9ABAEAD42B233C4C72F4D8C62D264AC /* LiveCameraCaptureSession.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = LiveCameraCaptureSession.swift; sourceTree = ""; }; + F00A8A9ECFF12DCE30DABCE3E5E136D1 /* KeyboardTracker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = KeyboardTracker.swift; sourceTree = ""; }; + F14F86937C99E9B9182BDC8D3D66B884 /* ReusableXibView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ReusableXibView.swift; sourceTree = ""; }; + F207983FB08AF781AE4FF881D8960FF0 /* Alignment.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Alignment.swift; sourceTree = ""; }; + F34BC85B23764467817891963F9FC304 /* PhotoBubbleView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotoBubbleView.swift; sourceTree = ""; }; + F3CDE366A58BC30ADF711EEC30F5562D /* Chatto-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Chatto-prefix.pch"; sourceTree = ""; }; + F60670530F6217B4AA01EE0B7063477A /* Pods-ChattoApp-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-ChattoApp-acknowledgements.plist"; sourceTree = ""; }; + F7345926803B4C970357560D78597DB8 /* ChatItemDecorationAttributes.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatItemDecorationAttributes.swift; sourceTree = ""; }; + F7B09B7BBFF294077116E789BA62D48C /* PhotoMessageAssets.xcassets */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder.assetcatalog; path = PhotoMessageAssets.xcassets; sourceTree = ""; }; + F8A201C1EFC6CB61F9E130E8293153B4 /* UIScreen+Scale.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "UIScreen+Scale.swift"; sourceTree = ""; }; + F8F1E432BC15A34A52E6583F21C1D526 /* BaseMessageModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BaseMessageModel.swift; sourceTree = ""; }; + FA6D3153E92F0A38E684B3D1D2436F9C /* ChattoAdditions-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ChattoAdditions-prefix.pch"; sourceTree = ""; }; + FD28FF28BA5E3CE8FC894E71C061E5F3 /* CGPoint+Additions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "CGPoint+Additions.swift"; sourceTree = ""; }; + FFD942A947D0F30C8639C1CBAB4AF302 /* ChatItemProtocolDefinitions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatItemProtocolDefinitions.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -263,55 +271,41 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 80D1D254F5B9CB6F25D4BD27ADF04F0D /* Frameworks */ = { + 9B2813159043BB66E4F7CC6B5C8FBBB5 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 61D1AC5288329A48167EB0B1AE56783D /* Chatto.framework in Frameworks */, - E86FE22E08CD5EC6B1268D6444166CD8 /* Foundation.framework in Frameworks */, + 7F663761FE373B0CB90C3906DC50E832 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 9B2813159043BB66E4F7CC6B5C8FBBB5 /* Frameworks */ = { + F404562FFC16518B5FBEF36D049BDC46 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 7F663761FE373B0CB90C3906DC50E832 /* Foundation.framework in Frameworks */, + F122757D5AE43AEA5224C57D6BC791F3 /* Chatto.framework in Frameworks */, + 826A43BDFAD7AD06AE209B47592E31D0 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 05D31F297955F0F0DD4FEC528EE49A5F /* UI Components */ = { - isa = PBXGroup; - children = ( - 2359A998D9C76796BE410695F6524156 /* CircleProgressIndicatorView */, - ); - name = "UI Components"; - path = "UI Components"; - sourceTree = ""; - }; - 0830C6876687803EBD18173FA46E6A63 /* Support Files */ = { + 037716AFC2EE720FAFF87C19AA3236AA /* Pod */ = { isa = PBXGroup; children = ( - 664656BDB7A47AC9ECBA2D58EB550D51 /* Chatto.modulemap */, - A65DE185A12E70BE17EFA373F195C9E6 /* Chatto.xcconfig */, - 41A9B2AAC21030F2945A94BC7CBD1423 /* Chatto-dummy.m */, - AF3827E052F4369A86F32B555BFE2E80 /* Chatto-prefix.pch */, - 42D8BFA51D1A4D7997DDA3DAEEC7BB3A /* Chatto-umbrella.h */, - C117BD8C68DD05EFED4E96C19B341962 /* Info.plist */, + 97A51306EDB159C470E24D9B26BBB9E4 /* ChattoAdditions.podspec */, ); - name = "Support Files"; - path = "ChattoApp/Pods/Target Support Files/Chatto"; + name = Pod; sourceTree = ""; }; - 0E7726F07BAD9AC95C0FB541855E2AE4 /* Resources */ = { + 0DE5E08F571511CE52E70557E53273A0 /* Views */ = { isa = PBXGroup; children = ( - 6E5712D008F1D3582EB2F57000DC0F18 /* ChattoAdditions */, + 8E530272C9C6DF0ABC40B6E61D3DD29C /* BaseMessageAssets.xcassets */, ); - name = Resources; + name = Views; + path = Views; sourceTree = ""; }; 0F33BDD36546B9902C41911E4D2265FE /* iOS */ = { @@ -322,244 +316,213 @@ name = iOS; sourceTree = ""; }; - 0F47DF814D4816A9329AB2C324D99A8D /* Chat Items */ = { + 0FBD099FF9E1B2A17141BC028869BC9F /* Input */ = { isa = PBXGroup; children = ( - 191AD5777B77BF6B5AD967A434ACDFEE /* BaseChatItemPresenter.swift */, - D589B8099ABF7FF77450197D733032D5 /* ChatItemCompanion.swift */, - 5F3D46E991C6D9AEA22D702952C55325 /* ChatItemProtocolDefinitions.swift */, - FC9D06B156044BFD612301944D5EE108 /* DummyChatItemPresenter.swift */, + B1309CFDDC69D430EF26B5A607907C80 /* ChatInputBar.xib */, + 10C6D2A8BECEC5CE1BC96CA31494674C /* Photos */, + 6DA9B8896292756837F7099D5D261180 /* Text */, ); - name = "Chat Items"; - path = "Chat Items"; + name = Input; + path = ChattoAdditions/Source/Input; sourceTree = ""; }; - 123E4BD328BC361B0F19F8DE23787779 /* TextMessages */ = { + 10C6D2A8BECEC5CE1BC96CA31494674C /* Photos */ = { isa = PBXGroup; children = ( - E0CA3E92F2A43A456D7084B031D4CF51 /* TextMessageModel.swift */, - C086177508249FD5E65C98CDC6E8655B /* TextMessagePresenter.swift */, - 6268AA14B10D8D6C7F3D82EC391C2FC7 /* TextMessagePresenterBuilder.swift */, - 3CAF6F253937B1924C73650A7840C133 /* TextMessageViewModel.swift */, - 82A3259FEB3C129EA515856DECC02D7A /* Views */, + 4A4DFA43E1F3E4B1A85CEFCEFC38500E /* Photos.xcassets */, ); - name = TextMessages; - path = TextMessages; + name = Photos; + path = Photos; sourceTree = ""; }; - 14F281301980E041BCEB24085F455283 /* Targets Support Files */ = { + 1183C18AEF79B67C0A2F40D594CAB661 /* Chat Items */ = { isa = PBXGroup; children = ( - E183C50A4ACCDF227C27243B948F55BA /* Pods-ChattoApp */, + DBBDA500739FCC25C30332142CF11E8C /* BaseMessage */, + A3D284FF1F5FD20B316386E72FC1F0F8 /* PhotoMessages */, ); - name = "Targets Support Files"; + name = "Chat Items"; + path = "ChattoAdditions/Source/Chat Items"; sourceTree = ""; }; - 1FE53EEE09D0107E8E808A19593CF20B /* PhotoMessages */ = { + 14F281301980E041BCEB24085F455283 /* Targets Support Files */ = { isa = PBXGroup; children = ( - A702EF246DE1ED4D4F1B34A7D9A5FCD3 /* PhotoMessageModel.swift */, - B2EEE869EC0416F4D02E2FFEEC765394 /* PhotoMessagePresenter.swift */, - 9BCB925A7AD25721C63462627729179A /* PhotoMessagePresenterBuilder.swift */, - 63F8D0477799F45033C624E68A0911EC /* PhotoMessageViewModel.swift */, - 7B31B9572453EB4544C56143E8EA6275 /* Views */, + DA250B7B16B2F7EC30B8F58955416CAF /* Pods-ChattoApp */, ); - name = PhotoMessages; - path = PhotoMessages; + name = "Targets Support Files"; sourceTree = ""; }; - 2359A998D9C76796BE410695F6524156 /* CircleProgressIndicatorView */ = { + 159FED42C9E928CDD1FF5DBD90D79087 /* Chat Items */ = { isa = PBXGroup; children = ( - DA69C4842198E41E23867E01B0161612 /* CircleProgressIndicator.xcassets */, + F7345926803B4C970357560D78597DB8 /* ChatItemDecorationAttributes.swift */, + CADDED158F05C91F72D157C51CA17C45 /* BaseMessage */, + 52225918B65B4DB2949B01EDA32166D4 /* PhotoMessages */, + 474BECE036F9982A4536AD86894B69B6 /* TextMessages */, ); - name = CircleProgressIndicatorView; - path = CircleProgressIndicatorView; + name = "Chat Items"; + path = "ChattoAdditions/Source/Chat Items"; sourceTree = ""; }; - 23CC058C87AD2CF0D378D217EE78620F /* PhotoMessages */ = { + 22A2D6F75C1471E06162A375AB446526 /* Text */ = { isa = PBXGroup; children = ( - A3643B3F3761685639739C82F2307E77 /* Views */, + 53D247BEFAB9EF120E4F010A1F91C4C6 /* TextChatInputItem.swift */, ); - name = PhotoMessages; - path = PhotoMessages; + name = Text; + path = Text; sourceTree = ""; }; - 3882A61CF128C4409DEE2E421E4EA59D /* Chatto */ = { + 257642BACAAD92E7C1AD72EDAE39FD99 /* ChattoAdditions */ = { isa = PBXGroup; children = ( - 7BC69B7F07AE632F36E128EBA710E3B6 /* Chatto */, - 0830C6876687803EBD18173FA46E6A63 /* Support Files */, + AD9B97CEBDD8AFB58128F14ACBBBC412 /* ChattoAdditions.h */, + 159FED42C9E928CDD1FF5DBD90D79087 /* Chat Items */, + EE02D880D4096D83E4F20742E3285005 /* Common */, + D5B0F15B323D00F2CEBB85D530E128AB /* Input */, + 037716AFC2EE720FAFF87C19AA3236AA /* Pod */, + 321113FA91163F5F7FAE072DC193962C /* Resources */, + 93E130E146259A23C9D8BAAF6F4D321C /* Support Files */, + D70966AD7DDC68FFC143587C23E08073 /* UI Components */, ); - name = Chatto; + name = ChattoAdditions; path = ../..; sourceTree = ""; }; - 38B1AC583583BBE6F6BC3F0D4304EB05 /* BaseMessage */ = { + 28CAADEBE59305FF0AFA515404D9D6A5 /* Support Files */ = { isa = PBXGroup; children = ( - 832A168C41D7A7AA627E966DF2A8C356 /* BaseMessageModel.swift */, - 7B693A67F54700AC9E1CEFFAD94AC6B7 /* BaseMessagePresenter.swift */, - F3752B2DDCCEC3777240C81FDF4835CB /* BaseMessageViewModel.swift */, - CF9B3830DCBE50443206E844215D8C42 /* Views */, + 29247C83C1B2146FA34637DA7510391C /* Chatto.modulemap */, + 4F90FA6D4FBA6832B0032AB803E89430 /* Chatto.xcconfig */, + 55826B807503BE7DDC77A0B9310616CF /* Chatto-dummy.m */, + F3CDE366A58BC30ADF711EEC30F5562D /* Chatto-prefix.pch */, + 50A7B423BC8E6016073DE574AF7AB1F2 /* Chatto-umbrella.h */, + DC63AB949B66E4124657A68C82D45349 /* Info.plist */, ); - name = BaseMessage; - path = BaseMessage; - sourceTree = ""; - }; - 3EBC2CE1F399F5F684291CE1B620C37C /* Input */ = { - isa = PBXGroup; - children = ( - A2B4874B2572ABB358BD849D7ACA87CF /* ChatInputBar.swift */, - 1283CB1C7D70ACC15E0602BF3FC8B460 /* ChatInputBarAppearance.swift */, - 6CAFC912E0E6C2F1E9118701E9CC0C67 /* ChatInputBarPresenter.swift */, - B1C0E180CDC74BB787830995596759BB /* ChatInputItem.swift */, - 723D37912F092CDC7FE07C7680E7DB91 /* ChatInputItemView.swift */, - 8B534E5DFA8AC796EA37D37E61883101 /* ExpandableTextView.swift */, - 7AE35F493B6DBB049F8F4B563D5B5FCB /* HorizontalStackScrollView.swift */, - 516E654504B5E5266DAF101BBC037C0C /* ReusableXibView.swift */, - CB90477F384297E79AA65A34723FAEFF /* TabInputButton.swift */, - 8FD5A67CEC3EB48F047B1D80E3324A26 /* Photos */, - 990C8249FB509A7AB7479C22F1B39B83 /* Text */, - ); - name = Input; - path = Input; + name = "Support Files"; + path = "ChattoApp/Pods/Target Support Files/Chatto"; sourceTree = ""; }; - 4C196C96CB93EFBA150335A20EEA0929 /* CircleProgressIndicatorView */ = { + 2D2264A5272B8D84F1F36EB119862DC4 /* Photos */ = { isa = PBXGroup; children = ( - F9AF71BED6F86BF658FF23DC8C2E18E8 /* CircleIconView.h */, - 1FAD51A26D811C9AF2E6D980CB765EA5 /* CircleIconView.m */, - 67BCD535A4BD5454C9FCCD2788DDDB23 /* CircleProgressIndicatorView.h */, - 06A452DBBD75B075E4E8AB74245A53B8 /* CircleProgressIndicatorView.m */, - A646D9D63ADF946D93A9137B1C163530 /* CircleProgressView.h */, - E8306AB2416FCEB2E790EE0B8CE80E5D /* CircleProgressView.m */, + 6A352E08BEB4912F511344FF68E6BF19 /* PhotosChatInputItem.swift */, + 9D6F0E45378AD0C6B71082D352CC260B /* PhotosInputView.swift */, + 5D0430B2B18F1C6A279939FE7FEAB97C /* PhotosInputViewItemSizeCalculator.swift */, + A7C9C727136FE97562C19E9EED6E66C0 /* PhotosInputWithPlaceholdersDataProvider.swift */, + 75ACAAA5B806B24FB753C3D0F0C50E08 /* Camera */, + 8922CE3C7F3299BD29D9A8D1F19249D9 /* Photo */, + 8C9A67A4CC2E6F8D43D518281CF5E4CC /* Placeholder */, ); - name = CircleProgressIndicatorView; - path = CircleProgressIndicatorView; + name = Photos; + path = Photos; sourceTree = ""; }; - 506DC1B37003C9C4393D540E196DEF41 /* ChattoAdditions */ = { + 321113FA91163F5F7FAE072DC193962C /* Resources */ = { isa = PBXGroup; children = ( - 974EEC09EB754A8A64FB98935D2D451F /* ChattoAdditions */, - 0E7726F07BAD9AC95C0FB541855E2AE4 /* Resources */, - 5C4A68DF3D211320E5061770B0C3B112 /* Support Files */, + 1183C18AEF79B67C0A2F40D594CAB661 /* Chat Items */, + 0FBD099FF9E1B2A17141BC028869BC9F /* Input */, + 5872AE69F26F118252AB18027625942D /* UI Components */, ); - name = ChattoAdditions; - path = ../..; + name = Resources; sourceTree = ""; }; - 5C4A68DF3D211320E5061770B0C3B112 /* Support Files */ = { + 36B36AE384A5C05244E09BB183F280ED /* Views */ = { isa = PBXGroup; children = ( - FC4E873D2874D2207B97F63437C9827E /* ChattoAdditions.modulemap */, - DD7E5A5969A01E3A504D0135C6F25CFF /* ChattoAdditions.xcconfig */, - FB5030FB81D772482E145FF745310021 /* ChattoAdditions-dummy.m */, - A210C8B9CA993A2C831727CE2515A3DE /* ChattoAdditions-prefix.pch */, - 5A4BF7E99DD1960EA3ACDCE6F29D58BB /* ChattoAdditions-umbrella.h */, - AF5BD772CABAA008A4802F6B3A73307E /* Info.plist */, + DB3BA07DBA51A986FB2A3D18DBB01B96 /* TextBubbleView.swift */, + 7415D56E6E1F58660510D91A8808D437 /* TextMessageCollectionViewCell.swift */, + BE380B5B75A6D0600DBDE77FF958ADAE /* TextMessageCollectionViewCellDefaultStyle.swift */, ); - name = "Support Files"; - path = "ChattoApp/Pods/Target Support Files/ChattoAdditions"; + name = Views; + path = Views; sourceTree = ""; }; - 62527FE1178149FD7C66A444ED0B9E72 /* Placeholder */ = { + 474BECE036F9982A4536AD86894B69B6 /* TextMessages */ = { isa = PBXGroup; children = ( - AB80459D7464709D9459210A697ABEB1 /* PhotosInputPlaceholderCell.swift */, - 5954FF8781271F1399D91694F019C895 /* PhotosInputPlaceholderCellProvider.swift */, - 61E979305AA9460ED6872E997D1E332B /* PhotosInputPlaceholderDataProvider.swift */, + 128C8DC0F70D827A45AA0DD49B3689D6 /* TextMessageModel.swift */, + 09802F0177B7395415243C806A52ECE0 /* TextMessagePresenter.swift */, + 48A04A3FAAAFC0C4AAF832BBDE30C8D2 /* TextMessagePresenterBuilder.swift */, + 58BEF5E6331B2CB05F56D9E10C66A901 /* TextMessageViewModel.swift */, + 36B36AE384A5C05244E09BB183F280ED /* Views */, ); - name = Placeholder; - path = Placeholder; + name = TextMessages; + path = TextMessages; sourceTree = ""; }; - 6C5B434C2A4737145DBA9318EF0B164D /* Input */ = { + 52225918B65B4DB2949B01EDA32166D4 /* PhotoMessages */ = { isa = PBXGroup; children = ( - 64098046251F40CFE18AABFF28F8AF30 /* ChatInputBar.xib */, - C322C204C7D59AB4720A2CAD6C38078B /* Photos */, - 8E746D60240566BFD95B5FDB0589F010 /* Text */, + AE1FCDE5DEF7DF407DE4318DBB83DB2D /* PhotoMessageModel.swift */, + CA0E54B122003939CAFC03AE0FA4B5DC /* PhotoMessagePresenter.swift */, + 054266A433FDCDF6CE22033EFC757A22 /* PhotoMessagePresenterBuilder.swift */, + DAE542D15277B59EF8C23E3086B388A7 /* PhotoMessageViewModel.swift */, + DA4548EAA5336D422758A6B21E136C25 /* Views */, ); - name = Input; - path = Input; + name = PhotoMessages; + path = PhotoMessages; sourceTree = ""; }; - 6E5712D008F1D3582EB2F57000DC0F18 /* ChattoAdditions */ = { + 5872AE69F26F118252AB18027625942D /* UI Components */ = { isa = PBXGroup; children = ( - BDCB2EC04F318F528132F68C371EE9CD /* Source */, + FDC3BF7739102F89C6CFA8974613FF97 /* CircleProgressIndicatorView */, ); - name = ChattoAdditions; - path = ChattoAdditions; + name = "UI Components"; + path = "ChattoAdditions/Source/UI Components"; sourceTree = ""; }; - 6E581BA0F79F55A99BDC6DD7CE94EE86 /* Chat Items */ = { + 60AC651C802E347E1D6FEB7C30CB8F41 /* Chat Items */ = { isa = PBXGroup; children = ( - 059AFEC9271D0C315E234306D36AAD8D /* ChatItemDecorationAttributes.swift */, - 38B1AC583583BBE6F6BC3F0D4304EB05 /* BaseMessage */, - 1FE53EEE09D0107E8E808A19593CF20B /* PhotoMessages */, - 123E4BD328BC361B0F19F8DE23787779 /* TextMessages */, + 8FE7CDA883280C5BDFD7A2E6C025833A /* BaseChatItemPresenter.swift */, + 4510561EB01709E73B706E8CD931E27D /* ChatItemCompanion.swift */, + FFD942A947D0F30C8639C1CBAB4AF302 /* ChatItemProtocolDefinitions.swift */, + 14B80E0E9904F4BFCCEA00B151D33F58 /* DummyChatItemPresenter.swift */, ); name = "Chat Items"; - path = "Chat Items"; + path = "Chatto/Source/Chat Items"; sourceTree = ""; }; - 6E99039B2DBDAA83154805B203066FA4 /* UI Components */ = { + 6DA9B8896292756837F7099D5D261180 /* Text */ = { isa = PBXGroup; children = ( - 4C196C96CB93EFBA150335A20EEA0929 /* CircleProgressIndicatorView */, + D410A8560196ED567FD09A0BBCAAC9F8 /* Text.xcassets */, ); - name = "UI Components"; - path = "UI Components"; - sourceTree = ""; - }; - 7B31B9572453EB4544C56143E8EA6275 /* Views */ = { - isa = PBXGroup; - children = ( - 9192DB6AAAF89AE38AC08CE60442106C /* PhotoBubbleView.swift */, - 8B08B68DC4CF9C40224E26AF22C1C201 /* PhotoMessageCollectionViewCell.swift */, - 97797641F10F6F78BA754D219BF891A2 /* PhotoMessageCollectionViewCellDefaultStyle.swift */, - ); - name = Views; - path = Views; + name = Text; + path = Text; sourceTree = ""; }; - 7BC69B7F07AE632F36E128EBA710E3B6 /* Chatto */ = { + 75ACAAA5B806B24FB753C3D0F0C50E08 /* Camera */ = { isa = PBXGroup; children = ( - EF4B0348595ACE3F46D3C7E4A545F8AC /* Source */, + 3C3A8A70E90E0D7AF0C7506702585A4E /* ImagePicker.swift */, + E9ABAEAD42B233C4C72F4D8C62D264AC /* LiveCameraCaptureSession.swift */, + 129420675D0E892156C6D5F890C31DE9 /* LiveCameraCell.swift */, + DA258F8A88B4DE305AF692CEE5C855A7 /* LiveCameraCellPresenter.swift */, + BF479F563BA6247F15B5BA474AF80975 /* PhotosInputCameraPicker.swift */, + CD2407785B3CE07C044E5860 /* DeviceImagePicker.swift */, + CD240F278096B97B5422DDEC /* SimulatorImagePicker.swift */, ); - name = Chatto; - path = Chatto; + name = Camera; + path = Camera; sourceTree = ""; }; 7DB346D0F39D3F0E887471402A8071AB = { isa = PBXGroup; children = ( 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */, - DF648B3CF24B9FDB22C46C8F894C25FE /* Development Pods */, + 92F0134B58933BCDBB2DEC2938D0814F /* Development Pods */, 82B4130D6842ED151D75732401A98763 /* Frameworks */, A6DFC6FE1A1B8A2218C942218A4003DE /* Products */, 14F281301980E041BCEB24085F455283 /* Targets Support Files */, ); sourceTree = ""; }; - 82A3259FEB3C129EA515856DECC02D7A /* Views */ = { - isa = PBXGroup; - children = ( - 50CA29BA4DBF1F3595D1EF66E51A846A /* TextBubbleView.swift */, - 43BD266E3B81098EFFBADE067D9635B3 /* TextMessageCollectionViewCell.swift */, - 4DA84AD18B49FDB43FF7F5AA7617AA47 /* TextMessageCollectionViewCellDefaultStyle.swift */, - ); - name = Views; - path = Views; - sourceTree = ""; - }; 82B4130D6842ED151D75732401A98763 /* Frameworks */ = { isa = PBXGroup; children = ( @@ -569,250 +532,262 @@ name = Frameworks; sourceTree = ""; }; - 890577F793635D56571EAB43830E3AD0 /* ChatController */ = { - isa = PBXGroup; - children = ( - F665EFEF85A414EA8DF1B5518183440D /* BaseChatViewController.swift */, - FC191FB58DACFA33032B5769FE61B57A /* BaseChatViewController+AccessoryViewRevealer.swift */, - BFC3B2987C5F0E4637488241C0011017 /* BaseChatViewController+Changes.swift */, - 073E6EA5A36F5D62CADA17515C40FCA7 /* BaseChatViewController+Presenters.swift */, - 882CCF9E1FA68D196280E4AB07D2ACE4 /* BaseChatViewController+Scrolling.swift */, - 95CB91684F73416F3EAE1A889138A32F /* Collaborators */, - ); - name = ChatController; - path = ChatController; - sourceTree = ""; - }; - 8B574688B0596CC7A3E79DD1638F88EC /* Photo */ = { + 8922CE3C7F3299BD29D9A8D1F19249D9 /* Photo */ = { isa = PBXGroup; children = ( - 1FFF61B6160D563242F94B8AF99ADFAC /* PhotosInputCell.swift */, - 52D16A9323DBD7ED29D4E2C00BBBCA01 /* PhotosInputCellProvider.swift */, - 3C05B24F61DAA2992ECE5587F507A825 /* PhotosInputDataProvider.swift */, + 43B11277D4132D3470FC06F6E567361A /* PhotosInputCell.swift */, + 2E8F42B307C00B2A41B5509D17EE211A /* PhotosInputCellProvider.swift */, + DBA64E0B302B8C3DAD22C389E3F73CFB /* PhotosInputDataProvider.swift */, ); name = Photo; path = Photo; sourceTree = ""; }; - 8E746D60240566BFD95B5FDB0589F010 /* Text */ = { + 8C9A67A4CC2E6F8D43D518281CF5E4CC /* Placeholder */ = { isa = PBXGroup; children = ( - 2A0D073A6C8292215CF9C18BDE409BE1 /* Text.xcassets */, + 593C30E9D0A0055838C2854296640A47 /* PhotosInputPlaceholderCell.swift */, + 663915E51C99CC0E3FF755D7D7C9B964 /* PhotosInputPlaceholderCellProvider.swift */, + D380068E3A21DDCA854A552D0681F12A /* PhotosInputPlaceholderDataProvider.swift */, ); - name = Text; - path = Text; + name = Placeholder; + path = Placeholder; sourceTree = ""; }; - 8FD5A67CEC3EB48F047B1D80E3324A26 /* Photos */ = { + 92F0134B58933BCDBB2DEC2938D0814F /* Development Pods */ = { isa = PBXGroup; children = ( - 6F09EDCE4FD50C91A4AFE28C62E6B262 /* PhotosChatInputItem.swift */, - E3ED3BA424A1D40D404A39054EB5C078 /* PhotosInputView.swift */, - B9D8C989703AEA8071225BBE63439617 /* PhotosInputViewItemSizeCalculator.swift */, - 1CEC1807AADFF36C9C1C2D816DB9FCB0 /* PhotosInputWithPlaceholdersDataProvider.swift */, - E6D763ADD8EAD95AE8436C9F4BB02B06 /* Camera */, - 8B574688B0596CC7A3E79DD1638F88EC /* Photo */, - 62527FE1178149FD7C66A444ED0B9E72 /* Placeholder */, + C55FDA764E3DB2D166DA5F96133D7211 /* Chatto */, + 257642BACAAD92E7C1AD72EDAE39FD99 /* ChattoAdditions */, ); - name = Photos; - path = Photos; + name = "Development Pods"; sourceTree = ""; }; - 9486F27E9C712C62F6856EC5E1DFD468 /* BaseMessage */ = { + 93E130E146259A23C9D8BAAF6F4D321C /* Support Files */ = { isa = PBXGroup; children = ( - 9950012E86344A91EE5E3EF4834DEBC1 /* Views */, + C69DB6FA1411C4887C437DA609C8019E /* ChattoAdditions.modulemap */, + 8A58C02B190EA9F6AE9FB698D29DCBC1 /* ChattoAdditions.xcconfig */, + 11540919D58B7B56085DA340933B0FC1 /* ChattoAdditions-dummy.m */, + FA6D3153E92F0A38E684B3D1D2436F9C /* ChattoAdditions-prefix.pch */, + 65540FDB9B6009E3AE2CD01F047293D9 /* ChattoAdditions-umbrella.h */, + BCB8F6E24C6E77A45A1B8328196C855C /* Info.plist */, ); - name = BaseMessage; - path = BaseMessage; + name = "Support Files"; + path = "ChattoApp/Pods/Target Support Files/ChattoAdditions"; sourceTree = ""; }; - 95CB91684F73416F3EAE1A889138A32F /* Collaborators */ = { + A3D284FF1F5FD20B316386E72FC1F0F8 /* PhotoMessages */ = { isa = PBXGroup; children = ( - 6E8BD3DC93B8EF607B5A8A310BE706B5 /* AccessoryViewRevealer.swift */, - 601C752037109750FE6479BE085EBE97 /* BaseChatViewControllerView.swift */, - 9CC12F31AA8B7C20FD1784C4E98C7A9D /* ChatCollectionViewLayout.swift */, - E8284E5CBE4A071FF40F6A671DEC2421 /* ChatDataSourceProtocol.swift */, - 1FB3E6351A0819A36E159219A89F6F1B /* ChatItemPresenterFactory.swift */, - 9168D664DBAFF3A3F4A461E34999CCAB /* CollectionChanges.swift */, - 95FE43AE16BC2356351CE54411E7A09B /* KeyboardTracker.swift */, + F33BCA37F50FA5D32BCEE6A31F3CCC65 /* Views */, ); - name = Collaborators; - path = Collaborators; + name = PhotoMessages; + path = PhotoMessages; sourceTree = ""; }; - 974EEC09EB754A8A64FB98935D2D451F /* ChattoAdditions */ = { + A6DFC6FE1A1B8A2218C942218A4003DE /* Products */ = { isa = PBXGroup; children = ( - B97228A1EC709356367DB8AA381C365C /* Source */, + 0E8CD230BF38884D8498CDDAC2BD0AE7 /* Chatto.framework */, + 75A4D0F8C860BD4281E8AED08E680907 /* ChattoAdditions.framework */, + 6DAEAB5DAC1307E56BDF15E9DDC72623 /* Pods_ChattoApp.framework */, ); - name = ChattoAdditions; - path = ChattoAdditions; + name = Products; sourceTree = ""; }; - 990C8249FB509A7AB7479C22F1B39B83 /* Text */ = { + A736E97A92E826BFF6395274CED3155D /* Collaborators */ = { isa = PBXGroup; children = ( - 279C535A891EDEB34E1778086FB93E5C /* TextChatInputItem.swift */, + 6689FB692180AEBAC101759EAD0116C2 /* AccessoryViewRevealer.swift */, + 6E3235B63095189632DAF591C60640F6 /* BaseChatViewControllerView.swift */, + 2F938377FA02F6C0D99FD8706AC3C3D0 /* ChatCollectionViewLayout.swift */, + D9E20DA473442F4FE951198139ADCB9A /* ChatDataSourceProtocol.swift */, + 19441BE50AD243FC9F2E75C3DE5B8E80 /* ChatItemPresenterFactory.swift */, + 05D5600D8E7D22AC3E225129F527765E /* CollectionChanges.swift */, + F00A8A9ECFF12DCE30DABCE3E5E136D1 /* KeyboardTracker.swift */, ); - name = Text; - path = Text; + name = Collaborators; + path = Collaborators; sourceTree = ""; }; - 9950012E86344A91EE5E3EF4834DEBC1 /* Views */ = { + AE6F80F46353E07AE954D6B1EDD9F911 /* Views */ = { isa = PBXGroup; children = ( - 667C1CA3478EA3D81ADADD11F7EFB62C /* BaseMessageAssets.xcassets */, + 88C185C185C37220F2DB10F36D736542 /* BaseMessageCollectionViewCell.swift */, + 8E6B9EFA482498A8F7626B346CDED36D /* BaseMessageCollectionViewCellDefaultStyle.swift */, + DE00EA2B2F8904F2E6F64C976F9FC256 /* ViewDefinitions.swift */, ); name = Views; path = Views; sourceTree = ""; }; - A3643B3F3761685639739C82F2307E77 /* Views */ = { + B159FCCF4DA577C55F08EDA4C866A752 /* CircleProgressIndicatorView */ = { isa = PBXGroup; children = ( - 7BFD9A3C31260386847F9B7920E6FC80 /* PhotoMessageAssets.xcassets */, + 8ECE055A1AC334A37ED070AB2F0BA28D /* CircleIconView.h */, + BF40955EBCA1F843EB6FD57E0B53E165 /* CircleIconView.m */, + CA346CB6808EFE01AE75836A1F7A0698 /* CircleProgressIndicatorView.h */, + 2E72656362E555629AE7C98D6A4F14B3 /* CircleProgressIndicatorView.m */, + B9CD5BEE75214684960D2D0186F18D39 /* CircleProgressView.h */, + D5AC84164493C29F99955F0D66AA4184 /* CircleProgressView.m */, ); - name = Views; - path = Views; + name = CircleProgressIndicatorView; + path = CircleProgressIndicatorView; sourceTree = ""; }; - A518D2A6B2CC93AD5FC6EF88205E08E8 /* Chat Items */ = { + BA0E1940AC42B582281185CFA0A1E66F /* ChatController */ = { isa = PBXGroup; children = ( - 9486F27E9C712C62F6856EC5E1DFD468 /* BaseMessage */, - 23CC058C87AD2CF0D378D217EE78620F /* PhotoMessages */, + DC6D20F1A27D9120A64F63AE5A503034 /* BaseChatViewController.swift */, + 425AA302DBD7925EAF5AC414D86AEA0B /* BaseChatViewController+AccessoryViewRevealer.swift */, + 46581CCBDE0B2F41FF3265FC82B1E001 /* BaseChatViewController+Changes.swift */, + C7A3114802D19936B30971AC47A85BAD /* BaseChatViewController+Presenters.swift */, + AFB8A0CFBD7C0AE7CB03BF74160D4DBA /* BaseChatViewController+Scrolling.swift */, + A736E97A92E826BFF6395274CED3155D /* Collaborators */, ); - name = "Chat Items"; - path = "Chat Items"; + name = ChatController; + path = Chatto/Source/ChatController; sourceTree = ""; }; - A6DFC6FE1A1B8A2218C942218A4003DE /* Products */ = { + C55FDA764E3DB2D166DA5F96133D7211 /* Chatto */ = { isa = PBXGroup; children = ( - 0E8CD230BF38884D8498CDDAC2BD0AE7 /* Chatto.framework */, - 75A4D0F8C860BD4281E8AED08E680907 /* ChattoAdditions.framework */, - 6DAEAB5DAC1307E56BDF15E9DDC72623 /* Pods_ChattoApp.framework */, + 3ED7B54C4A2CE71FF6F698ED3A75D087 /* Chatto.h */, + A20874338A13B082557F5D7D5DAD78FE /* ReadOnlyOrderedDictionary.swift */, + 1985774D53B3A1654C7775FD6A07A399 /* SerialTaskQueue.swift */, + E7F3B7809E5A273EF73736CF423B9CB5 /* Utils.swift */, + 60AC651C802E347E1D6FEB7C30CB8F41 /* Chat Items */, + BA0E1940AC42B582281185CFA0A1E66F /* ChatController */, + F06DD6440DC2847A7D819C7E6C469E02 /* Pod */, + 28CAADEBE59305FF0AFA515404D9D6A5 /* Support Files */, ); - name = Products; + name = Chatto; + path = ../..; sourceTree = ""; }; - B97228A1EC709356367DB8AA381C365C /* Source */ = { + CADDED158F05C91F72D157C51CA17C45 /* BaseMessage */ = { isa = PBXGroup; children = ( - BF350EE5E9F81D532C1D8720B5E2E96B /* ChattoAdditions.h */, - 6E581BA0F79F55A99BDC6DD7CE94EE86 /* Chat Items */, - C309A2A6F86E41079093E16CF558AF91 /* Common */, - 3EBC2CE1F399F5F684291CE1B620C37C /* Input */, - 6E99039B2DBDAA83154805B203066FA4 /* UI Components */, - ); - name = Source; - path = Source; + F8F1E432BC15A34A52E6583F21C1D526 /* BaseMessageModel.swift */, + 8B229F9BCB567E2FBB872000A9E0ECD2 /* BaseMessagePresenter.swift */, + 124000A3BF8B8398B7A22D9123A19ED0 /* BaseMessageViewModel.swift */, + AE6F80F46353E07AE954D6B1EDD9F911 /* Views */, + ); + name = BaseMessage; + path = BaseMessage; sourceTree = ""; }; - BDCB2EC04F318F528132F68C371EE9CD /* Source */ = { + D5B0F15B323D00F2CEBB85D530E128AB /* Input */ = { isa = PBXGroup; children = ( - A518D2A6B2CC93AD5FC6EF88205E08E8 /* Chat Items */, - 6C5B434C2A4737145DBA9318EF0B164D /* Input */, - 05D31F297955F0F0DD4FEC528EE49A5F /* UI Components */, + 92B5B3D91CB163330A0FD333E60DDCAB /* ChatInputBar.swift */, + 247A5E9062AE185F8515C9C35998CD31 /* ChatInputBarAppearance.swift */, + 1270F50E949DF5F1FB5E317CBFC4E308 /* ChatInputBarPresenter.swift */, + 84E401C6009E6CBFD1139547BA604FB9 /* ChatInputItem.swift */, + 5AA587742C30D113BA584FA54710FD0A /* ChatInputItemView.swift */, + 1D001EAE1C66ADDE971DE7417AA9FC5D /* ExpandableTextView.swift */, + 2DD8E4BB9487A80F70C29231EA1E6295 /* HorizontalStackScrollView.swift */, + F14F86937C99E9B9182BDC8D3D66B884 /* ReusableXibView.swift */, + A500CFC58AF814D90C69A58ED2780972 /* TabInputButton.swift */, + 2D2264A5272B8D84F1F36EB119862DC4 /* Photos */, + 22A2D6F75C1471E06162A375AB446526 /* Text */, ); - name = Source; - path = Source; + name = Input; + path = ChattoAdditions/Source/Input; sourceTree = ""; }; - C309A2A6F86E41079093E16CF558AF91 /* Common */ = { + D70966AD7DDC68FFC143587C23E08073 /* UI Components */ = { isa = PBXGroup; children = ( - B3F4F4B83967BC9B3CE9BE3A0AA9FFA4 /* Alignment.swift */, - D9C0DFBB022F918F067C3508B631D46C /* AnimationUtils.swift */, - 78B15F2E139A973129D3B796443940EA /* CGFloat+Additions.swift */, - 843ABB13513C10E807F86CC18C34C28A /* CGPoint+Additions.swift */, - 982E2B0589FCEB087B5B8CD7D921E249 /* CGRect+Additions.swift */, - 4B988C88B34FC72601AB485784C9FFE9 /* CGSize+Additions.swift */, - 8EC3D00120D564DF1693470D628B4F20 /* Observable.swift */, - 9918F3D21890AF0CC91778D2BCD42999 /* UIColor+Additions.swift */, - 17DFFF33E8AA17666C7538D5B4FACC48 /* UIEdgeInsets+Additions.swift */, - 758F9F275BCBC117A58411FFD5CD29D5 /* UIImage+Additions.swift */, - 5C9D3C524326F412C004249E9C380E28 /* UIScreen+Scale.swift */, - 3AEA132001D95F5226910B89D775F59E /* UIView+Additions.swift */, + B159FCCF4DA577C55F08EDA4C866A752 /* CircleProgressIndicatorView */, ); - name = Common; - path = Common; + name = "UI Components"; + path = "ChattoAdditions/Source/UI Components"; sourceTree = ""; }; - C322C204C7D59AB4720A2CAD6C38078B /* Photos */ = { + DA250B7B16B2F7EC30B8F58955416CAF /* Pods-ChattoApp */ = { isa = PBXGroup; children = ( - D2B2293D7D418420AB03F0584A71EB69 /* Photos.xcassets */, + 65042A58B2844DF8AA45E985932D0640 /* Info.plist */, + 76C8CE48F21BBD79C3E57E7C28E5A051 /* Pods-ChattoApp.modulemap */, + 504410F6DF88345B0FC1D58FA4067A66 /* Pods-ChattoApp-acknowledgements.markdown */, + F60670530F6217B4AA01EE0B7063477A /* Pods-ChattoApp-acknowledgements.plist */, + 4E3F504B152268D2F40F52A62C446408 /* Pods-ChattoApp-dummy.m */, + E6E414FA5AE66A6E8074D4AAED7C914E /* Pods-ChattoApp-frameworks.sh */, + D2408AA70D73DDBDEFCBB4C7ADE29172 /* Pods-ChattoApp-resources.sh */, + D26F81AF79CA37D208D3C6511A534949 /* Pods-ChattoApp-umbrella.h */, + 9D6AE0AE7C9D70F0256D868912937354 /* Pods-ChattoApp.debug.xcconfig */, + 196E807B9D564A10BFF03F9C19F2A61B /* Pods-ChattoApp.release.xcconfig */, ); - name = Photos; - path = Photos; + name = "Pods-ChattoApp"; + path = "Target Support Files/Pods-ChattoApp"; sourceTree = ""; }; - CF9B3830DCBE50443206E844215D8C42 /* Views */ = { + DA4548EAA5336D422758A6B21E136C25 /* Views */ = { isa = PBXGroup; children = ( - 1CEA2DA3812AB02CD792CB48D880697F /* BaseMessageCollectionViewCell.swift */, - 12DA3EB29892458F3C380BEFA109F455 /* BaseMessageCollectionViewCellDefaultStyle.swift */, - 7A82EFB6060E3E0BD7CF641642BF1F35 /* ViewDefinitions.swift */, + F34BC85B23764467817891963F9FC304 /* PhotoBubbleView.swift */, + BCD5E1BC57BB87C53CABBB55C3A86CE1 /* PhotoMessageCollectionViewCell.swift */, + E90B6821F7D9C990696D159A8A8F3885 /* PhotoMessageCollectionViewCellDefaultStyle.swift */, ); name = Views; path = Views; sourceTree = ""; }; - DF648B3CF24B9FDB22C46C8F894C25FE /* Development Pods */ = { + DBBDA500739FCC25C30332142CF11E8C /* BaseMessage */ = { isa = PBXGroup; children = ( - 3882A61CF128C4409DEE2E421E4EA59D /* Chatto */, - 506DC1B37003C9C4393D540E196DEF41 /* ChattoAdditions */, + 0DE5E08F571511CE52E70557E53273A0 /* Views */, ); - name = "Development Pods"; + name = BaseMessage; + path = BaseMessage; sourceTree = ""; }; - E183C50A4ACCDF227C27243B948F55BA /* Pods-ChattoApp */ = { + EE02D880D4096D83E4F20742E3285005 /* Common */ = { isa = PBXGroup; children = ( - 230194971784138EFDD356DD09D531CB /* Info.plist */, - 46482F96934733214320322EC2918D88 /* Pods-ChattoApp.modulemap */, - E94E7905DA30FCDE6EE3BAEB5579CC80 /* Pods-ChattoApp-acknowledgements.markdown */, - C5CB3BCEEF59DC9F22F70C7D1B1E98F5 /* Pods-ChattoApp-acknowledgements.plist */, - 52D72C6BD70BD003D7302046B549A377 /* Pods-ChattoApp-dummy.m */, - A2368BEEF11E9E87C42E3D6D3082D97D /* Pods-ChattoApp-frameworks.sh */, - A8AFCDC34A96C2B57F7A1C1A332382CB /* Pods-ChattoApp-resources.sh */, - 7980454BC9FD75106EBBF49DA18E603B /* Pods-ChattoApp-umbrella.h */, - 9661D8308C0146658FC05299FF59AA85 /* Pods-ChattoApp.debug.xcconfig */, - B20598F484478DFEE1B31B07C6FA131F /* Pods-ChattoApp.release.xcconfig */, + F207983FB08AF781AE4FF881D8960FF0 /* Alignment.swift */, + AB7CAC59BED45C08C2E61CC07F82A24E /* AnimationUtils.swift */, + C40601F885EEF498338F0F3D0940B99F /* CGFloat+Additions.swift */, + FD28FF28BA5E3CE8FC894E71C061E5F3 /* CGPoint+Additions.swift */, + 2AE9343D0A945ED2AC24F7B0A390A4E7 /* CGRect+Additions.swift */, + 8C59631DCA268A4285E100821B4E160B /* CGSize+Additions.swift */, + A62614FA915BDC7A6FA98EC080BC0FE2 /* Observable.swift */, + B4DF0809CC047786F4137E42373F4134 /* UIColor+Additions.swift */, + 653AC366611432A9FD809ECC143989E4 /* UIEdgeInsets+Additions.swift */, + AD6D7F742DFE0768F96231D1F0733523 /* UIImage+Additions.swift */, + F8A201C1EFC6CB61F9E130E8293153B4 /* UIScreen+Scale.swift */, + 2A8F4A40C1DC22FF561A2874120DDC74 /* UIView+Additions.swift */, ); - name = "Pods-ChattoApp"; - path = "Target Support Files/Pods-ChattoApp"; + name = Common; + path = ChattoAdditions/Source/Common; sourceTree = ""; }; - E6D763ADD8EAD95AE8436C9F4BB02B06 /* Camera */ = { + F06DD6440DC2847A7D819C7E6C469E02 /* Pod */ = { isa = PBXGroup; children = ( - F723EDCBADAEA4756C1A3BB21FD658BF /* LiveCameraCaptureSession.swift */, - EF50565048825E6E2A3A0747B0525165 /* LiveCameraCell.swift */, - 67DDD937E461DDAB00ECD53C1088BB85 /* LiveCameraCellPresenter.swift */, - E59FE62630BF2B921146B5A00041566A /* PhotosInputCameraPicker.swift */, + 050EA91E2E5DB5E650DBAF3DD412C1FB /* Chatto.podspec */, ); - name = Camera; - path = Camera; + name = Pod; sourceTree = ""; }; - EF4B0348595ACE3F46D3C7E4A545F8AC /* Source */ = { + F33BCA37F50FA5D32BCEE6A31F3CCC65 /* Views */ = { isa = PBXGroup; children = ( - 0B5D4369BA1DB086393AC1B9A92A22E5 /* Chatto.h */, - C2E90819091BCEF228F57100FF8C977E /* ReadOnlyOrderedDictionary.swift */, - E89F916D99A1180299922EB3BE164AFA /* SerialTaskQueue.swift */, - 6AC89C37B73E5085F85C15F6D398BC06 /* Utils.swift */, - 0F47DF814D4816A9329AB2C324D99A8D /* Chat Items */, - 890577F793635D56571EAB43830E3AD0 /* ChatController */, - ); - name = Source; - path = Source; + F7B09B7BBFF294077116E789BA62D48C /* PhotoMessageAssets.xcassets */, + ); + name = Views; + path = Views; + sourceTree = ""; + }; + FDC3BF7739102F89C6CFA8974613FF97 /* CircleProgressIndicatorView */ = { + isa = PBXGroup; + children = ( + 42EB7C4A601A189E1ED3EF6E420EEDA7 /* CircleProgressIndicator.xcassets */, + ); + name = CircleProgressIndicatorView; + path = CircleProgressIndicatorView; sourceTree = ""; }; /* End PBXGroup section */ @@ -826,24 +801,24 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 616542D03B8571C4A71943D768434ADB /* Headers */ = { + 4C2E6440085347639274B5E55695A3CC /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 1B7E27A2ABC74CA4337F07AB65F7A104 /* Chatto-umbrella.h in Headers */, - AB66066339703AF177504A94913154AF /* Chatto.h in Headers */, + 6CB02D239F26C9991C816CD677715057 /* Chatto-umbrella.h in Headers */, + 71E16DAE8DC770EB8839FFCED579143E /* Chatto.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - E28941844463DCA0B42D2C0457B2E170 /* Headers */ = { + 713CFA1E060E0E1542BF6184168B0132 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - AD8CA62F9FC1D181F98A45D8E482CA19 /* ChattoAdditions-umbrella.h in Headers */, - 6EB65F7502843EA07E53805FEA7CA6DB /* ChattoAdditions.h in Headers */, - 8077AF8BB8ED80B9F65E5889B7BF18F9 /* CircleIconView.h in Headers */, - 88FA3F7DE4449E92AED3A7F972B1C120 /* CircleProgressIndicatorView.h in Headers */, - 218809CDAE0153784F84C63409B7C855 /* CircleProgressView.h in Headers */, + ED3A9540FCF8929A92605DD482096345 /* ChattoAdditions-umbrella.h in Headers */, + D9F713EAC4BD81B407957E3E29FEDE79 /* ChattoAdditions.h in Headers */, + 6D7F13AD0766C7171AA27435010DBD51 /* CircleIconView.h in Headers */, + C5CA29B99659A34C87C587840BE8B1CA /* CircleProgressIndicatorView.h in Headers */, + 3E43C0A2E3955FC38026140E26B4E602 /* CircleProgressView.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -854,9 +829,9 @@ isa = PBXNativeTarget; buildConfigurationList = 0C6B695FB9120E769A46CB6A2BE56E58 /* Build configuration list for PBXNativeTarget "Chatto" */; buildPhases = ( - 8266F558F629D1DBF748105BD47458A5 /* Sources */, + FC7718CCB5674C515F6F48C858A4A737 /* Sources */, 0B96D432D4DE15EDE40B14E86F312EE6 /* Frameworks */, - 616542D03B8571C4A71943D768434ADB /* Headers */, + 4C2E6440085347639274B5E55695A3CC /* Headers */, ); buildRules = ( ); @@ -867,25 +842,6 @@ productReference = 0E8CD230BF38884D8498CDDAC2BD0AE7 /* Chatto.framework */; productType = "com.apple.product-type.framework"; }; - 43BDE8C9B9E5D63986DBEFDF1B4BA044 /* ChattoAdditions */ = { - isa = PBXNativeTarget; - buildConfigurationList = A6B2897B21AC12F3586E32B679B6256A /* Build configuration list for PBXNativeTarget "ChattoAdditions" */; - buildPhases = ( - 634D2BB3A0ACB1533B78B6E1661A0C70 /* Sources */, - 80D1D254F5B9CB6F25D4BD27ADF04F0D /* Frameworks */, - E28941844463DCA0B42D2C0457B2E170 /* Headers */, - B9371976F38854D869F5421E173B2B25 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 4618F1CDD7CF0E38CE64FC51D3F559A0 /* PBXTargetDependency */, - ); - name = ChattoAdditions; - productName = ChattoAdditions; - productReference = 75A4D0F8C860BD4281E8AED08E680907 /* ChattoAdditions.framework */; - productType = "com.apple.product-type.framework"; - }; 83A90C41E2F6BCB5E19B5378BEB0B42A /* Pods-ChattoApp */ = { isa = PBXNativeTarget; buildConfigurationList = 1ACE60E84B8FD1DA1F249B79678D2A4E /* Build configuration list for PBXNativeTarget "Pods-ChattoApp" */; @@ -905,14 +861,33 @@ productReference = 6DAEAB5DAC1307E56BDF15E9DDC72623 /* Pods_ChattoApp.framework */; productType = "com.apple.product-type.framework"; }; + DCD24D044DCB3D3A8BB5461EC53DE4E2 /* ChattoAdditions */ = { + isa = PBXNativeTarget; + buildConfigurationList = D409FEDA817C0F3E01C4F23EB3831EDF /* Build configuration list for PBXNativeTarget "ChattoAdditions" */; + buildPhases = ( + DCFDEAF29A5E7F99544415DC497AD9AA /* Sources */, + F404562FFC16518B5FBEF36D049BDC46 /* Frameworks */, + 713CFA1E060E0E1542BF6184168B0132 /* Headers */, + 45C913FEB24561DECD46D14C9989EDE8 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + E3A00BAC4CD0E9F1098F630E28E6C8E6 /* PBXTargetDependency */, + ); + name = ChattoAdditions; + productName = ChattoAdditions; + productReference = 75A4D0F8C860BD4281E8AED08E680907 /* ChattoAdditions.framework */; + productType = "com.apple.product-type.framework"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ D41D8CD98F00B204E9800998ECF8427E /* Project object */ = { isa = PBXProject; attributes = { - LastSwiftUpdateCheck = 0830; - LastUpgradeCheck = 0700; + LastSwiftUpdateCheck = 0930; + LastUpgradeCheck = 0930; }; buildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */; compatibilityVersion = "Xcode 3.2"; @@ -927,151 +902,154 @@ projectRoot = ""; targets = ( 0564C2782D1F2F8E464CB332E0FE7246 /* Chatto */, - 43BDE8C9B9E5D63986DBEFDF1B4BA044 /* ChattoAdditions */, + DCD24D044DCB3D3A8BB5461EC53DE4E2 /* ChattoAdditions */, 83A90C41E2F6BCB5E19B5378BEB0B42A /* Pods-ChattoApp */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - B9371976F38854D869F5421E173B2B25 /* Resources */ = { + 45C913FEB24561DECD46D14C9989EDE8 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 4A5F444E097190951A984B0E9F92A854 /* BaseMessageAssets.xcassets in Resources */, - 67DF62CE955F0664E2F13AE4FEC7FE0D /* ChatInputBar.xib in Resources */, - A82CAFD9B68DB130FC3153E3B1ECFC78 /* CircleProgressIndicator.xcassets in Resources */, - F262790F0C84E6FD8003C3066A872EFD /* PhotoMessageAssets.xcassets in Resources */, - 0D5098FA67D7F514DB44D87A6D9AE2A3 /* Photos.xcassets in Resources */, - D7502DE46962489626E08273BB2F7305 /* Text.xcassets in Resources */, + AAC97E757D1592775A9A9499FB555858 /* BaseMessageAssets.xcassets in Resources */, + 00E3F827CF29D95C20BC041DE0B3E415 /* ChatInputBar.xib in Resources */, + 59F5745760DD39E7FDE89A10CA21B948 /* CircleProgressIndicator.xcassets in Resources */, + 7D20450EADD4BAEBAC1E1028D9768995 /* PhotoMessageAssets.xcassets in Resources */, + 1B5BAA97C46FBC289D2B770A2CF26195 /* Photos.xcassets in Resources */, + 759100F5B47B2E76F5CA16E2F37532D3 /* Text.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - 634D2BB3A0ACB1533B78B6E1661A0C70 /* Sources */ = { + CDA3B34BC6D97B31FB60F315D389C2F7 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 414D7F5D9C00445F6C34865BBE736FD0 /* Alignment.swift in Sources */, - C12427076692D9528A8D85B3CC5282AF /* AnimationUtils.swift in Sources */, - 273488FCB19BF7432E84B75D980EB1DF /* BaseMessageCollectionViewCell.swift in Sources */, - B682C23FD898157CD88987D206F662DF /* BaseMessageCollectionViewCellDefaultStyle.swift in Sources */, - C4DB841966496979B3DBB024F5A67921 /* BaseMessageModel.swift in Sources */, - 5052993A379605DE3771A704AB9B3BCD /* BaseMessagePresenter.swift in Sources */, - 4BF1A190683FB1C28990E664A58C241F /* BaseMessageViewModel.swift in Sources */, - F42FD998FF7FF4E4807A990BFDF37340 /* CGFloat+Additions.swift in Sources */, - E584A50DEA4E624D5517C201509FF453 /* CGPoint+Additions.swift in Sources */, - 532F79E733CD3D076495827F49F46150 /* CGRect+Additions.swift in Sources */, - 840E9EC534B91037C1E71C98305D9360 /* CGSize+Additions.swift in Sources */, - A227FCB9E4096C8B68E62E3C302450A3 /* ChatInputBar.swift in Sources */, - 6FD3B2B0E4D4345FD6BAFBEAEC42B2EF /* ChatInputBarAppearance.swift in Sources */, - 9E026BE35745F76D3F41CF75A2AAAD1B /* ChatInputBarPresenter.swift in Sources */, - 9D7852562750FC8C3A15D028835135F4 /* ChatInputItem.swift in Sources */, - 23E3BD896792D82204A618B40DDAF87E /* ChatInputItemView.swift in Sources */, - 22ED2E6A2FBE9CA5AF0A23212A215352 /* ChatItemDecorationAttributes.swift in Sources */, - D44EF0A6DF582C0FD1207CD4566CB8DA /* ChattoAdditions-dummy.m in Sources */, - 48AEA441275A3ECAB76E063A3A160C76 /* CircleIconView.m in Sources */, - 87EB590F2C8DF9875384E8038CF9B441 /* CircleProgressIndicatorView.m in Sources */, - 4717A39922B564C6F7D3099C5BB09865 /* CircleProgressView.m in Sources */, - F6CF2E800519B4B517D8EF399148740C /* ExpandableTextView.swift in Sources */, - 321CA728E73B9212E43539EAF0608ADF /* HorizontalStackScrollView.swift in Sources */, - 1053BEAE885884DFDCEC8FBC4FB7136C /* LiveCameraCaptureSession.swift in Sources */, - BE2105E7A04C9EBF4F1AC98F089BF0E5 /* LiveCameraCell.swift in Sources */, - 116F2DBEE6F8A35F42C2BDA11265CD74 /* LiveCameraCellPresenter.swift in Sources */, - BBE106C464EDA83E8FE45D2F4600219C /* Observable.swift in Sources */, - 2FCE4E038352892BCC8C4058441EEC76 /* PhotoBubbleView.swift in Sources */, - A20E1E4D0B51D330521A038B1C171283 /* PhotoMessageCollectionViewCell.swift in Sources */, - 292DE5C69D726099DBDAB24E90704D09 /* PhotoMessageCollectionViewCellDefaultStyle.swift in Sources */, - C0444770A88F1C893336E24773711D95 /* PhotoMessageModel.swift in Sources */, - 0377DDE546365121E36564598F636E11 /* PhotoMessagePresenter.swift in Sources */, - E21B42AF9CC775F6394F72FE4ABAF6CF /* PhotoMessagePresenterBuilder.swift in Sources */, - 72553F5E91B91B9401218D8DA70B6D57 /* PhotoMessageViewModel.swift in Sources */, - 940040010AFE7B2393D460C463784854 /* PhotosChatInputItem.swift in Sources */, - 178BBA9F9E0917F778E1D723A36AB6BE /* PhotosInputCameraPicker.swift in Sources */, - C994312CE7B555897DEE0E92C38EAB07 /* PhotosInputCell.swift in Sources */, - BEDDA117D39966B4ADC066A869B73861 /* PhotosInputCellProvider.swift in Sources */, - 33AF3D397BE3CEF084CD4B3779768A21 /* PhotosInputDataProvider.swift in Sources */, - 3ACB8DF2E370A0E0B55654577571CF4C /* PhotosInputPlaceholderCell.swift in Sources */, - DBC4A7969FBE1B60FAE02682057C1724 /* PhotosInputPlaceholderCellProvider.swift in Sources */, - 3B51C41F3877FA70C0B935E8B353C0B0 /* PhotosInputPlaceholderDataProvider.swift in Sources */, - BF49B6C57AAA1D30BA96F5A441C7E243 /* PhotosInputView.swift in Sources */, - DB110C7A53F27B3AD41017CE93966236 /* PhotosInputViewItemSizeCalculator.swift in Sources */, - 726C03A23ADD2E9B9DA8045F6ED9BF3F /* PhotosInputWithPlaceholdersDataProvider.swift in Sources */, - 427197CCD51E95F64AC5D979F636E4AF /* ReusableXibView.swift in Sources */, - BF344AF6015129DA9281F11EF345F69A /* TabInputButton.swift in Sources */, - 59A28A3E3DFD01AFF0B4C84D68C1DFC1 /* TextBubbleView.swift in Sources */, - 2BD76CF4C9A3B6A260DD0525EE1610D2 /* TextChatInputItem.swift in Sources */, - 810519B1702F6D3E5BD0D753548D2516 /* TextMessageCollectionViewCell.swift in Sources */, - C97B858B3DCA74018CBC3CE09B013DF6 /* TextMessageCollectionViewCellDefaultStyle.swift in Sources */, - 0908F28782860638539F67028CA33880 /* TextMessageModel.swift in Sources */, - 4FF7351F95B481A0BB97CF70FF00BB84 /* TextMessagePresenter.swift in Sources */, - 5F29366244D8C4D898D869CDED78FB1F /* TextMessagePresenterBuilder.swift in Sources */, - FAB63FBEFA74B1AE08945265914E12DC /* TextMessageViewModel.swift in Sources */, - C9BD3038AE74FDD4F3BD3601D7FFF83B /* UIColor+Additions.swift in Sources */, - A442B461BE91D0FECB142345E0301ECE /* UIEdgeInsets+Additions.swift in Sources */, - F6AD5CDB17D9D3D8B175C4B96232D043 /* UIImage+Additions.swift in Sources */, - 206F482C0C6CA1A1D631425FC7B061D3 /* UIScreen+Scale.swift in Sources */, - 4F9329574A81360A5B6B8D962D8BA736 /* UIView+Additions.swift in Sources */, - 49A9C8E7E321C59D0A4788EF6922D3D1 /* ViewDefinitions.swift in Sources */, + 93AC0348CFA081A20308C0FFA9A85A3A /* Pods-ChattoApp-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 8266F558F629D1DBF748105BD47458A5 /* Sources */ = { + DCFDEAF29A5E7F99544415DC497AD9AA /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 9E0879FB9F4E503B226F826947D0C238 /* AccessoryViewRevealer.swift in Sources */, - 551E32A56BA1409332FCA489D1F2BD18 /* BaseChatItemPresenter.swift in Sources */, - 13A6CB81528D52C7BC3E571B84800866 /* BaseChatViewController+AccessoryViewRevealer.swift in Sources */, - 1C8A0EFD3EB2A1802B0686B26770CA00 /* BaseChatViewController+Changes.swift in Sources */, - 84C0E170146FF3AE917C0F70D7ABE740 /* BaseChatViewController+Presenters.swift in Sources */, - D211781B9A7359B64504CEF607B33539 /* BaseChatViewController+Scrolling.swift in Sources */, - F97A060F8F8A4EA5625817B853DE24EA /* BaseChatViewController.swift in Sources */, - 642ABB656474A70303ED5D1784CEE307 /* BaseChatViewControllerView.swift in Sources */, - A845CC193EC7C2DB469C981A38833BE6 /* ChatCollectionViewLayout.swift in Sources */, - 3AFCF8BD14A727B60317F765E63BA5A3 /* ChatDataSourceProtocol.swift in Sources */, - D7BC6DD82B0DE5B63EE0AF36503B39CF /* ChatItemCompanion.swift in Sources */, - D9F3F80693F694583820F71692B152FC /* ChatItemPresenterFactory.swift in Sources */, - 09C3BA0AC03C054EF21C73B417C47F0B /* ChatItemProtocolDefinitions.swift in Sources */, - 93DF1C22384B663AEA6FC1A9CB8D60C4 /* Chatto-dummy.m in Sources */, - 938553A9900F0ED129896CE9335247EC /* CollectionChanges.swift in Sources */, - 0E3A877EFED45D642822D20A5E9130ED /* DummyChatItemPresenter.swift in Sources */, - 54B4530688F6EC423AACEF083D286FF9 /* KeyboardTracker.swift in Sources */, - C37E6371A36AA5A01B9728926E539097 /* ReadOnlyOrderedDictionary.swift in Sources */, - 00E7CFDA07DB9D3C1349719B5F30B4DA /* SerialTaskQueue.swift in Sources */, - BEBEDDB6DB64A74879929323D7FF3BE0 /* Utils.swift in Sources */, + 28075012B4DC5D40D6B054A83AA81BF8 /* Alignment.swift in Sources */, + A06C6E4AAEF5C39720886BA18621C919 /* AnimationUtils.swift in Sources */, + D653E8F4A1DAF0E61DF020F622DBA1D1 /* BaseMessageCollectionViewCell.swift in Sources */, + 00D6D10980978A3AD87F2EFA18D5FA53 /* BaseMessageCollectionViewCellDefaultStyle.swift in Sources */, + 48592135C286A8497752C7ED03A23CEE /* BaseMessageModel.swift in Sources */, + 93CD8A20A6A2DAA0C36A20F67C103030 /* BaseMessagePresenter.swift in Sources */, + 4C1E87BDED189A0548E50B02C69062B4 /* BaseMessageViewModel.swift in Sources */, + DAD6EDFF6F4E25EFB1DC50E550732E15 /* CGFloat+Additions.swift in Sources */, + DF03B550764571CA287E0B4B8CFD5DB2 /* CGPoint+Additions.swift in Sources */, + A528EB120A5E7DC270E7E2F133D85B3C /* CGRect+Additions.swift in Sources */, + 2500D71C245FFE4D6B9BFD4A2A1EDB85 /* CGSize+Additions.swift in Sources */, + CEB217F536637B792CD39700C6C09996 /* ChatInputBar.swift in Sources */, + F0A451A28135770A80CAE3312B2E396F /* ChatInputBarAppearance.swift in Sources */, + 512A57DEB9B46A901C1FC10527041D36 /* ChatInputBarPresenter.swift in Sources */, + E087569EF5E356913098318056B77BE3 /* ChatInputItem.swift in Sources */, + DF0DD294440693888AE371BD30638C9A /* ChatInputItemView.swift in Sources */, + 6355C90A3190FD3F4F748D9A50907DDE /* ChatItemDecorationAttributes.swift in Sources */, + C888A6F89201A5B9148B199FCC3A1329 /* ChattoAdditions-dummy.m in Sources */, + A1807B0B711E646B1E57F637E3D467FF /* CircleIconView.m in Sources */, + DFB12A9A065E868FE0EE84C6126EA37C /* CircleProgressIndicatorView.m in Sources */, + 43EB2F4B3C928EC0ABDE758E9A027F61 /* CircleProgressView.m in Sources */, + CC4F915B4A3E45BBFE4F9C409C345A2F /* ExpandableTextView.swift in Sources */, + 0D505833F07BC65FEBC299D37006365D /* HorizontalStackScrollView.swift in Sources */, + 60C8B2C6A1B1CE596A82309FDB96EE56 /* ImagePicker.swift in Sources */, + 7507614804E28F304AD99EE5C8B67C43 /* LiveCameraCaptureSession.swift in Sources */, + 2CDB23CA2683F68395293EE5DBD427A8 /* LiveCameraCell.swift in Sources */, + 3E32D7EA354D45031B987D3B0BA6B1F8 /* LiveCameraCellPresenter.swift in Sources */, + E601017C14729E02A50CC61844F9FC16 /* Observable.swift in Sources */, + 3E008FC7A2FDDCCCF61C7BD94C131EBE /* PhotoBubbleView.swift in Sources */, + AA0B570656617383FE7AFCC873A3F6C0 /* PhotoMessageCollectionViewCell.swift in Sources */, + A58BD56650DE9663F4A6B51B114E8921 /* PhotoMessageCollectionViewCellDefaultStyle.swift in Sources */, + 78F46BA4780730F9A3B1D419A4DC56BF /* PhotoMessageModel.swift in Sources */, + 1C0E2D574DEAA28340343074A044380C /* PhotoMessagePresenter.swift in Sources */, + 2EDA353EE9074C181A7F628FF5255F35 /* PhotoMessagePresenterBuilder.swift in Sources */, + FD053593E7C6C6E82265C241782F45F9 /* PhotoMessageViewModel.swift in Sources */, + 8F80B5B62BFD9C705AB6108ED449CCC1 /* PhotosChatInputItem.swift in Sources */, + 9ECEBD5C0D9255BF6888EB9D5D19D77A /* PhotosInputCameraPicker.swift in Sources */, + 8B417560642B39B55AB772AAAB4A5E25 /* PhotosInputCell.swift in Sources */, + 16361DBD3920836499A58C212E9B825F /* PhotosInputCellProvider.swift in Sources */, + 0EA4A981038BAA87CFD193759A602F8F /* PhotosInputDataProvider.swift in Sources */, + 14E1077906B79E35EB6C0D452E98E102 /* PhotosInputPlaceholderCell.swift in Sources */, + ED8761914EA48870B07EF342B4C412B1 /* PhotosInputPlaceholderCellProvider.swift in Sources */, + 919F6A1D05D00F1D815A5D6E30C16822 /* PhotosInputPlaceholderDataProvider.swift in Sources */, + 0C16A79AD329A1AE31DCB63829C8C87B /* PhotosInputView.swift in Sources */, + BD92A029D5888E3E83B13232899832BB /* PhotosInputViewItemSizeCalculator.swift in Sources */, + 259AE37389BAB08398971B61C68C0202 /* PhotosInputWithPlaceholdersDataProvider.swift in Sources */, + C12D5C1C7CF2DCC15D64201569A6A107 /* ReusableXibView.swift in Sources */, + 13F170B91F743BE7E900034704945334 /* TabInputButton.swift in Sources */, + F721CCDBC314636F25FC84F9002014A3 /* TextBubbleView.swift in Sources */, + FB8866C5639D10A9D6EF04ADC4667542 /* TextChatInputItem.swift in Sources */, + 3A87BB2197D9516F6A159670B8E98C26 /* TextMessageCollectionViewCell.swift in Sources */, + A6A57EC7C8F3AA159B14477221F8C91A /* TextMessageCollectionViewCellDefaultStyle.swift in Sources */, + CC1DC524A231D132832C59A91CB5F2BC /* TextMessageModel.swift in Sources */, + 5DB4ECF73BD0118F052100A502727579 /* TextMessagePresenter.swift in Sources */, + 31157864FC8DD8494902BD87CAEC950E /* TextMessagePresenterBuilder.swift in Sources */, + 8060B6D103DA4161BF922E14847B8736 /* TextMessageViewModel.swift in Sources */, + 902FA0B2997BA4D8AA0B17164278BBA7 /* UIColor+Additions.swift in Sources */, + CABD18923698A9608DFCC1A0A27A0C80 /* UIEdgeInsets+Additions.swift in Sources */, + FA5A27A37622D781F82E51B25551880F /* UIImage+Additions.swift in Sources */, + 3FE7D49AAD12760C3809D3EF079033DF /* UIScreen+Scale.swift in Sources */, + 39FE01D5BD4A9F43AE61C39CCFC868D8 /* UIView+Additions.swift in Sources */, + D383F5FDC2D260D8358A206310B7FC68 /* ViewDefinitions.swift in Sources */, + CD240780265A33455A58308A /* DeviceImagePicker.swift in Sources */, + CD240FBFE867CEE2C20A2C71 /* SimulatorImagePicker.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - CDA3B34BC6D97B31FB60F315D389C2F7 /* Sources */ = { + FC7718CCB5674C515F6F48C858A4A737 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 93AC0348CFA081A20308C0FFA9A85A3A /* Pods-ChattoApp-dummy.m in Sources */, + 1EBAAE2E59B3FDA14AAD805DFC2707D6 /* AccessoryViewRevealer.swift in Sources */, + 217914BBAE3847BF873C1386E1FAE9AA /* BaseChatItemPresenter.swift in Sources */, + 0D523E4FE6115F7A55C3AC1084204E4B /* BaseChatViewController+AccessoryViewRevealer.swift in Sources */, + E3FF292D87A07BA67A729AD36AEF5076 /* BaseChatViewController+Changes.swift in Sources */, + 0FD9575740CF2F8B25FF917D414DD453 /* BaseChatViewController+Presenters.swift in Sources */, + 010040154F5F454E72EF1468790FA4CD /* BaseChatViewController+Scrolling.swift in Sources */, + F6A0282EDBB0B7785CC58190CCFE9F8B /* BaseChatViewController.swift in Sources */, + 2F96149719263B6CB07600157780AF21 /* BaseChatViewControllerView.swift in Sources */, + 7B0EBDA75601E029EA64F03E579D0663 /* ChatCollectionViewLayout.swift in Sources */, + 1D22A8C6A20F2FE60BB35918061C3ECB /* ChatDataSourceProtocol.swift in Sources */, + FC9C847E639368AE9DCD4F4C0D745EF3 /* ChatItemCompanion.swift in Sources */, + 8867B0709DE6851C45CD27BC45D5E4E7 /* ChatItemPresenterFactory.swift in Sources */, + 33C9126C93D8B4F3D6A1543B4C98618E /* ChatItemProtocolDefinitions.swift in Sources */, + F44F9E965318C8D275A6D6F27D2BB14E /* Chatto-dummy.m in Sources */, + 532E7EF69E5BE6723F2A4EFAB7ED6607 /* CollectionChanges.swift in Sources */, + 2CB7713B0D33C9E905F429EF16FB86DF /* DummyChatItemPresenter.swift in Sources */, + 406F0C247B841E15DC8D6F0FF0420D73 /* KeyboardTracker.swift in Sources */, + 3FB5355485D2570D0EE541C1C640812F /* ReadOnlyOrderedDictionary.swift in Sources */, + 831E03B95B8F5E02ACF2250807749B41 /* SerialTaskQueue.swift in Sources */, + 3B378B2BBAC42362BDF8AB7F08688E8B /* Utils.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 4618F1CDD7CF0E38CE64FC51D3F559A0 /* PBXTargetDependency */ = { + 6E827308370CF34C79256B8EABA2D4A7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = Chatto; target = 0564C2782D1F2F8E464CB332E0FE7246 /* Chatto */; - targetProxy = BF65737F0062B82A2CF15094471FB93C /* PBXContainerItemProxy */; + targetProxy = 919991093F4ADC46C15C3FE1FE49290F /* PBXContainerItemProxy */; }; - 6E827308370CF34C79256B8EABA2D4A7 /* PBXTargetDependency */ = { + E3A00BAC4CD0E9F1098F630E28E6C8E6 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = Chatto; target = 0564C2782D1F2F8E464CB332E0FE7246 /* Chatto */; - targetProxy = 919991093F4ADC46C15C3FE1FE49290F /* PBXContainerItemProxy */; + targetProxy = E15D700B0C37BBB75A542999FE2533A3 /* PBXContainerItemProxy */; }; F1550BD030CD6847B1E3C4DCF342B150 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = ChattoAdditions; - target = 43BDE8C9B9E5D63986DBEFDF1B4BA044 /* ChattoAdditions */; + target = DCD24D044DCB3D3A8BB5461EC53DE4E2 /* ChattoAdditions */; targetProxy = 06FA345DEABBFBA4C02A6207382A8FAA /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ @@ -1079,7 +1057,7 @@ /* Begin XCBuildConfiguration section */ 05AD7E8891F96E2C8DF9EB13863AEB95 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9661D8308C0146658FC05299FF59AA85 /* Pods-ChattoApp.debug.xcconfig */; + baseConfigurationReference = 9D6AE0AE7C9D70F0256D868912937354 /* Pods-ChattoApp.debug.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -1111,9 +1089,40 @@ }; name = Debug; }; - 17F5F5804356C46606064BD8DF78D242 /* Release */ = { + 43643072528A8AE057C78ED474CC4C45 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 8A58C02B190EA9F6AE9FB698D29DCBC1 /* ChattoAdditions.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/ChattoAdditions/ChattoAdditions-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/ChattoAdditions/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/ChattoAdditions/ChattoAdditions.modulemap"; + PRODUCT_NAME = ChattoAdditions; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 531A252B777CB68E1FD986E343CC610C /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = A65DE185A12E70BE17EFA373F195C9E6 /* Chatto.xcconfig */; + baseConfigurationReference = 4F90FA6D4FBA6832B0032AB803E89430 /* Chatto.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -1133,6 +1142,39 @@ PRODUCT_NAME = Chatto; SDKROOT = iphoneos; SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + AFF137C0A571AE41193CCCBD6AA4B24B /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 8A58C02B190EA9F6AE9FB698D29DCBC1 /* ChattoAdditions.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/ChattoAdditions/ChattoAdditions-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/ChattoAdditions/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/ChattoAdditions/ChattoAdditions.modulemap"; + PRODUCT_NAME = ChattoAdditions; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = "1,2"; @@ -1142,7 +1184,38 @@ }; name = Release; }; - 27A052B71AFA5B1A83AB880CC7E603BC /* Debug */ = { + B263121BB873113DC023F3CB65BF89CB /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 4F90FA6D4FBA6832B0032AB803E89430 /* Chatto.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/Chatto/Chatto-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Chatto/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/Chatto/Chatto.modulemap"; + PRODUCT_NAME = Chatto; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + C3E37FB098AE76440E29106ADBF00CEB /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -1152,10 +1225,12 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; @@ -1163,6 +1238,7 @@ CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; @@ -1197,11 +1273,46 @@ PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/; STRIP_INSTALLED_PRODUCT = NO; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SYMROOT = "${SRCROOT}/../build"; }; name = Debug; }; - B254DAA6CF0CE39F4A3D11B90A7E059A /* Release */ = { + D2ED66FEA840AD9201CB2CE3BF4F3C35 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 196E807B9D564A10BFF03F9C19F2A61B /* Pods-ChattoApp.release.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-ChattoApp/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-ChattoApp/Pods-ChattoApp.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = Pods_ChattoApp; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + DA03565BE765DB55C6448FB363A44481 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -1211,10 +1322,12 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; @@ -1222,6 +1335,7 @@ CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; @@ -1256,141 +1370,14 @@ }; name = Release; }; - C4690A6FB510828F8105802AC46B708B /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = DD7E5A5969A01E3A504D0135C6F25CFF /* ChattoAdditions.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/ChattoAdditions/ChattoAdditions-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/ChattoAdditions/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/ChattoAdditions/ChattoAdditions.modulemap"; - PRODUCT_NAME = ChattoAdditions; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 4.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - D2ED66FEA840AD9201CB2CE3BF4F3C35 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = B20598F484478DFEE1B31B07C6FA131F /* Pods-ChattoApp.release.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-ChattoApp/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-ChattoApp/Pods-ChattoApp.modulemap"; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = Pods_ChattoApp; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - F7F4690ADC6A6C2F755F6EF107C1EEAC /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = A65DE185A12E70BE17EFA373F195C9E6 /* Chatto.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/Chatto/Chatto-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Chatto/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/Chatto/Chatto.modulemap"; - PRODUCT_NAME = Chatto; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 4.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - FF7F9BF736992426F332A54561CDEEC5 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = DD7E5A5969A01E3A504D0135C6F25CFF /* ChattoAdditions.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/ChattoAdditions/ChattoAdditions-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/ChattoAdditions/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/ChattoAdditions/ChattoAdditions.modulemap"; - PRODUCT_NAME = ChattoAdditions; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 4.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 0C6B695FB9120E769A46CB6A2BE56E58 /* Build configuration list for PBXNativeTarget "Chatto" */ = { isa = XCConfigurationList; buildConfigurations = ( - F7F4690ADC6A6C2F755F6EF107C1EEAC /* Debug */, - 17F5F5804356C46606064BD8DF78D242 /* Release */, + B263121BB873113DC023F3CB65BF89CB /* Debug */, + 531A252B777CB68E1FD986E343CC610C /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -1407,17 +1394,17 @@ 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { isa = XCConfigurationList; buildConfigurations = ( - 27A052B71AFA5B1A83AB880CC7E603BC /* Debug */, - B254DAA6CF0CE39F4A3D11B90A7E059A /* Release */, + C3E37FB098AE76440E29106ADBF00CEB /* Debug */, + DA03565BE765DB55C6448FB363A44481 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - A6B2897B21AC12F3586E32B679B6256A /* Build configuration list for PBXNativeTarget "ChattoAdditions" */ = { + D409FEDA817C0F3E01C4F23EB3831EDF /* Build configuration list for PBXNativeTarget "ChattoAdditions" */ = { isa = XCConfigurationList; buildConfigurations = ( - FF7F9BF736992426F332A54561CDEEC5 /* Debug */, - C4690A6FB510828F8105802AC46B708B /* Release */, + 43643072528A8AE057C78ED474CC4C45 /* Debug */, + AFF137C0A571AE41193CCCBD6AA4B24B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/ChattoApp/Pods/Pods.xcodeproj/xcshareddata/xcschemes/ChattoAdditions.xcscheme b/ChattoApp/Pods/Pods.xcodeproj/xcshareddata/xcschemes/ChattoAdditions.xcscheme index be25d954b..c5c4179da 100644 --- a/ChattoApp/Pods/Pods.xcodeproj/xcshareddata/xcschemes/ChattoAdditions.xcscheme +++ b/ChattoApp/Pods/Pods.xcodeproj/xcshareddata/xcschemes/ChattoAdditions.xcscheme @@ -14,7 +14,7 @@ buildForAnalyzing = "YES"> diff --git a/ChattoApp/Pods/Target Support Files/Chatto/Chatto.xcconfig b/ChattoApp/Pods/Target Support Files/Chatto/Chatto.xcconfig index 92a0b1867..c467e8d50 100644 --- a/ChattoApp/Pods/Target Support Files/Chatto/Chatto.xcconfig +++ b/ChattoApp/Pods/Target Support Files/Chatto/Chatto.xcconfig @@ -1,9 +1,9 @@ -CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/Chatto +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Chatto GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" -PODS_BUILD_DIR = $BUILD_DIR -PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_ROOT = ${SRCROOT} PODS_TARGET_SRCROOT = ${PODS_ROOT}/../.. PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} diff --git a/ChattoApp/Pods/Target Support Files/ChattoAdditions/ChattoAdditions.xcconfig b/ChattoApp/Pods/Target Support Files/ChattoAdditions/ChattoAdditions.xcconfig index 0ac440ba6..f27108155 100644 --- a/ChattoApp/Pods/Target Support Files/ChattoAdditions/ChattoAdditions.xcconfig +++ b/ChattoApp/Pods/Target Support Files/ChattoAdditions/ChattoAdditions.xcconfig @@ -1,10 +1,10 @@ -CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/ChattoAdditions -FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Chatto" +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/ChattoAdditions +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Chatto" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" -PODS_BUILD_DIR = $BUILD_DIR -PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_ROOT = ${SRCROOT} PODS_TARGET_SRCROOT = ${PODS_ROOT}/../.. PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} diff --git a/ChattoApp/Pods/Target Support Files/Pods-ChattoApp/Pods-ChattoApp-frameworks.sh b/ChattoApp/Pods/Target Support Files/Pods-ChattoApp/Pods-ChattoApp-frameworks.sh index 826900d9c..0599b6717 100755 --- a/ChattoApp/Pods/Target Support Files/Pods-ChattoApp/Pods-ChattoApp-frameworks.sh +++ b/ChattoApp/Pods/Target Support Files/Pods-ChattoApp/Pods-ChattoApp-frameworks.sh @@ -6,6 +6,14 @@ mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" +# Used as a return value for each invocation of `strip_invalid_archs` function. +STRIP_BINARY_RETVAL=0 + +# This protects against multiple targets copying the same framework dependency at the same time. The solution +# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html +RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") + +# Copies and strips a vendored framework install_framework() { if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then @@ -23,9 +31,9 @@ install_framework() source="$(readlink "${source}")" fi - # use filter instead of exclude so missing patterns dont' throw errors - echo "rsync -av --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" - rsync -av --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" + # Use filter instead of exclude so missing patterns don't throw errors. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" local basename basename="$(basename -s .framework "$1")" @@ -54,6 +62,34 @@ install_framework() fi } +# Copies and strips a vendored dSYM +install_dsym() { + local source="$1" + if [ -r "$source" ]; then + # Copy the dSYM into a the targets temp dir. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}" + + local basename + basename="$(basename -s .framework.dSYM "$source")" + binary="${DERIVED_FILES_DIR}/${basename}.framework.dSYM/Contents/Resources/DWARF/${basename}" + + # Strip invalid architectures so "fat" simulator / device frameworks work on device + if [[ "$(file "$binary")" == *"Mach-O dSYM companion"* ]]; then + strip_invalid_archs "$binary" + fi + + if [[ $STRIP_BINARY_RETVAL == 1 ]]; then + # Move the stripped file into its final destination. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.framework.dSYM" "${DWARF_DSYM_FOLDER_PATH}" + else + # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing. + touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.framework.dSYM" + fi + fi +} + # Signs a framework with the provided identity code_sign_if_enabled() { if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then @@ -72,11 +108,19 @@ code_sign_if_enabled() { # Strip invalid architectures strip_invalid_archs() { binary="$1" - # Get architectures for current file - archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | rev)" + # Get architectures for current target binary + binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" + # Intersect them with the architectures we are building for + intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" + # If there are no archs supported by this binary then warn the user + if [[ -z "$intersected_archs" ]]; then + echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." + STRIP_BINARY_RETVAL=0 + return + fi stripped="" - for arch in $archs; do - if ! [[ "${VALID_ARCHS}" == *"$arch"* ]]; then + for arch in $binary_archs; do + if ! [[ "${ARCHS}" == *"$arch"* ]]; then # Strip non-valid architectures in-place lipo -remove "$arch" -output "$binary" "$binary" || exit 1 stripped="$stripped $arch" @@ -85,16 +129,17 @@ strip_invalid_archs() { if [[ "$stripped" ]]; then echo "Stripped $binary of architectures:$stripped" fi + STRIP_BINARY_RETVAL=1 } if [[ "$CONFIGURATION" == "Debug" ]]; then - install_framework "$BUILT_PRODUCTS_DIR/Chatto/Chatto.framework" - install_framework "$BUILT_PRODUCTS_DIR/ChattoAdditions/ChattoAdditions.framework" + install_framework "${BUILT_PRODUCTS_DIR}/Chatto/Chatto.framework" + install_framework "${BUILT_PRODUCTS_DIR}/ChattoAdditions/ChattoAdditions.framework" fi if [[ "$CONFIGURATION" == "Release" ]]; then - install_framework "$BUILT_PRODUCTS_DIR/Chatto/Chatto.framework" - install_framework "$BUILT_PRODUCTS_DIR/ChattoAdditions/ChattoAdditions.framework" + install_framework "${BUILT_PRODUCTS_DIR}/Chatto/Chatto.framework" + install_framework "${BUILT_PRODUCTS_DIR}/ChattoAdditions/ChattoAdditions.framework" fi if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then wait diff --git a/ChattoApp/Pods/Target Support Files/Pods-ChattoApp/Pods-ChattoApp-resources.sh b/ChattoApp/Pods/Target Support Files/Pods-ChattoApp/Pods-ChattoApp-resources.sh index 4602c68ab..a7df4405b 100755 --- a/ChattoApp/Pods/Target Support Files/Pods-ChattoApp/Pods-ChattoApp-resources.sh +++ b/ChattoApp/Pods/Target Support Files/Pods-ChattoApp/Pods-ChattoApp-resources.sh @@ -8,6 +8,10 @@ RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt XCASSET_FILES=() +# This protects against multiple targets copying the same framework dependency at the same time. The solution +# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html +RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") + case "${TARGETED_DEVICE_FAMILY}" in 1,2) TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" @@ -21,6 +25,9 @@ case "${TARGETED_DEVICE_FAMILY}" in 3) TARGET_DEVICE_ARGS="--target-device tv" ;; + 4) + TARGET_DEVICE_ARGS="--target-device watch" + ;; *) TARGET_DEVICE_ARGS="--target-device mac" ;; @@ -41,29 +48,29 @@ EOM fi case $RESOURCE_PATH in *.storyboard) - echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" + echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} ;; *.xib) - echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" + echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} ;; *.framework) - echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - echo "rsync -av $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - rsync -av "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" ;; *.xcdatamodel) - echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" + echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" || true xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" ;; *.xcdatamodeld) - echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" + echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" || true xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" ;; *.xcmappingmodel) - echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" + echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" || true xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" ;; *.xcassets) @@ -71,7 +78,7 @@ EOM XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") ;; *) - echo "$RESOURCE_PATH" + echo "$RESOURCE_PATH" || true echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" ;; esac diff --git a/ChattoApp/Pods/Target Support Files/Pods-ChattoApp/Pods-ChattoApp.debug.xcconfig b/ChattoApp/Pods/Target Support Files/Pods-ChattoApp/Pods-ChattoApp.debug.xcconfig index 971ee3924..bd2dacd09 100644 --- a/ChattoApp/Pods/Target Support Files/Pods-ChattoApp/Pods-ChattoApp.debug.xcconfig +++ b/ChattoApp/Pods/Target Support Files/Pods-ChattoApp/Pods-ChattoApp.debug.xcconfig @@ -1,10 +1,11 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES -FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Chatto" "$PODS_CONFIGURATION_BUILD_DIR/ChattoAdditions" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Chatto" "${PODS_CONFIGURATION_BUILD_DIR}/ChattoAdditions" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' -OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/Chatto/Chatto.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/ChattoAdditions/ChattoAdditions.framework/Headers" +OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Chatto/Chatto.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/ChattoAdditions/ChattoAdditions.framework/Headers" OTHER_LDFLAGS = $(inherited) -framework "Chatto" -framework "ChattoAdditions" OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" -PODS_BUILD_DIR = $BUILD_DIR -PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. PODS_ROOT = ${SRCROOT}/Pods diff --git a/ChattoApp/Pods/Target Support Files/Pods-ChattoApp/Pods-ChattoApp.release.xcconfig b/ChattoApp/Pods/Target Support Files/Pods-ChattoApp/Pods-ChattoApp.release.xcconfig index 971ee3924..bd2dacd09 100644 --- a/ChattoApp/Pods/Target Support Files/Pods-ChattoApp/Pods-ChattoApp.release.xcconfig +++ b/ChattoApp/Pods/Target Support Files/Pods-ChattoApp/Pods-ChattoApp.release.xcconfig @@ -1,10 +1,11 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES -FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Chatto" "$PODS_CONFIGURATION_BUILD_DIR/ChattoAdditions" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Chatto" "${PODS_CONFIGURATION_BUILD_DIR}/ChattoAdditions" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' -OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/Chatto/Chatto.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/ChattoAdditions/ChattoAdditions.framework/Headers" +OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Chatto/Chatto.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/ChattoAdditions/ChattoAdditions.framework/Headers" OTHER_LDFLAGS = $(inherited) -framework "Chatto" -framework "ChattoAdditions" OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" -PODS_BUILD_DIR = $BUILD_DIR -PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. PODS_ROOT = ${SRCROOT}/Pods From 1835c2557c0b4d9ebc74e1d4a97144f00fe6ccbd Mon Sep 17 00:00:00 2001 From: Alexander Zimin Date: Wed, 21 Feb 2018 14:38:01 +0000 Subject: [PATCH 10/12] Extended logic for keyboard tracking, extending contentOffset and contentInsets overriding --- Chatto/Chatto.xcodeproj/project.pbxproj | 4 + .../BaseChatViewController.swift | 59 +- .../ChatLayoutConfiguration.swift | 49 + .../Collaborators/KeyboardTracker.swift | 28 +- ChattoApp/Pods/Pods.xcodeproj/project.pbxproj | 1044 +++++++++-------- 5 files changed, 633 insertions(+), 551 deletions(-) create mode 100644 Chatto/Source/ChatController/ChatLayoutConfiguration.swift diff --git a/Chatto/Chatto.xcodeproj/project.pbxproj b/Chatto/Chatto.xcodeproj/project.pbxproj index ef438e172..b2c50f634 100644 --- a/Chatto/Chatto.xcodeproj/project.pbxproj +++ b/Chatto/Chatto.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 3565429D203DB99300B29DA1 /* ChatLayoutConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3565429C203DB99300B29DA1 /* ChatLayoutConfiguration.swift */; }; B3B1B0FF1D6B40DF00D1183D /* Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3B1B0FE1D6B40DF00D1183D /* Utils.swift */; }; C31E919A1BFF4CA300339585 /* BaseChatViewControllerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C31E91991BFF4CA300339585 /* BaseChatViewControllerTests.swift */; }; C321C3961BE78835009803D1 /* CollectionChangesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C321C3951BE78835009803D1 /* CollectionChangesTests.swift */; }; @@ -48,6 +49,7 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 3565429C203DB99300B29DA1 /* ChatLayoutConfiguration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatLayoutConfiguration.swift; sourceTree = ""; }; 55E85D821BE390BE001885AD /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; B3B1B0FE1D6B40DF00D1183D /* Utils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Utils.swift; sourceTree = ""; }; C31E91991BFF4CA300339585 /* BaseChatViewControllerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BaseChatViewControllerTests.swift; sourceTree = ""; }; @@ -206,6 +208,7 @@ C36281E41BF0F0F0004D6BCE /* BaseChatViewController+Changes.swift */, C3E904B11BE0509E00C662A2 /* BaseChatViewController+Presenters.swift */, C38352D01CC6514B006C359C /* BaseChatViewController+AccessoryViewRevealer.swift */, + 3565429C203DB99300B29DA1 /* ChatLayoutConfiguration.swift */, ); path = ChatController; sourceTree = ""; @@ -351,6 +354,7 @@ C38352D11CC6514B006C359C /* BaseChatViewController+AccessoryViewRevealer.swift in Sources */, C342D0BD1C638681008A4605 /* ChatItemCompanion.swift in Sources */, C36281E71BF0F196004D6BCE /* BaseChatViewController+Scrolling.swift in Sources */, + 3565429D203DB99300B29DA1 /* ChatLayoutConfiguration.swift in Sources */, C36281EB1BF0F62F004D6BCE /* DummyChatItemPresenter.swift in Sources */, C3C7C3981CAC4BAC00A49929 /* ChatCollectionViewLayout.swift in Sources */, C3C7C39B1CAC4BAC00A49929 /* KeyboardTracker.swift in Sources */, diff --git a/Chatto/Source/ChatController/BaseChatViewController.swift b/Chatto/Source/ChatController/BaseChatViewController.swift index 2796ee614..338e1e7af 100644 --- a/Chatto/Source/ChatController/BaseChatViewController.swift +++ b/Chatto/Source/ChatController/BaseChatViewController.swift @@ -28,10 +28,14 @@ open class BaseChatViewController: UIViewController, UICollectionViewDataSource, public typealias ChatItemCompanionCollection = ReadOnlyOrderedDictionary + open var layoutConfiguration: ChatLayoutConfigurationProtocol = ChatLayoutConfiguration.defaultConfiguration { + didSet { + self.adjustCollectionViewInsets(shouldUpdateContentOffset: false) + } + } + public struct Constants { public var updatesAnimationDuration: TimeInterval = 0.33 - public var defaultContentInsets = UIEdgeInsets(top: 10, left: 0, bottom: 10, right: 0) - public var defaultScrollIndicatorInsets = UIEdgeInsets.zero public var preferredMaxMessageCount: Int? = 500 // If not nil, will ask data source to reduce number of messages when limit is reached. @see ChatDataSourceDelegateProtocol public var preferredMaxMessageCountAdjustment: Int = 400 // When the above happens, will ask to adjust with this value. It may be wise for this to be smaller to reduce number of adjustments public var autoloadingFractionalThreshold: CGFloat = 0.05 // in [0, 1] @@ -119,8 +123,8 @@ open class BaseChatViewController: UIViewController, UICollectionViewDataSource, private func addCollectionView() { self.collectionView = UICollectionView(frame: CGRect.zero, collectionViewLayout: self.createCollectionViewLayout()) - self.collectionView.contentInset = self.constants.defaultContentInsets - self.collectionView.scrollIndicatorInsets = self.constants.defaultScrollIndicatorInsets + self.collectionView.contentInset = self.layoutConfiguration.contentInsets + self.collectionView.scrollIndicatorInsets = self.layoutConfiguration.scrollIndicatorInsets self.collectionView.alwaysBounceVertical = true self.collectionView.backgroundColor = UIColor.clear self.collectionView.keyboardDismissMode = .interactive @@ -199,9 +203,9 @@ open class BaseChatViewController: UIViewController, UICollectionViewDataSource, var isAdjustingInputContainer: Bool = false open func setupKeyboardTracker() { - let layoutBlock = { [weak self] (bottomMargin: CGFloat) in + let layoutBlock = { [weak self] (bottomMargin: CGFloat, keyboardStatus: KeyboardStatus) in guard let sSelf = self else { return } - sSelf.handleKeyboardPositionChange(bottomMargin: bottomMargin) + sSelf.handleKeyboardPositionChange(bottomMargin: bottomMargin, keyboardStatus: keyboardStatus) } self.keyboardTracker = KeyboardTracker(viewController: self, inputContainer: self.inputContainer, layoutBlock: layoutBlock, notificationCenter: self.notificationCenter) @@ -209,7 +213,7 @@ open class BaseChatViewController: UIViewController, UICollectionViewDataSource, } - open func handleKeyboardPositionChange(bottomMargin: CGFloat) { + open func handleKeyboardPositionChange(bottomMargin: CGFloat, keyboardStatus: KeyboardStatus) { self.isAdjustingInputContainer = true self.inputContainerBottomConstraint.constant = max(bottomMargin, self.bottomLayoutGuide.length) self.view.layoutIfNeeded() @@ -223,7 +227,7 @@ open class BaseChatViewController: UIViewController, UICollectionViewDataSource, override open func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() - self.adjustCollectionViewInsets() + self.adjustCollectionViewInsets(shouldUpdateContentOffset: true) self.keyboardTracker.adjustTrackingViewSizeIfNeeded() if self.isFirstLayout { @@ -233,21 +237,25 @@ open class BaseChatViewController: UIViewController, UICollectionViewDataSource, } } - private func adjustCollectionViewInsets() { + public var allContentFits: Bool { + let inputHeightWithKeyboard = self.view.bounds.height - self.inputContainer.frame.minY + let newInsetTop = self.topLayoutGuide.length + self.layoutConfiguration.contentInsets.top + let newInsetBottom = self.layoutConfiguration.contentInsets.bottom + inputHeightWithKeyboard + let availableHeight = self.collectionView.bounds.height - (newInsetTop + newInsetBottom) + let contentSize = self.collectionView.collectionViewLayout.collectionViewContentSize + return availableHeight >= contentSize.height + } + + private func adjustCollectionViewInsets(shouldUpdateContentOffset: Bool) { let isInteracting = self.collectionView.panGestureRecognizer.numberOfTouches > 0 let isBouncingAtTop = isInteracting && self.collectionView.contentOffset.y < -self.collectionView.contentInset.top if isBouncingAtTop { return } let inputHeightWithKeyboard = self.view.bounds.height - self.inputContainer.frame.minY - let newInsetBottom = self.constants.defaultContentInsets.bottom + inputHeightWithKeyboard + let newInsetBottom = self.layoutConfiguration.contentInsets.bottom + inputHeightWithKeyboard let insetBottomDiff = newInsetBottom - self.collectionView.contentInset.bottom - let newInsetTop = self.topLayoutGuide.length + self.constants.defaultContentInsets.top - + let newInsetTop = self.topLayoutGuide.length + self.layoutConfiguration.contentInsets.top let contentSize = self.collectionView.collectionViewLayout.collectionViewContentSize - let allContentFits: Bool = { - let availableHeight = self.collectionView.bounds.height - (newInsetTop + newInsetBottom) - return availableHeight >= contentSize.height - }() let newContentOffsetY: CGFloat = { let minOffset = -newInsetTop @@ -265,20 +273,29 @@ open class BaseChatViewController: UIViewController, UICollectionViewDataSource, self.collectionView.scrollIndicatorInsets = { var currentInsets = self.collectionView.scrollIndicatorInsets - currentInsets.bottom = self.constants.defaultScrollIndicatorInsets.bottom + inputHeightWithKeyboard - currentInsets.top = self.topLayoutGuide.length + self.constants.defaultScrollIndicatorInsets.top + currentInsets.bottom = self.layoutConfiguration.scrollIndicatorInsets.bottom + inputHeightWithKeyboard + currentInsets.top = self.topLayoutGuide.length + self.layoutConfiguration.scrollIndicatorInsets.top return currentInsets }() - let inputIsAtBottom = self.view.bounds.maxY - self.inputContainer.frame.maxY <= 0 + guard shouldUpdateContentOffset else { return } + let inputIsAtBottom = self.view.bounds.maxY - self.inputContainer.frame.maxY <= 0 if allContentFits { - self.collectionView.contentOffset.y = -self.collectionView.contentInset.top + var contentOffset = self.collectionView.contentOffset + contentOffset.y = -self.collectionView.contentInset.top + self.updateContentViewOffset(contentOffset) } else if !isInteracting || inputIsAtBottom { - self.collectionView.contentOffset.y = newContentOffsetY + var contentOffset = self.collectionView.contentOffset + contentOffset.y = newContentOffsetY + self.updateContentViewOffset(contentOffset) } } + open func updateContentViewOffset(_ newValue: CGPoint) { + self.collectionView.contentOffset = newValue + } + func rectAtIndexPath(_ indexPath: IndexPath?) -> CGRect? { if let indexPath = indexPath { return self.collectionView.collectionViewLayout.layoutAttributesForItem(at: indexPath)?.frame diff --git a/Chatto/Source/ChatController/ChatLayoutConfiguration.swift b/Chatto/Source/ChatController/ChatLayoutConfiguration.swift new file mode 100644 index 000000000..11817c74a --- /dev/null +++ b/Chatto/Source/ChatController/ChatLayoutConfiguration.swift @@ -0,0 +1,49 @@ +/* + The MIT License (MIT) + + Copyright (c) 2015-present Badoo Trading Limited. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +import UIKit + +public protocol ChatLayoutConfigurationProtocol { + var contentInsets: UIEdgeInsets { get } + var scrollIndicatorInsets: UIEdgeInsets { get } +} + +public struct ChatLayoutConfiguration: ChatLayoutConfigurationProtocol { + public let contentInsets: UIEdgeInsets + public let scrollIndicatorInsets: UIEdgeInsets + + public init(contentInsets: UIEdgeInsets, scrollIndicatorInsets: UIEdgeInsets) { + self.contentInsets = contentInsets + self.scrollIndicatorInsets = scrollIndicatorInsets + } +} + +extension ChatLayoutConfiguration { + static var defaultConfiguration: ChatLayoutConfiguration { + let contentInsets = UIEdgeInsets(top: 10, left: 0, bottom: 10, right: 0) + let scrollIndicatorInsets = UIEdgeInsets.zero + return ChatLayoutConfiguration(contentInsets: contentInsets, + scrollIndicatorInsets: scrollIndicatorInsets) + } +} diff --git a/Chatto/Source/ChatController/Collaborators/KeyboardTracker.swift b/Chatto/Source/ChatController/Collaborators/KeyboardTracker.swift index 10bdd76be..9910fdc4f 100644 --- a/Chatto/Source/ChatController/Collaborators/KeyboardTracker.swift +++ b/Chatto/Source/ChatController/Collaborators/KeyboardTracker.swift @@ -24,14 +24,14 @@ import Foundation -class KeyboardTracker { - - private enum KeyboardStatus { - case hidden - case showing - case shown - } +public enum KeyboardStatus { + case hiding + case hidden + case showing + case shown +} +class KeyboardTracker { private var keyboardStatus: KeyboardStatus = .hidden private let view: UIView var trackingView: UIView { @@ -52,7 +52,7 @@ class KeyboardTracker { var inputContainer: UIView private var notificationCenter: NotificationCenter - typealias LayoutBlock = (_ bottomMargin: CGFloat) -> Void + typealias LayoutBlock = (_ bottomMargin: CGFloat, _ status: KeyboardStatus) -> Void private var layoutBlock: LayoutBlock init(viewController: UIViewController, inputContainer: UIView, layoutBlock: @escaping LayoutBlock, notificationCenter: NotificationCenter) { @@ -63,6 +63,7 @@ class KeyboardTracker { self.notificationCenter.addObserver(self, selector: #selector(KeyboardTracker.keyboardWillShow(_:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil) self.notificationCenter.addObserver(self, selector: #selector(KeyboardTracker.keyboardDidShow(_:)), name: NSNotification.Name.UIKeyboardDidShow, object: nil) self.notificationCenter.addObserver(self, selector: #selector(KeyboardTracker.keyboardWillHide(_:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil) + self.notificationCenter.addObserver(self, selector: #selector(KeyboardTracker.keyboardDidHide(_:)), name: NSNotification.Name.UIKeyboardDidHide, object: nil) self.notificationCenter.addObserver(self, selector: #selector(KeyboardTracker.keyboardWillChangeFrame(_:)), name: NSNotification.Name.UIKeyboardWillChangeFrame, object: nil) } @@ -105,13 +106,20 @@ class KeyboardTracker { guard self.isTracking else { return } let bottomConstraint = self.bottomConstraintFromNotification(notification) if bottomConstraint == 0 { - self.keyboardStatus = .hidden + self.keyboardStatus = .hiding self.layoutInputAtBottom() } } @objc private func keyboardWillHide(_ notification: Notification) { + guard self.isTracking else { return } + self.keyboardStatus = .hiding + self.layoutInputAtBottom() + } + + @objc + private func keyboardDidHide(_ notification: Notification) { guard self.isTracking else { return } self.keyboardStatus = .hidden self.layoutInputAtBottom() @@ -159,7 +167,7 @@ class KeyboardTracker { private func layoutInputContainer(withBottomConstraint constraint: CGFloat) { self.isPerformingForcedLayout = true - self.layoutBlock(constraint) + self.layoutBlock(constraint, self.keyboardStatus) self.isPerformingForcedLayout = false } } diff --git a/ChattoApp/Pods/Pods.xcodeproj/project.pbxproj b/ChattoApp/Pods/Pods.xcodeproj/project.pbxproj index 71f039ecb..834f8b968 100644 --- a/ChattoApp/Pods/Pods.xcodeproj/project.pbxproj +++ b/ChattoApp/Pods/Pods.xcodeproj/project.pbxproj @@ -7,109 +7,110 @@ objects = { /* Begin PBXBuildFile section */ - 00D6D10980978A3AD87F2EFA18D5FA53 /* BaseMessageCollectionViewCellDefaultStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E6B9EFA482498A8F7626B346CDED36D /* BaseMessageCollectionViewCellDefaultStyle.swift */; }; - 00E3F827CF29D95C20BC041DE0B3E415 /* ChatInputBar.xib in Resources */ = {isa = PBXBuildFile; fileRef = B1309CFDDC69D430EF26B5A607907C80 /* ChatInputBar.xib */; }; - 010040154F5F454E72EF1468790FA4CD /* BaseChatViewController+Scrolling.swift in Sources */ = {isa = PBXBuildFile; fileRef = AFB8A0CFBD7C0AE7CB03BF74160D4DBA /* BaseChatViewController+Scrolling.swift */; }; - 0C16A79AD329A1AE31DCB63829C8C87B /* PhotosInputView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D6F0E45378AD0C6B71082D352CC260B /* PhotosInputView.swift */; }; - 0D505833F07BC65FEBC299D37006365D /* HorizontalStackScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2DD8E4BB9487A80F70C29231EA1E6295 /* HorizontalStackScrollView.swift */; }; - 0D523E4FE6115F7A55C3AC1084204E4B /* BaseChatViewController+AccessoryViewRevealer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 425AA302DBD7925EAF5AC414D86AEA0B /* BaseChatViewController+AccessoryViewRevealer.swift */; }; - 0EA4A981038BAA87CFD193759A602F8F /* PhotosInputDataProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBA64E0B302B8C3DAD22C389E3F73CFB /* PhotosInputDataProvider.swift */; }; - 0FD9575740CF2F8B25FF917D414DD453 /* BaseChatViewController+Presenters.swift in Sources */ = {isa = PBXBuildFile; fileRef = C7A3114802D19936B30971AC47A85BAD /* BaseChatViewController+Presenters.swift */; }; - 13F170B91F743BE7E900034704945334 /* TabInputButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = A500CFC58AF814D90C69A58ED2780972 /* TabInputButton.swift */; }; - 14E1077906B79E35EB6C0D452E98E102 /* PhotosInputPlaceholderCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 593C30E9D0A0055838C2854296640A47 /* PhotosInputPlaceholderCell.swift */; }; - 16361DBD3920836499A58C212E9B825F /* PhotosInputCellProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E8F42B307C00B2A41B5509D17EE211A /* PhotosInputCellProvider.swift */; }; - 1B5BAA97C46FBC289D2B770A2CF26195 /* Photos.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4A4DFA43E1F3E4B1A85CEFCEFC38500E /* Photos.xcassets */; }; - 1C0E2D574DEAA28340343074A044380C /* PhotoMessagePresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA0E54B122003939CAFC03AE0FA4B5DC /* PhotoMessagePresenter.swift */; }; - 1D22A8C6A20F2FE60BB35918061C3ECB /* ChatDataSourceProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = D9E20DA473442F4FE951198139ADCB9A /* ChatDataSourceProtocol.swift */; }; - 1EBAAE2E59B3FDA14AAD805DFC2707D6 /* AccessoryViewRevealer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6689FB692180AEBAC101759EAD0116C2 /* AccessoryViewRevealer.swift */; }; - 217914BBAE3847BF873C1386E1FAE9AA /* BaseChatItemPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8FE7CDA883280C5BDFD7A2E6C025833A /* BaseChatItemPresenter.swift */; }; - 2500D71C245FFE4D6B9BFD4A2A1EDB85 /* CGSize+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C59631DCA268A4285E100821B4E160B /* CGSize+Additions.swift */; }; - 259AE37389BAB08398971B61C68C0202 /* PhotosInputWithPlaceholdersDataProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7C9C727136FE97562C19E9EED6E66C0 /* PhotosInputWithPlaceholdersDataProvider.swift */; }; - 28075012B4DC5D40D6B054A83AA81BF8 /* Alignment.swift in Sources */ = {isa = PBXBuildFile; fileRef = F207983FB08AF781AE4FF881D8960FF0 /* Alignment.swift */; }; - 2CB7713B0D33C9E905F429EF16FB86DF /* DummyChatItemPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B80E0E9904F4BFCCEA00B151D33F58 /* DummyChatItemPresenter.swift */; }; - 2CDB23CA2683F68395293EE5DBD427A8 /* LiveCameraCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 129420675D0E892156C6D5F890C31DE9 /* LiveCameraCell.swift */; }; - 2EDA353EE9074C181A7F628FF5255F35 /* PhotoMessagePresenterBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 054266A433FDCDF6CE22033EFC757A22 /* PhotoMessagePresenterBuilder.swift */; }; - 2F96149719263B6CB07600157780AF21 /* BaseChatViewControllerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E3235B63095189632DAF591C60640F6 /* BaseChatViewControllerView.swift */; }; - 31157864FC8DD8494902BD87CAEC950E /* TextMessagePresenterBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48A04A3FAAAFC0C4AAF832BBDE30C8D2 /* TextMessagePresenterBuilder.swift */; }; - 33C9126C93D8B4F3D6A1543B4C98618E /* ChatItemProtocolDefinitions.swift in Sources */ = {isa = PBXBuildFile; fileRef = FFD942A947D0F30C8639C1CBAB4AF302 /* ChatItemProtocolDefinitions.swift */; }; - 39FE01D5BD4A9F43AE61C39CCFC868D8 /* UIView+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A8F4A40C1DC22FF561A2874120DDC74 /* UIView+Additions.swift */; }; - 3A87BB2197D9516F6A159670B8E98C26 /* TextMessageCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7415D56E6E1F58660510D91A8808D437 /* TextMessageCollectionViewCell.swift */; }; - 3B378B2BBAC42362BDF8AB7F08688E8B /* Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = E7F3B7809E5A273EF73736CF423B9CB5 /* Utils.swift */; }; - 3E008FC7A2FDDCCCF61C7BD94C131EBE /* PhotoBubbleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F34BC85B23764467817891963F9FC304 /* PhotoBubbleView.swift */; }; - 3E32D7EA354D45031B987D3B0BA6B1F8 /* LiveCameraCellPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA258F8A88B4DE305AF692CEE5C855A7 /* LiveCameraCellPresenter.swift */; }; - 3E43C0A2E3955FC38026140E26B4E602 /* CircleProgressView.h in Headers */ = {isa = PBXBuildFile; fileRef = B9CD5BEE75214684960D2D0186F18D39 /* CircleProgressView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 3FB5355485D2570D0EE541C1C640812F /* ReadOnlyOrderedDictionary.swift in Sources */ = {isa = PBXBuildFile; fileRef = A20874338A13B082557F5D7D5DAD78FE /* ReadOnlyOrderedDictionary.swift */; }; - 3FE7D49AAD12760C3809D3EF079033DF /* UIScreen+Scale.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8A201C1EFC6CB61F9E130E8293153B4 /* UIScreen+Scale.swift */; }; - 406F0C247B841E15DC8D6F0FF0420D73 /* KeyboardTracker.swift in Sources */ = {isa = PBXBuildFile; fileRef = F00A8A9ECFF12DCE30DABCE3E5E136D1 /* KeyboardTracker.swift */; }; - 43EB2F4B3C928EC0ABDE758E9A027F61 /* CircleProgressView.m in Sources */ = {isa = PBXBuildFile; fileRef = D5AC84164493C29F99955F0D66AA4184 /* CircleProgressView.m */; }; - 48592135C286A8497752C7ED03A23CEE /* BaseMessageModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8F1E432BC15A34A52E6583F21C1D526 /* BaseMessageModel.swift */; }; - 4C1E87BDED189A0548E50B02C69062B4 /* BaseMessageViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 124000A3BF8B8398B7A22D9123A19ED0 /* BaseMessageViewModel.swift */; }; - 512A57DEB9B46A901C1FC10527041D36 /* ChatInputBarPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1270F50E949DF5F1FB5E317CBFC4E308 /* ChatInputBarPresenter.swift */; }; - 532E7EF69E5BE6723F2A4EFAB7ED6607 /* CollectionChanges.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05D5600D8E7D22AC3E225129F527765E /* CollectionChanges.swift */; }; - 59F5745760DD39E7FDE89A10CA21B948 /* CircleProgressIndicator.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 42EB7C4A601A189E1ED3EF6E420EEDA7 /* CircleProgressIndicator.xcassets */; }; - 5DB4ECF73BD0118F052100A502727579 /* TextMessagePresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09802F0177B7395415243C806A52ECE0 /* TextMessagePresenter.swift */; }; - 60C8B2C6A1B1CE596A82309FDB96EE56 /* ImagePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C3A8A70E90E0D7AF0C7506702585A4E /* ImagePicker.swift */; }; - 6355C90A3190FD3F4F748D9A50907DDE /* ChatItemDecorationAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7345926803B4C970357560D78597DB8 /* ChatItemDecorationAttributes.swift */; }; - 6CB02D239F26C9991C816CD677715057 /* Chatto-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 50A7B423BC8E6016073DE574AF7AB1F2 /* Chatto-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 6D7F13AD0766C7171AA27435010DBD51 /* CircleIconView.h in Headers */ = {isa = PBXBuildFile; fileRef = 8ECE055A1AC334A37ED070AB2F0BA28D /* CircleIconView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 71E16DAE8DC770EB8839FFCED579143E /* Chatto.h in Headers */ = {isa = PBXBuildFile; fileRef = 3ED7B54C4A2CE71FF6F698ED3A75D087 /* Chatto.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 02CE3BA69F02E6B00F6314F1C867BF50 /* Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F865526B535C40AA043DF3C40157EBB /* Utils.swift */; }; + 08F8014E7C34A1933EEE464F8A7FD948 /* PhotoBubbleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F34BC85B23764467817891963F9FC304 /* PhotoBubbleView.swift */; }; + 0D08CE30D5143B5F68A145F915CED9A8 /* HorizontalStackScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2DD8E4BB9487A80F70C29231EA1E6295 /* HorizontalStackScrollView.swift */; }; + 0E1462CEC9D2BB30016796D787FD3249 /* CGPoint+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD28FF28BA5E3CE8FC894E71C061E5F3 /* CGPoint+Additions.swift */; }; + 0E2A38FE6272887678D5B2619CDF028F /* TextMessageCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7415D56E6E1F58660510D91A8808D437 /* TextMessageCollectionViewCell.swift */; }; + 11B2523F4443015EFDEA1DCCECF773D0 /* ChatInputBarAppearance.swift in Sources */ = {isa = PBXBuildFile; fileRef = 247A5E9062AE185F8515C9C35998CD31 /* ChatInputBarAppearance.swift */; }; + 123327C96E10DB97395C607A98CACEAB /* CircleProgressIndicatorView.m in Sources */ = {isa = PBXBuildFile; fileRef = 2E72656362E555629AE7C98D6A4F14B3 /* CircleProgressIndicatorView.m */; }; + 131899ACA4567508E705F077A2402BEA /* PhotosInputPlaceholderCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1FA7FF4FDB6920F132A3F86CF864637 /* PhotosInputPlaceholderCell.swift */; }; + 17A6A1AC584AAF6D214071188CF8D320 /* ChatInputBar.xib in Resources */ = {isa = PBXBuildFile; fileRef = B1309CFDDC69D430EF26B5A607907C80 /* ChatInputBar.xib */; }; + 18CBC232D77FD725AF2592443A3CB3EA /* ReadOnlyOrderedDictionary.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB2038633747734D88B4D933A146AE67 /* ReadOnlyOrderedDictionary.swift */; }; + 19B33E6CD8D93361BF336564EFDC27B9 /* ChattoAdditions-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 11540919D58B7B56085DA340933B0FC1 /* ChattoAdditions-dummy.m */; }; + 1A55F588D2BCAE5761C6389011C02661 /* ChatInputBarPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1270F50E949DF5F1FB5E317CBFC4E308 /* ChatInputBarPresenter.swift */; }; + 1AAD77F43DDDAE59C60718AC186CBA3D /* UIColor+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4DF0809CC047786F4137E42373F4134 /* UIColor+Additions.swift */; }; + 1B78F3EB05EB13125FE568781D7486FF /* ChatItemCompanion.swift in Sources */ = {isa = PBXBuildFile; fileRef = CFAF36B42F7ABC3D09FD5F061A0D6B79 /* ChatItemCompanion.swift */; }; + 1EB3B46D4FA4A07B31843E1A5785F7B0 /* BaseChatViewController+Changes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5263B9973D3B6EC8CA1C8402347E902B /* BaseChatViewController+Changes.swift */; }; + 2986205D8AC0CEEF268AE3E28A4878A9 /* BaseChatViewController+Scrolling.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92D473620C87E8EF86FC76C5A564AC69 /* BaseChatViewController+Scrolling.swift */; }; + 3234AEC384AC96B20BA857B81DBFCC0C /* ChatLayoutConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D34645FF568A8A90706512A58824527 /* ChatLayoutConfiguration.swift */; }; + 325E12A4E947379B7B77829BBE990EAD /* CircleIconView.m in Sources */ = {isa = PBXBuildFile; fileRef = BF40955EBCA1F843EB6FD57E0B53E165 /* CircleIconView.m */; }; + 339A9E762CDD578F7DF8C8C9C5E34E97 /* BaseMessagePresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B229F9BCB567E2FBB872000A9E0ECD2 /* BaseMessagePresenter.swift */; }; + 355EA957643570570C38A1A965305096 /* UIScreen+Scale.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8A201C1EFC6CB61F9E130E8293153B4 /* UIScreen+Scale.swift */; }; + 36ECF3B6D22A9B26CF195921FA9FB166 /* Alignment.swift in Sources */ = {isa = PBXBuildFile; fileRef = F207983FB08AF781AE4FF881D8960FF0 /* Alignment.swift */; }; + 37E5484E69AC3C4290114C9360C25321 /* Text.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D410A8560196ED567FD09A0BBCAAC9F8 /* Text.xcassets */; }; + 3990B9429830869037B61EB796198FAC /* SerialTaskQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = AFC940116D1FE152A8B4391C8179BAB7 /* SerialTaskQueue.swift */; }; + 3A524A7F6CC21ABBFD487AB542F665DC /* LiveCameraCellPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0BBB172ACF8D5FC99A24F909709EF0A6 /* LiveCameraCellPresenter.swift */; }; + 3F6026561EF3D31C97E2F9C45648E444 /* ViewDefinitions.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE00EA2B2F8904F2E6F64C976F9FC256 /* ViewDefinitions.swift */; }; + 3FFE645D7F0A109E86AC440814482B51 /* PhotosInputView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A891FD7583480DA1F43E049418524D2 /* PhotosInputView.swift */; }; + 406277494EF48172137FE4D41DE545DE /* ExpandableTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D001EAE1C66ADDE971DE7417AA9FC5D /* ExpandableTextView.swift */; }; + 41D047F989032464108E6EE8764FC8FF /* ChatInputBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92B5B3D91CB163330A0FD333E60DDCAB /* ChatInputBar.swift */; }; + 423A4E368CA258CE72ED24F0C784C28E /* ChattoAdditions-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 65540FDB9B6009E3AE2CD01F047293D9 /* ChattoAdditions-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 425EAF6463FECAA4723451596ECA40B3 /* ChatCollectionViewLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1C6AC04E26A1E1DE63AD1FAFE3232E6 /* ChatCollectionViewLayout.swift */; }; + 43618A8F6880123014BCFAD6EE452F43 /* CircleProgressIndicator.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 42EB7C4A601A189E1ED3EF6E420EEDA7 /* CircleProgressIndicator.xcassets */; }; + 46B23101F2C9EB6C2D8D0A925C3A3E35 /* LiveCameraCaptureSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC319BABE04FB7EE13FC04CC6841F22B /* LiveCameraCaptureSession.swift */; }; + 48D774F9DBC66F7B3328E4DF830C7E5A /* CircleIconView.h in Headers */ = {isa = PBXBuildFile; fileRef = 8ECE055A1AC334A37ED070AB2F0BA28D /* CircleIconView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 511CF5A6863FE5D4E5081DD49FDF685E /* UIView+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A8F4A40C1DC22FF561A2874120DDC74 /* UIView+Additions.swift */; }; + 513D3AC06D6C5D629E8D618B00F13101 /* UIImage+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD6D7F742DFE0768F96231D1F0733523 /* UIImage+Additions.swift */; }; + 536C46DC87D180A26FB697C425647696 /* CollectionChanges.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA3D6A8FA7B4733B47E59765BAAE50B0 /* CollectionChanges.swift */; }; + 5994C35B08BA5C89BFB59A96A28BCA0E /* Chatto.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0A636ED63D4950987B5410B6B50F1B4 /* Chatto.framework */; }; + 5B2EB2FA2D00C9CA7B1B5774D6D1E6D5 /* CGSize+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C59631DCA268A4285E100821B4E160B /* CGSize+Additions.swift */; }; + 5CA864BA6C30472334EA61B8A6D9A59B /* CircleProgressIndicatorView.h in Headers */ = {isa = PBXBuildFile; fileRef = CA346CB6808EFE01AE75836A1F7A0698 /* CircleProgressIndicatorView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5CC30B0AA5E0C72415D3C0467A8D4324 /* LiveCameraCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1487A45371AC8104BC0CE7C162FBF982 /* LiveCameraCell.swift */; }; + 5E08DBA5C1DCC7EA567AA8DC11DD64E1 /* BaseChatViewControllerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79432F3617D69C8DA909CFA540018DC4 /* BaseChatViewControllerView.swift */; }; + 60593D3B7251C8794767D33622E56259 /* PhotosInputCameraPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 41213A169A1327F38C02D02FF4E7EAB4 /* PhotosInputCameraPicker.swift */; }; + 64658EDE7621DF8D7CA77870B1060D71 /* UIEdgeInsets+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 653AC366611432A9FD809ECC143989E4 /* UIEdgeInsets+Additions.swift */; }; + 675AC2126A225E5DA52B5486BF106C4E /* PhotosInputWithPlaceholdersDataProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = D89429FA94D510A5A6A77537122BBA05 /* PhotosInputWithPlaceholdersDataProvider.swift */; }; + 69D0AB53007DF11147A1B1EC8987DF50 /* ChatItemPresenterFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = B45107EC0B5669FFE263EEDC1376216D /* ChatItemPresenterFactory.swift */; }; + 6E58A916AF862E96FE9E1E80E9CF1628 /* TextBubbleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB3BA07DBA51A986FB2A3D18DBB01B96 /* TextBubbleView.swift */; }; + 705ADC8E473A4FA09685E3A3938F71E4 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C9FB20ED66AF2A93EB50539902AE6733 /* Foundation.framework */; }; + 705E7BFE90BC4F32123FD61B7D6DDE0D /* PhotoMessageModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE1FCDE5DEF7DF407DE4318DBB83DB2D /* PhotoMessageModel.swift */; }; + 70FEFCFC2A8832EB145F3E18916D4022 /* BaseMessageAssets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 8E530272C9C6DF0ABC40B6E61D3DD29C /* BaseMessageAssets.xcassets */; }; + 717869C722B7C46D09556EFB33A11486 /* Photos.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4A4DFA43E1F3E4B1A85CEFCEFC38500E /* Photos.xcassets */; }; + 71BD18B5F73AA8E71E88803C2D9AFFDC /* TextMessagePresenterBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48A04A3FAAAFC0C4AAF832BBDE30C8D2 /* TextMessagePresenterBuilder.swift */; }; 733ECA7D1AEA031AA153E7A49C281A19 /* Pods-ChattoApp-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = D26F81AF79CA37D208D3C6511A534949 /* Pods-ChattoApp-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7507614804E28F304AD99EE5C8B67C43 /* LiveCameraCaptureSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9ABAEAD42B233C4C72F4D8C62D264AC /* LiveCameraCaptureSession.swift */; }; - 759100F5B47B2E76F5CA16E2F37532D3 /* Text.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D410A8560196ED567FD09A0BBCAAC9F8 /* Text.xcassets */; }; - 77E6F472B22328E2F6962FB06D4E8475 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C9FB20ED66AF2A93EB50539902AE6733 /* Foundation.framework */; }; - 78F46BA4780730F9A3B1D419A4DC56BF /* PhotoMessageModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE1FCDE5DEF7DF407DE4318DBB83DB2D /* PhotoMessageModel.swift */; }; - 7B0EBDA75601E029EA64F03E579D0663 /* ChatCollectionViewLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F938377FA02F6C0D99FD8706AC3C3D0 /* ChatCollectionViewLayout.swift */; }; - 7D20450EADD4BAEBAC1E1028D9768995 /* PhotoMessageAssets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = F7B09B7BBFF294077116E789BA62D48C /* PhotoMessageAssets.xcassets */; }; + 7C0EFEE9B9E3DE06B84E4765ED934ED1 /* ChatItemProtocolDefinitions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5DB80495DEC9A7A3F171F2C8144F441 /* ChatItemProtocolDefinitions.swift */; }; + 7C3B55D2D648098E0F561A189ADAD5B9 /* TextChatInputItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53D247BEFAB9EF120E4F010A1F91C4C6 /* TextChatInputItem.swift */; }; + 7C4D5F4CA2DAA84A15307B68ED914A97 /* BaseMessageCollectionViewCellDefaultStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E6B9EFA482498A8F7626B346CDED36D /* BaseMessageCollectionViewCellDefaultStyle.swift */; }; + 7EAA32B3B18209F7E9910D2A1F260361 /* ImagePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC7294781831F5B384F58E5C00EDFE61 /* ImagePicker.swift */; }; 7F663761FE373B0CB90C3906DC50E832 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C9FB20ED66AF2A93EB50539902AE6733 /* Foundation.framework */; }; - 8060B6D103DA4161BF922E14847B8736 /* TextMessageViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58BEF5E6331B2CB05F56D9E10C66A901 /* TextMessageViewModel.swift */; }; - 826A43BDFAD7AD06AE209B47592E31D0 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C9FB20ED66AF2A93EB50539902AE6733 /* Foundation.framework */; }; - 831E03B95B8F5E02ACF2250807749B41 /* SerialTaskQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1985774D53B3A1654C7775FD6A07A399 /* SerialTaskQueue.swift */; }; - 8867B0709DE6851C45CD27BC45D5E4E7 /* ChatItemPresenterFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19441BE50AD243FC9F2E75C3DE5B8E80 /* ChatItemPresenterFactory.swift */; }; - 8B417560642B39B55AB772AAAB4A5E25 /* PhotosInputCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43B11277D4132D3470FC06F6E567361A /* PhotosInputCell.swift */; }; - 8F80B5B62BFD9C705AB6108ED449CCC1 /* PhotosChatInputItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A352E08BEB4912F511344FF68E6BF19 /* PhotosChatInputItem.swift */; }; - 902FA0B2997BA4D8AA0B17164278BBA7 /* UIColor+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4DF0809CC047786F4137E42373F4134 /* UIColor+Additions.swift */; }; - 919F6A1D05D00F1D815A5D6E30C16822 /* PhotosInputPlaceholderDataProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = D380068E3A21DDCA854A552D0681F12A /* PhotosInputPlaceholderDataProvider.swift */; }; + 827296B2AB1BCE4CCA8E47180866927D /* PhotosInputPlaceholderCellProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = C03CA7139E45D8B591A159B7EA591CFD /* PhotosInputPlaceholderCellProvider.swift */; }; + 89DF80AADDB0269D31EC805C0FD838E9 /* Chatto-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = A42734C8FFED903A56F2ACA651B53739 /* Chatto-dummy.m */; }; + 8DD30642274B7A93D205FD54A552B006 /* BaseChatViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8EC50CE002F4C3E5F8C47AA3D6B63CA5 /* BaseChatViewController.swift */; }; + 90D09BB277BF9EC20D5C035DD35271D9 /* TabInputButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = A500CFC58AF814D90C69A58ED2780972 /* TabInputButton.swift */; }; + 915D77F697630FFFE9B7456BD9158909 /* PhotosChatInputItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3476C0B5EE071FF5997DED8B07EFA11C /* PhotosChatInputItem.swift */; }; + 936348BC9FA00DE4751CD9165E2D14E5 /* PhotoMessageCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCD5E1BC57BB87C53CABBB55C3A86CE1 /* PhotoMessageCollectionViewCell.swift */; }; 93AC0348CFA081A20308C0FFA9A85A3A /* Pods-ChattoApp-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E3F504B152268D2F40F52A62C446408 /* Pods-ChattoApp-dummy.m */; }; - 93CD8A20A6A2DAA0C36A20F67C103030 /* BaseMessagePresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B229F9BCB567E2FBB872000A9E0ECD2 /* BaseMessagePresenter.swift */; }; - 9ECEBD5C0D9255BF6888EB9D5D19D77A /* PhotosInputCameraPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF479F563BA6247F15B5BA474AF80975 /* PhotosInputCameraPicker.swift */; }; - A06C6E4AAEF5C39720886BA18621C919 /* AnimationUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB7CAC59BED45C08C2E61CC07F82A24E /* AnimationUtils.swift */; }; - A1807B0B711E646B1E57F637E3D467FF /* CircleIconView.m in Sources */ = {isa = PBXBuildFile; fileRef = BF40955EBCA1F843EB6FD57E0B53E165 /* CircleIconView.m */; }; - A528EB120A5E7DC270E7E2F133D85B3C /* CGRect+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2AE9343D0A945ED2AC24F7B0A390A4E7 /* CGRect+Additions.swift */; }; - A58BD56650DE9663F4A6B51B114E8921 /* PhotoMessageCollectionViewCellDefaultStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = E90B6821F7D9C990696D159A8A8F3885 /* PhotoMessageCollectionViewCellDefaultStyle.swift */; }; - A6A57EC7C8F3AA159B14477221F8C91A /* TextMessageCollectionViewCellDefaultStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE380B5B75A6D0600DBDE77FF958ADAE /* TextMessageCollectionViewCellDefaultStyle.swift */; }; - AA0B570656617383FE7AFCC873A3F6C0 /* PhotoMessageCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCD5E1BC57BB87C53CABBB55C3A86CE1 /* PhotoMessageCollectionViewCell.swift */; }; - AAC97E757D1592775A9A9499FB555858 /* BaseMessageAssets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 8E530272C9C6DF0ABC40B6E61D3DD29C /* BaseMessageAssets.xcassets */; }; - BD92A029D5888E3E83B13232899832BB /* PhotosInputViewItemSizeCalculator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D0430B2B18F1C6A279939FE7FEAB97C /* PhotosInputViewItemSizeCalculator.swift */; }; - C12D5C1C7CF2DCC15D64201569A6A107 /* ReusableXibView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F14F86937C99E9B9182BDC8D3D66B884 /* ReusableXibView.swift */; }; - C5CA29B99659A34C87C587840BE8B1CA /* CircleProgressIndicatorView.h in Headers */ = {isa = PBXBuildFile; fileRef = CA346CB6808EFE01AE75836A1F7A0698 /* CircleProgressIndicatorView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C888A6F89201A5B9148B199FCC3A1329 /* ChattoAdditions-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 11540919D58B7B56085DA340933B0FC1 /* ChattoAdditions-dummy.m */; }; - CABD18923698A9608DFCC1A0A27A0C80 /* UIEdgeInsets+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 653AC366611432A9FD809ECC143989E4 /* UIEdgeInsets+Additions.swift */; }; - CC1DC524A231D132832C59A91CB5F2BC /* TextMessageModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 128C8DC0F70D827A45AA0DD49B3689D6 /* TextMessageModel.swift */; }; - CC4F915B4A3E45BBFE4F9C409C345A2F /* ExpandableTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D001EAE1C66ADDE971DE7417AA9FC5D /* ExpandableTextView.swift */; }; - CD240780265A33455A58308A /* DeviceImagePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD2407785B3CE07C044E5860 /* DeviceImagePicker.swift */; }; - CD240FBFE867CEE2C20A2C71 /* SimulatorImagePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD240F278096B97B5422DDEC /* SimulatorImagePicker.swift */; }; - CEB217F536637B792CD39700C6C09996 /* ChatInputBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92B5B3D91CB163330A0FD333E60DDCAB /* ChatInputBar.swift */; }; - D383F5FDC2D260D8358A206310B7FC68 /* ViewDefinitions.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE00EA2B2F8904F2E6F64C976F9FC256 /* ViewDefinitions.swift */; }; - D653E8F4A1DAF0E61DF020F622DBA1D1 /* BaseMessageCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88C185C185C37220F2DB10F36D736542 /* BaseMessageCollectionViewCell.swift */; }; - D9F713EAC4BD81B407957E3E29FEDE79 /* ChattoAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = AD9B97CEBDD8AFB58128F14ACBBBC412 /* ChattoAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DAD6EDFF6F4E25EFB1DC50E550732E15 /* CGFloat+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C40601F885EEF498338F0F3D0940B99F /* CGFloat+Additions.swift */; }; - DF03B550764571CA287E0B4B8CFD5DB2 /* CGPoint+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD28FF28BA5E3CE8FC894E71C061E5F3 /* CGPoint+Additions.swift */; }; - DF0DD294440693888AE371BD30638C9A /* ChatInputItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5AA587742C30D113BA584FA54710FD0A /* ChatInputItemView.swift */; }; - DFB12A9A065E868FE0EE84C6126EA37C /* CircleProgressIndicatorView.m in Sources */ = {isa = PBXBuildFile; fileRef = 2E72656362E555629AE7C98D6A4F14B3 /* CircleProgressIndicatorView.m */; }; - E087569EF5E356913098318056B77BE3 /* ChatInputItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84E401C6009E6CBFD1139547BA604FB9 /* ChatInputItem.swift */; }; - E3FF292D87A07BA67A729AD36AEF5076 /* BaseChatViewController+Changes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46581CCBDE0B2F41FF3265FC82B1E001 /* BaseChatViewController+Changes.swift */; }; - E601017C14729E02A50CC61844F9FC16 /* Observable.swift in Sources */ = {isa = PBXBuildFile; fileRef = A62614FA915BDC7A6FA98EC080BC0FE2 /* Observable.swift */; }; - ED3A9540FCF8929A92605DD482096345 /* ChattoAdditions-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 65540FDB9B6009E3AE2CD01F047293D9 /* ChattoAdditions-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - ED8761914EA48870B07EF342B4C412B1 /* PhotosInputPlaceholderCellProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 663915E51C99CC0E3FF755D7D7C9B964 /* PhotosInputPlaceholderCellProvider.swift */; }; - F0A451A28135770A80CAE3312B2E396F /* ChatInputBarAppearance.swift in Sources */ = {isa = PBXBuildFile; fileRef = 247A5E9062AE185F8515C9C35998CD31 /* ChatInputBarAppearance.swift */; }; - F122757D5AE43AEA5224C57D6BC791F3 /* Chatto.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0A636ED63D4950987B5410B6B50F1B4 /* Chatto.framework */; }; - F44F9E965318C8D275A6D6F27D2BB14E /* Chatto-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 55826B807503BE7DDC77A0B9310616CF /* Chatto-dummy.m */; }; - F6A0282EDBB0B7785CC58190CCFE9F8B /* BaseChatViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC6D20F1A27D9120A64F63AE5A503034 /* BaseChatViewController.swift */; }; - F721CCDBC314636F25FC84F9002014A3 /* TextBubbleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB3BA07DBA51A986FB2A3D18DBB01B96 /* TextBubbleView.swift */; }; - FA5A27A37622D781F82E51B25551880F /* UIImage+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD6D7F742DFE0768F96231D1F0733523 /* UIImage+Additions.swift */; }; - FB8866C5639D10A9D6EF04ADC4667542 /* TextChatInputItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53D247BEFAB9EF120E4F010A1F91C4C6 /* TextChatInputItem.swift */; }; - FC9C847E639368AE9DCD4F4C0D745EF3 /* ChatItemCompanion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4510561EB01709E73B706E8CD931E27D /* ChatItemCompanion.swift */; }; - FD053593E7C6C6E82265C241782F45F9 /* PhotoMessageViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAE542D15277B59EF8C23E3086B388A7 /* PhotoMessageViewModel.swift */; }; + 97E2827833D127D296B3901D29C13755 /* PhotosInputCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40C59E85FF73F4E4F180194642C7E7EC /* PhotosInputCell.swift */; }; + 9EA2120DF77F7DEFECC22032F1F58B29 /* BaseChatItemPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C8247FEE16DD077AD31937F3E008A95 /* BaseChatItemPresenter.swift */; }; + 9FEF95A21384F801D04965CDD64C71FD /* DummyChatItemPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4599A7F6AEF15DFF28C49B6FF667278 /* DummyChatItemPresenter.swift */; }; + A3A132D4E243506251D0448F08935B93 /* KeyboardTracker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22F371B3EBB2A7B84B11B4687A5A4122 /* KeyboardTracker.swift */; }; + A5617DD5238B2EDE314D6A9110CFE391 /* CGFloat+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C40601F885EEF498338F0F3D0940B99F /* CGFloat+Additions.swift */; }; + A58FE8D84B5F1F4663AEDC149E3AE434 /* TextMessagePresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09802F0177B7395415243C806A52ECE0 /* TextMessagePresenter.swift */; }; + A636C4EF6A2A6F9D9EBCFA15FF972F8E /* BaseMessageModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8F1E432BC15A34A52E6583F21C1D526 /* BaseMessageModel.swift */; }; + A8C83B165CC00166011D78F473DE88A6 /* PhotosInputDataProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 899948B07AF10EFF958FE42E03002B4E /* PhotosInputDataProvider.swift */; }; + AD1F7BADAF279FADDC4712746786715E /* DeviceImagePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE216F909C038FBAE3679CB0E9126AE0 /* DeviceImagePicker.swift */; }; + AD34D11B6CFA8A807BCA16A1142A338D /* CGRect+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2AE9343D0A945ED2AC24F7B0A390A4E7 /* CGRect+Additions.swift */; }; + ADA8733CB0BB2891CF2F5CA6D5BCD1B1 /* ReusableXibView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F14F86937C99E9B9182BDC8D3D66B884 /* ReusableXibView.swift */; }; + AF114E4CFA26AE52F2937237CDCD91EA /* ChatDataSourceProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87C8C12E18BF8E7E2EE26A2412E9DCFD /* ChatDataSourceProtocol.swift */; }; + B129DBB873EBB17585033BC75A427C60 /* PhotosInputPlaceholderDataProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42841D9D846D9781CEFA4938F59760F0 /* PhotosInputPlaceholderDataProvider.swift */; }; + BCE0DE4E6A81CBFA97A854FEB12D5748 /* PhotoMessageAssets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = F7B09B7BBFF294077116E789BA62D48C /* PhotoMessageAssets.xcassets */; }; + BFF30F4F1C7C3C91BA39B53F1A62F287 /* ChatInputItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84E401C6009E6CBFD1139547BA604FB9 /* ChatInputItem.swift */; }; + C28C7557A9E4881AADAFFCA19436CBE3 /* SimulatorImagePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 320D17D55C07803D11384BBBA2A5ACEE /* SimulatorImagePicker.swift */; }; + C69B980A6911B033AC36CE4274FE6E46 /* CircleProgressView.h in Headers */ = {isa = PBXBuildFile; fileRef = B9CD5BEE75214684960D2D0186F18D39 /* CircleProgressView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C89141D3D6A38A0B2522C3AAE6885F34 /* PhotoMessagePresenterBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 054266A433FDCDF6CE22033EFC757A22 /* PhotoMessagePresenterBuilder.swift */; }; + CAFE51A88BA6BA95E5FC6AF81F3CDA1A /* ChattoAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = AD9B97CEBDD8AFB58128F14ACBBBC412 /* ChattoAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CCDFEE7929998DB07E8FB8D20E610BF8 /* PhotosInputViewItemSizeCalculator.swift in Sources */ = {isa = PBXBuildFile; fileRef = C474939F7D05C999342F3B5B9F5D5168 /* PhotosInputViewItemSizeCalculator.swift */; }; + D30F9E46E572C3BDF4673218FA283CDC /* ChatInputItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5AA587742C30D113BA584FA54710FD0A /* ChatInputItemView.swift */; }; + D5BABA0BE0A5BD093648652DC808A8AD /* ChatItemDecorationAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7345926803B4C970357560D78597DB8 /* ChatItemDecorationAttributes.swift */; }; + D6A412953E5130899000DCA9A94D49F2 /* BaseChatViewController+AccessoryViewRevealer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26FA5B1C9839F216FBAC1C8381EA6620 /* BaseChatViewController+AccessoryViewRevealer.swift */; }; + D78FBF1B215BDDD7F5B40F9F0DF73DB7 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C9FB20ED66AF2A93EB50539902AE6733 /* Foundation.framework */; }; + D9A9FD53F50423D1D8FEA054E8B81098 /* BaseMessageViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 124000A3BF8B8398B7A22D9123A19ED0 /* BaseMessageViewModel.swift */; }; + DE5169876329E95228222EF2EA32C713 /* TextMessageCollectionViewCellDefaultStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE380B5B75A6D0600DBDE77FF958ADAE /* TextMessageCollectionViewCellDefaultStyle.swift */; }; + E0EF8F5002F1FB2CCDBFD4CB23D85CCA /* TextMessageViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58BEF5E6331B2CB05F56D9E10C66A901 /* TextMessageViewModel.swift */; }; + E18F6A8194F510AC0B084DCA7FA9922C /* Chatto-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 4F8FDFD950B2CEC7365059B707D140D1 /* Chatto-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E1CC3FDDBFF4973752A92184E17B8F68 /* Observable.swift in Sources */ = {isa = PBXBuildFile; fileRef = A62614FA915BDC7A6FA98EC080BC0FE2 /* Observable.swift */; }; + E5240ACB57998CFD77EE321359242C05 /* AccessoryViewRevealer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73CF432CF510FECB05A97059F541A9C9 /* AccessoryViewRevealer.swift */; }; + E89FC072AC9479505161CE9EB863C553 /* PhotosInputCellProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15D9AC49FF1CA66072C8F284D4615DEE /* PhotosInputCellProvider.swift */; }; + EB33B65CCACA9146870CEEB75CC21BC4 /* Chatto.h in Headers */ = {isa = PBXBuildFile; fileRef = BBC0872AFC21DBB1EF8C9775F215B756 /* Chatto.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F13E099F9760BDADA5EA165B3D2BD014 /* PhotoMessageCollectionViewCellDefaultStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = E90B6821F7D9C990696D159A8A8F3885 /* PhotoMessageCollectionViewCellDefaultStyle.swift */; }; + F43492C2CEDEEA15778EE3EBAE4FA5C1 /* PhotoMessageViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAE542D15277B59EF8C23E3086B388A7 /* PhotoMessageViewModel.swift */; }; + F4C269E8BB9AD5A1B691D7AB8A39D6CA /* BaseChatViewController+Presenters.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7FA81C32043964F72CC0BD5E1AF4FEA /* BaseChatViewController+Presenters.swift */; }; + F68E941704E05913133B1FC3DC1EAE34 /* TextMessageModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 128C8DC0F70D827A45AA0DD49B3689D6 /* TextMessageModel.swift */; }; + F7385667FB15B42285F2739E5E192B52 /* PhotoMessagePresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA0E54B122003939CAFC03AE0FA4B5DC /* PhotoMessagePresenter.swift */; }; + FA7188EC15ECB27E3D34E079BAC86D52 /* BaseMessageCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88C185C185C37220F2DB10F36D736542 /* BaseMessageCollectionViewCell.swift */; }; + FC4DA29E0DA40655AAAB6FA4F90079AC /* AnimationUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB7CAC59BED45C08C2E61CC07F82A24E /* AnimationUtils.swift */; }; + FEA25065497E0BAE3FB16FC666C91DAC /* CircleProgressView.m in Sources */ = {isa = PBXBuildFile; fileRef = D5AC84164493C29F99955F0D66AA4184 /* CircleProgressView.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -117,174 +118,175 @@ isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = DCD24D044DCB3D3A8BB5461EC53DE4E2; + remoteGlobalIDString = CB03F082A875F222026BAF0346E84EC5; remoteInfo = ChattoAdditions; }; 919991093F4ADC46C15C3FE1FE49290F /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 0564C2782D1F2F8E464CB332E0FE7246; + remoteGlobalIDString = F3B3A79B2EF929FE3E146E8B922BFFF3; remoteInfo = Chatto; }; - E15D700B0C37BBB75A542999FE2533A3 /* PBXContainerItemProxy */ = { + 9830C72812585E9B6D4D7550B0BCA291 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 0564C2782D1F2F8E464CB332E0FE7246; + remoteGlobalIDString = F3B3A79B2EF929FE3E146E8B922BFFF3; remoteInfo = Chatto; }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 050EA91E2E5DB5E650DBAF3DD412C1FB /* Chatto.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; path = Chatto.podspec; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 054266A433FDCDF6CE22033EFC757A22 /* PhotoMessagePresenterBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotoMessagePresenterBuilder.swift; sourceTree = ""; }; - 05D5600D8E7D22AC3E225129F527765E /* CollectionChanges.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CollectionChanges.swift; sourceTree = ""; }; 09802F0177B7395415243C806A52ECE0 /* TextMessagePresenter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TextMessagePresenter.swift; sourceTree = ""; }; + 0BBB172ACF8D5FC99A24F909709EF0A6 /* LiveCameraCellPresenter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = LiveCameraCellPresenter.swift; sourceTree = ""; }; 0E8CD230BF38884D8498CDDAC2BD0AE7 /* Chatto.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Chatto.framework; path = Chatto.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 11540919D58B7B56085DA340933B0FC1 /* ChattoAdditions-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "ChattoAdditions-dummy.m"; sourceTree = ""; }; + 1223839FD87970CC27C696E8AFC08B73 /* Chatto.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Chatto.xcconfig; sourceTree = ""; }; 124000A3BF8B8398B7A22D9123A19ED0 /* BaseMessageViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BaseMessageViewModel.swift; sourceTree = ""; }; 1270F50E949DF5F1FB5E317CBFC4E308 /* ChatInputBarPresenter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatInputBarPresenter.swift; sourceTree = ""; }; 128C8DC0F70D827A45AA0DD49B3689D6 /* TextMessageModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TextMessageModel.swift; sourceTree = ""; }; - 129420675D0E892156C6D5F890C31DE9 /* LiveCameraCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = LiveCameraCell.swift; sourceTree = ""; }; - 14B80E0E9904F4BFCCEA00B151D33F58 /* DummyChatItemPresenter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = DummyChatItemPresenter.swift; sourceTree = ""; }; - 19441BE50AD243FC9F2E75C3DE5B8E80 /* ChatItemPresenterFactory.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatItemPresenterFactory.swift; sourceTree = ""; }; + 1487A45371AC8104BC0CE7C162FBF982 /* LiveCameraCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = LiveCameraCell.swift; sourceTree = ""; }; + 15D9AC49FF1CA66072C8F284D4615DEE /* PhotosInputCellProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotosInputCellProvider.swift; sourceTree = ""; }; 196E807B9D564A10BFF03F9C19F2A61B /* Pods-ChattoApp.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ChattoApp.release.xcconfig"; sourceTree = ""; }; - 1985774D53B3A1654C7775FD6A07A399 /* SerialTaskQueue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SerialTaskQueue.swift; path = Chatto/Source/SerialTaskQueue.swift; sourceTree = ""; }; 1D001EAE1C66ADDE971DE7417AA9FC5D /* ExpandableTextView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ExpandableTextView.swift; sourceTree = ""; }; + 1D34645FF568A8A90706512A58824527 /* ChatLayoutConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatLayoutConfiguration.swift; sourceTree = ""; }; + 1E18E8AA22C49C13E1C5CF858B738DC8 /* Chatto.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Chatto.modulemap; sourceTree = ""; }; + 22F371B3EBB2A7B84B11B4687A5A4122 /* KeyboardTracker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = KeyboardTracker.swift; sourceTree = ""; }; 247A5E9062AE185F8515C9C35998CD31 /* ChatInputBarAppearance.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatInputBarAppearance.swift; sourceTree = ""; }; - 29247C83C1B2146FA34637DA7510391C /* Chatto.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Chatto.modulemap; sourceTree = ""; }; + 26FA5B1C9839F216FBAC1C8381EA6620 /* BaseChatViewController+AccessoryViewRevealer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "BaseChatViewController+AccessoryViewRevealer.swift"; sourceTree = ""; }; 2A8F4A40C1DC22FF561A2874120DDC74 /* UIView+Additions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "UIView+Additions.swift"; sourceTree = ""; }; 2AE9343D0A945ED2AC24F7B0A390A4E7 /* CGRect+Additions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "CGRect+Additions.swift"; sourceTree = ""; }; + 2B4EB484C6FA399B96990E1C79915E64 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 2DD8E4BB9487A80F70C29231EA1E6295 /* HorizontalStackScrollView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = HorizontalStackScrollView.swift; sourceTree = ""; }; 2E72656362E555629AE7C98D6A4F14B3 /* CircleProgressIndicatorView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = CircleProgressIndicatorView.m; sourceTree = ""; }; - 2E8F42B307C00B2A41B5509D17EE211A /* PhotosInputCellProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotosInputCellProvider.swift; sourceTree = ""; }; - 2F938377FA02F6C0D99FD8706AC3C3D0 /* ChatCollectionViewLayout.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatCollectionViewLayout.swift; sourceTree = ""; }; - 3C3A8A70E90E0D7AF0C7506702585A4E /* ImagePicker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ImagePicker.swift; sourceTree = ""; }; - 3ED7B54C4A2CE71FF6F698ED3A75D087 /* Chatto.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Chatto.h; path = Chatto/Source/Chatto.h; sourceTree = ""; }; - 425AA302DBD7925EAF5AC414D86AEA0B /* BaseChatViewController+AccessoryViewRevealer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "BaseChatViewController+AccessoryViewRevealer.swift"; sourceTree = ""; }; + 320D17D55C07803D11384BBBA2A5ACEE /* SimulatorImagePicker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SimulatorImagePicker.swift; sourceTree = ""; }; + 3476C0B5EE071FF5997DED8B07EFA11C /* PhotosChatInputItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotosChatInputItem.swift; sourceTree = ""; }; + 40C59E85FF73F4E4F180194642C7E7EC /* PhotosInputCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotosInputCell.swift; sourceTree = ""; }; + 41213A169A1327F38C02D02FF4E7EAB4 /* PhotosInputCameraPicker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotosInputCameraPicker.swift; sourceTree = ""; }; + 42841D9D846D9781CEFA4938F59760F0 /* PhotosInputPlaceholderDataProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotosInputPlaceholderDataProvider.swift; sourceTree = ""; }; 42EB7C4A601A189E1ED3EF6E420EEDA7 /* CircleProgressIndicator.xcassets */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder.assetcatalog; path = CircleProgressIndicator.xcassets; sourceTree = ""; }; - 43B11277D4132D3470FC06F6E567361A /* PhotosInputCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotosInputCell.swift; sourceTree = ""; }; - 4510561EB01709E73B706E8CD931E27D /* ChatItemCompanion.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatItemCompanion.swift; sourceTree = ""; }; - 46581CCBDE0B2F41FF3265FC82B1E001 /* BaseChatViewController+Changes.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "BaseChatViewController+Changes.swift"; sourceTree = ""; }; 48A04A3FAAAFC0C4AAF832BBDE30C8D2 /* TextMessagePresenterBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TextMessagePresenterBuilder.swift; sourceTree = ""; }; 4A4DFA43E1F3E4B1A85CEFCEFC38500E /* Photos.xcassets */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder.assetcatalog; path = Photos.xcassets; sourceTree = ""; }; + 4A891FD7583480DA1F43E049418524D2 /* PhotosInputView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotosInputView.swift; sourceTree = ""; }; 4E3F504B152268D2F40F52A62C446408 /* Pods-ChattoApp-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-ChattoApp-dummy.m"; sourceTree = ""; }; - 4F90FA6D4FBA6832B0032AB803E89430 /* Chatto.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Chatto.xcconfig; sourceTree = ""; }; + 4F8FDFD950B2CEC7365059B707D140D1 /* Chatto-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Chatto-umbrella.h"; sourceTree = ""; }; 504410F6DF88345B0FC1D58FA4067A66 /* Pods-ChattoApp-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-ChattoApp-acknowledgements.markdown"; sourceTree = ""; }; - 50A7B423BC8E6016073DE574AF7AB1F2 /* Chatto-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Chatto-umbrella.h"; sourceTree = ""; }; + 5263B9973D3B6EC8CA1C8402347E902B /* BaseChatViewController+Changes.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "BaseChatViewController+Changes.swift"; sourceTree = ""; }; 53D247BEFAB9EF120E4F010A1F91C4C6 /* TextChatInputItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TextChatInputItem.swift; sourceTree = ""; }; - 55826B807503BE7DDC77A0B9310616CF /* Chatto-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Chatto-dummy.m"; sourceTree = ""; }; 58BEF5E6331B2CB05F56D9E10C66A901 /* TextMessageViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TextMessageViewModel.swift; sourceTree = ""; }; - 593C30E9D0A0055838C2854296640A47 /* PhotosInputPlaceholderCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotosInputPlaceholderCell.swift; sourceTree = ""; }; 5AA587742C30D113BA584FA54710FD0A /* ChatInputItemView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatInputItemView.swift; sourceTree = ""; }; - 5D0430B2B18F1C6A279939FE7FEAB97C /* PhotosInputViewItemSizeCalculator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotosInputViewItemSizeCalculator.swift; sourceTree = ""; }; + 5C8247FEE16DD077AD31937F3E008A95 /* BaseChatItemPresenter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BaseChatItemPresenter.swift; sourceTree = ""; }; 65042A58B2844DF8AA45E985932D0640 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 653AC366611432A9FD809ECC143989E4 /* UIEdgeInsets+Additions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "UIEdgeInsets+Additions.swift"; sourceTree = ""; }; 65540FDB9B6009E3AE2CD01F047293D9 /* ChattoAdditions-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ChattoAdditions-umbrella.h"; sourceTree = ""; }; - 663915E51C99CC0E3FF755D7D7C9B964 /* PhotosInputPlaceholderCellProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotosInputPlaceholderCellProvider.swift; sourceTree = ""; }; - 6689FB692180AEBAC101759EAD0116C2 /* AccessoryViewRevealer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AccessoryViewRevealer.swift; sourceTree = ""; }; - 6A352E08BEB4912F511344FF68E6BF19 /* PhotosChatInputItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotosChatInputItem.swift; sourceTree = ""; }; 6DAEAB5DAC1307E56BDF15E9DDC72623 /* Pods_ChattoApp.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_ChattoApp.framework; path = "Pods-ChattoApp.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; - 6E3235B63095189632DAF591C60640F6 /* BaseChatViewControllerView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BaseChatViewControllerView.swift; sourceTree = ""; }; + 73CF432CF510FECB05A97059F541A9C9 /* AccessoryViewRevealer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AccessoryViewRevealer.swift; sourceTree = ""; }; 7415D56E6E1F58660510D91A8808D437 /* TextMessageCollectionViewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TextMessageCollectionViewCell.swift; sourceTree = ""; }; 75A4D0F8C860BD4281E8AED08E680907 /* ChattoAdditions.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = ChattoAdditions.framework; path = ChattoAdditions.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 76C8CE48F21BBD79C3E57E7C28E5A051 /* Pods-ChattoApp.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-ChattoApp.modulemap"; sourceTree = ""; }; + 79432F3617D69C8DA909CFA540018DC4 /* BaseChatViewControllerView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BaseChatViewControllerView.swift; sourceTree = ""; }; + 7F865526B535C40AA043DF3C40157EBB /* Utils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Utils.swift; path = Chatto/Source/Utils.swift; sourceTree = ""; }; 84E401C6009E6CBFD1139547BA604FB9 /* ChatInputItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatInputItem.swift; sourceTree = ""; }; + 87C8C12E18BF8E7E2EE26A2412E9DCFD /* ChatDataSourceProtocol.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatDataSourceProtocol.swift; sourceTree = ""; }; 88C185C185C37220F2DB10F36D736542 /* BaseMessageCollectionViewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BaseMessageCollectionViewCell.swift; sourceTree = ""; }; + 899948B07AF10EFF958FE42E03002B4E /* PhotosInputDataProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotosInputDataProvider.swift; sourceTree = ""; }; 8A58C02B190EA9F6AE9FB698D29DCBC1 /* ChattoAdditions.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = ChattoAdditions.xcconfig; sourceTree = ""; }; 8B229F9BCB567E2FBB872000A9E0ECD2 /* BaseMessagePresenter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BaseMessagePresenter.swift; sourceTree = ""; }; 8C59631DCA268A4285E100821B4E160B /* CGSize+Additions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "CGSize+Additions.swift"; sourceTree = ""; }; + 8E21EA7E35385D3F8E558237788FEAB5 /* Chatto.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; path = Chatto.podspec; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 8E530272C9C6DF0ABC40B6E61D3DD29C /* BaseMessageAssets.xcassets */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder.assetcatalog; path = BaseMessageAssets.xcassets; sourceTree = ""; }; 8E6B9EFA482498A8F7626B346CDED36D /* BaseMessageCollectionViewCellDefaultStyle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BaseMessageCollectionViewCellDefaultStyle.swift; sourceTree = ""; }; + 8EC50CE002F4C3E5F8C47AA3D6B63CA5 /* BaseChatViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BaseChatViewController.swift; sourceTree = ""; }; 8ECE055A1AC334A37ED070AB2F0BA28D /* CircleIconView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = CircleIconView.h; sourceTree = ""; }; - 8FE7CDA883280C5BDFD7A2E6C025833A /* BaseChatItemPresenter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BaseChatItemPresenter.swift; sourceTree = ""; }; 92B5B3D91CB163330A0FD333E60DDCAB /* ChatInputBar.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatInputBar.swift; sourceTree = ""; }; + 92D473620C87E8EF86FC76C5A564AC69 /* BaseChatViewController+Scrolling.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "BaseChatViewController+Scrolling.swift"; sourceTree = ""; }; 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 97A51306EDB159C470E24D9B26BBB9E4 /* ChattoAdditions.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; path = ChattoAdditions.podspec; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 9D6AE0AE7C9D70F0256D868912937354 /* Pods-ChattoApp.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ChattoApp.debug.xcconfig"; sourceTree = ""; }; - 9D6F0E45378AD0C6B71082D352CC260B /* PhotosInputView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotosInputView.swift; sourceTree = ""; }; - A20874338A13B082557F5D7D5DAD78FE /* ReadOnlyOrderedDictionary.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ReadOnlyOrderedDictionary.swift; path = Chatto/Source/ReadOnlyOrderedDictionary.swift; sourceTree = ""; }; + A42734C8FFED903A56F2ACA651B53739 /* Chatto-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Chatto-dummy.m"; sourceTree = ""; }; A500CFC58AF814D90C69A58ED2780972 /* TabInputButton.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TabInputButton.swift; sourceTree = ""; }; A62614FA915BDC7A6FA98EC080BC0FE2 /* Observable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Observable.swift; sourceTree = ""; }; - A7C9C727136FE97562C19E9EED6E66C0 /* PhotosInputWithPlaceholdersDataProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotosInputWithPlaceholdersDataProvider.swift; sourceTree = ""; }; + AB2038633747734D88B4D933A146AE67 /* ReadOnlyOrderedDictionary.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ReadOnlyOrderedDictionary.swift; path = Chatto/Source/ReadOnlyOrderedDictionary.swift; sourceTree = ""; }; AB7CAC59BED45C08C2E61CC07F82A24E /* AnimationUtils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AnimationUtils.swift; sourceTree = ""; }; AD6D7F742DFE0768F96231D1F0733523 /* UIImage+Additions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "UIImage+Additions.swift"; sourceTree = ""; }; AD9B97CEBDD8AFB58128F14ACBBBC412 /* ChattoAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ChattoAdditions.h; path = ChattoAdditions/Source/ChattoAdditions.h; sourceTree = ""; }; AE1FCDE5DEF7DF407DE4318DBB83DB2D /* PhotoMessageModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotoMessageModel.swift; sourceTree = ""; }; - AFB8A0CFBD7C0AE7CB03BF74160D4DBA /* BaseChatViewController+Scrolling.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "BaseChatViewController+Scrolling.swift"; sourceTree = ""; }; + AFC940116D1FE152A8B4391C8179BAB7 /* SerialTaskQueue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SerialTaskQueue.swift; path = Chatto/Source/SerialTaskQueue.swift; sourceTree = ""; }; B1309CFDDC69D430EF26B5A607907C80 /* ChatInputBar.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; path = ChatInputBar.xib; sourceTree = ""; }; + B1C6AC04E26A1E1DE63AD1FAFE3232E6 /* ChatCollectionViewLayout.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatCollectionViewLayout.swift; sourceTree = ""; }; + B1FA7FF4FDB6920F132A3F86CF864637 /* PhotosInputPlaceholderCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotosInputPlaceholderCell.swift; sourceTree = ""; }; + B45107EC0B5669FFE263EEDC1376216D /* ChatItemPresenterFactory.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatItemPresenterFactory.swift; sourceTree = ""; }; B4DF0809CC047786F4137E42373F4134 /* UIColor+Additions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "UIColor+Additions.swift"; sourceTree = ""; }; B9CD5BEE75214684960D2D0186F18D39 /* CircleProgressView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = CircleProgressView.h; sourceTree = ""; }; + BA3D6A8FA7B4733B47E59765BAAE50B0 /* CollectionChanges.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CollectionChanges.swift; sourceTree = ""; }; + BBC0872AFC21DBB1EF8C9775F215B756 /* Chatto.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Chatto.h; path = Chatto/Source/Chatto.h; sourceTree = ""; }; + BC319BABE04FB7EE13FC04CC6841F22B /* LiveCameraCaptureSession.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = LiveCameraCaptureSession.swift; sourceTree = ""; }; BCB8F6E24C6E77A45A1B8328196C855C /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; BCD5E1BC57BB87C53CABBB55C3A86CE1 /* PhotoMessageCollectionViewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotoMessageCollectionViewCell.swift; sourceTree = ""; }; + BE216F909C038FBAE3679CB0E9126AE0 /* DeviceImagePicker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = DeviceImagePicker.swift; sourceTree = ""; }; BE380B5B75A6D0600DBDE77FF958ADAE /* TextMessageCollectionViewCellDefaultStyle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TextMessageCollectionViewCellDefaultStyle.swift; sourceTree = ""; }; BF40955EBCA1F843EB6FD57E0B53E165 /* CircleIconView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = CircleIconView.m; sourceTree = ""; }; - BF479F563BA6247F15B5BA474AF80975 /* PhotosInputCameraPicker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotosInputCameraPicker.swift; sourceTree = ""; }; + C03CA7139E45D8B591A159B7EA591CFD /* PhotosInputPlaceholderCellProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotosInputPlaceholderCellProvider.swift; sourceTree = ""; }; C40601F885EEF498338F0F3D0940B99F /* CGFloat+Additions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "CGFloat+Additions.swift"; sourceTree = ""; }; + C474939F7D05C999342F3B5B9F5D5168 /* PhotosInputViewItemSizeCalculator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotosInputViewItemSizeCalculator.swift; sourceTree = ""; }; C69DB6FA1411C4887C437DA609C8019E /* ChattoAdditions.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = ChattoAdditions.modulemap; sourceTree = ""; }; - C7A3114802D19936B30971AC47A85BAD /* BaseChatViewController+Presenters.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "BaseChatViewController+Presenters.swift"; sourceTree = ""; }; C9FB20ED66AF2A93EB50539902AE6733 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; CA0E54B122003939CAFC03AE0FA4B5DC /* PhotoMessagePresenter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotoMessagePresenter.swift; sourceTree = ""; }; CA346CB6808EFE01AE75836A1F7A0698 /* CircleProgressIndicatorView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = CircleProgressIndicatorView.h; sourceTree = ""; }; - CD2407785B3CE07C044E5860 /* DeviceImagePicker.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DeviceImagePicker.swift; sourceTree = ""; }; - CD240F278096B97B5422DDEC /* SimulatorImagePicker.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SimulatorImagePicker.swift; sourceTree = ""; }; + CFAF36B42F7ABC3D09FD5F061A0D6B79 /* ChatItemCompanion.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatItemCompanion.swift; sourceTree = ""; }; D0A636ED63D4950987B5410B6B50F1B4 /* Chatto.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Chatto.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D2408AA70D73DDBDEFCBB4C7ADE29172 /* Pods-ChattoApp-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ChattoApp-resources.sh"; sourceTree = ""; }; D26F81AF79CA37D208D3C6511A534949 /* Pods-ChattoApp-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-ChattoApp-umbrella.h"; sourceTree = ""; }; - D380068E3A21DDCA854A552D0681F12A /* PhotosInputPlaceholderDataProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotosInputPlaceholderDataProvider.swift; sourceTree = ""; }; D410A8560196ED567FD09A0BBCAAC9F8 /* Text.xcassets */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder.assetcatalog; path = Text.xcassets; sourceTree = ""; }; D5AC84164493C29F99955F0D66AA4184 /* CircleProgressView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = CircleProgressView.m; sourceTree = ""; }; - D9E20DA473442F4FE951198139ADCB9A /* ChatDataSourceProtocol.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatDataSourceProtocol.swift; sourceTree = ""; }; - DA258F8A88B4DE305AF692CEE5C855A7 /* LiveCameraCellPresenter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = LiveCameraCellPresenter.swift; sourceTree = ""; }; + D7FA81C32043964F72CC0BD5E1AF4FEA /* BaseChatViewController+Presenters.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "BaseChatViewController+Presenters.swift"; sourceTree = ""; }; + D89429FA94D510A5A6A77537122BBA05 /* PhotosInputWithPlaceholdersDataProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotosInputWithPlaceholdersDataProvider.swift; sourceTree = ""; }; DAE542D15277B59EF8C23E3086B388A7 /* PhotoMessageViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotoMessageViewModel.swift; sourceTree = ""; }; DB3BA07DBA51A986FB2A3D18DBB01B96 /* TextBubbleView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TextBubbleView.swift; sourceTree = ""; }; - DBA64E0B302B8C3DAD22C389E3F73CFB /* PhotosInputDataProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotosInputDataProvider.swift; sourceTree = ""; }; - DC63AB949B66E4124657A68C82D45349 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - DC6D20F1A27D9120A64F63AE5A503034 /* BaseChatViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BaseChatViewController.swift; sourceTree = ""; }; + DC7294781831F5B384F58E5C00EDFE61 /* ImagePicker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ImagePicker.swift; sourceTree = ""; }; DE00EA2B2F8904F2E6F64C976F9FC256 /* ViewDefinitions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ViewDefinitions.swift; sourceTree = ""; }; + E4599A7F6AEF15DFF28C49B6FF667278 /* DummyChatItemPresenter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = DummyChatItemPresenter.swift; sourceTree = ""; }; + E5DB80495DEC9A7A3F171F2C8144F441 /* ChatItemProtocolDefinitions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatItemProtocolDefinitions.swift; sourceTree = ""; }; E6E414FA5AE66A6E8074D4AAED7C914E /* Pods-ChattoApp-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ChattoApp-frameworks.sh"; sourceTree = ""; }; - E7F3B7809E5A273EF73736CF423B9CB5 /* Utils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Utils.swift; path = Chatto/Source/Utils.swift; sourceTree = ""; }; E90B6821F7D9C990696D159A8A8F3885 /* PhotoMessageCollectionViewCellDefaultStyle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotoMessageCollectionViewCellDefaultStyle.swift; sourceTree = ""; }; - E9ABAEAD42B233C4C72F4D8C62D264AC /* LiveCameraCaptureSession.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = LiveCameraCaptureSession.swift; sourceTree = ""; }; - F00A8A9ECFF12DCE30DABCE3E5E136D1 /* KeyboardTracker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = KeyboardTracker.swift; sourceTree = ""; }; F14F86937C99E9B9182BDC8D3D66B884 /* ReusableXibView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ReusableXibView.swift; sourceTree = ""; }; F207983FB08AF781AE4FF881D8960FF0 /* Alignment.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Alignment.swift; sourceTree = ""; }; F34BC85B23764467817891963F9FC304 /* PhotoBubbleView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotoBubbleView.swift; sourceTree = ""; }; - F3CDE366A58BC30ADF711EEC30F5562D /* Chatto-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Chatto-prefix.pch"; sourceTree = ""; }; F60670530F6217B4AA01EE0B7063477A /* Pods-ChattoApp-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-ChattoApp-acknowledgements.plist"; sourceTree = ""; }; F7345926803B4C970357560D78597DB8 /* ChatItemDecorationAttributes.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatItemDecorationAttributes.swift; sourceTree = ""; }; F7B09B7BBFF294077116E789BA62D48C /* PhotoMessageAssets.xcassets */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder.assetcatalog; path = PhotoMessageAssets.xcassets; sourceTree = ""; }; F8A201C1EFC6CB61F9E130E8293153B4 /* UIScreen+Scale.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "UIScreen+Scale.swift"; sourceTree = ""; }; F8F1E432BC15A34A52E6583F21C1D526 /* BaseMessageModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BaseMessageModel.swift; sourceTree = ""; }; FA6D3153E92F0A38E684B3D1D2436F9C /* ChattoAdditions-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ChattoAdditions-prefix.pch"; sourceTree = ""; }; + FB3F0B9729079B1E8A036EEA3B0C3E1C /* Chatto-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Chatto-prefix.pch"; sourceTree = ""; }; FD28FF28BA5E3CE8FC894E71C061E5F3 /* CGPoint+Additions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "CGPoint+Additions.swift"; sourceTree = ""; }; - FFD942A947D0F30C8639C1CBAB4AF302 /* ChatItemProtocolDefinitions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatItemProtocolDefinitions.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 0B96D432D4DE15EDE40B14E86F312EE6 /* Frameworks */ = { + 9B2813159043BB66E4F7CC6B5C8FBBB5 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 77E6F472B22328E2F6962FB06D4E8475 /* Foundation.framework in Frameworks */, + 7F663761FE373B0CB90C3906DC50E832 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 9B2813159043BB66E4F7CC6B5C8FBBB5 /* Frameworks */ = { + B98817E05EF24CE3E5A13C748CF9DAFD /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 7F663761FE373B0CB90C3906DC50E832 /* Foundation.framework in Frameworks */, + 5994C35B08BA5C89BFB59A96A28BCA0E /* Chatto.framework in Frameworks */, + 705ADC8E473A4FA09685E3A3938F71E4 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - F404562FFC16518B5FBEF36D049BDC46 /* Frameworks */ = { + E26A7945162FB43401BD4587FA3ADEFE /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - F122757D5AE43AEA5224C57D6BC791F3 /* Chatto.framework in Frameworks */, - 826A43BDFAD7AD06AE209B47592E31D0 /* Foundation.framework in Frameworks */, + D78FBF1B215BDDD7F5B40F9F0DF73DB7 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -299,6 +301,17 @@ name = Pod; sourceTree = ""; }; + 0CC4D77D4E8849FEF1B061254727ABDB /* Placeholder */ = { + isa = PBXGroup; + children = ( + B1FA7FF4FDB6920F132A3F86CF864637 /* PhotosInputPlaceholderCell.swift */, + C03CA7139E45D8B591A159B7EA591CFD /* PhotosInputPlaceholderCellProvider.swift */, + 42841D9D846D9781CEFA4938F59760F0 /* PhotosInputPlaceholderDataProvider.swift */, + ); + name = Placeholder; + path = Placeholder; + sourceTree = ""; + }; 0DE5E08F571511CE52E70557E53273A0 /* Views */ = { isa = PBXGroup; children = ( @@ -366,6 +379,21 @@ path = "ChattoAdditions/Source/Chat Items"; sourceTree = ""; }; + 1BD9C740423E9041A302C65E0C1F43AB /* Camera */ = { + isa = PBXGroup; + children = ( + BE216F909C038FBAE3679CB0E9126AE0 /* DeviceImagePicker.swift */, + DC7294781831F5B384F58E5C00EDFE61 /* ImagePicker.swift */, + BC319BABE04FB7EE13FC04CC6841F22B /* LiveCameraCaptureSession.swift */, + 1487A45371AC8104BC0CE7C162FBF982 /* LiveCameraCell.swift */, + 0BBB172ACF8D5FC99A24F909709EF0A6 /* LiveCameraCellPresenter.swift */, + 41213A169A1327F38C02D02FF4E7EAB4 /* PhotosInputCameraPicker.swift */, + 320D17D55C07803D11384BBBA2A5ACEE /* SimulatorImagePicker.swift */, + ); + name = Camera; + path = Camera; + sourceTree = ""; + }; 22A2D6F75C1471E06162A375AB446526 /* Text */ = { isa = PBXGroup; children = ( @@ -391,33 +419,12 @@ path = ../..; sourceTree = ""; }; - 28CAADEBE59305FF0AFA515404D9D6A5 /* Support Files */ = { + 28A7EF7A9B56C49D03E6D43820AC3C9E /* Pod */ = { isa = PBXGroup; children = ( - 29247C83C1B2146FA34637DA7510391C /* Chatto.modulemap */, - 4F90FA6D4FBA6832B0032AB803E89430 /* Chatto.xcconfig */, - 55826B807503BE7DDC77A0B9310616CF /* Chatto-dummy.m */, - F3CDE366A58BC30ADF711EEC30F5562D /* Chatto-prefix.pch */, - 50A7B423BC8E6016073DE574AF7AB1F2 /* Chatto-umbrella.h */, - DC63AB949B66E4124657A68C82D45349 /* Info.plist */, + 8E21EA7E35385D3F8E558237788FEAB5 /* Chatto.podspec */, ); - name = "Support Files"; - path = "ChattoApp/Pods/Target Support Files/Chatto"; - sourceTree = ""; - }; - 2D2264A5272B8D84F1F36EB119862DC4 /* Photos */ = { - isa = PBXGroup; - children = ( - 6A352E08BEB4912F511344FF68E6BF19 /* PhotosChatInputItem.swift */, - 9D6F0E45378AD0C6B71082D352CC260B /* PhotosInputView.swift */, - 5D0430B2B18F1C6A279939FE7FEAB97C /* PhotosInputViewItemSizeCalculator.swift */, - A7C9C727136FE97562C19E9EED6E66C0 /* PhotosInputWithPlaceholdersDataProvider.swift */, - 75ACAAA5B806B24FB753C3D0F0C50E08 /* Camera */, - 8922CE3C7F3299BD29D9A8D1F19249D9 /* Photo */, - 8C9A67A4CC2E6F8D43D518281CF5E4CC /* Placeholder */, - ); - name = Photos; - path = Photos; + name = Pod; sourceTree = ""; }; 321113FA91163F5F7FAE072DC193962C /* Resources */ = { @@ -441,6 +448,34 @@ path = Views; sourceTree = ""; }; + 3847617FA3586F5912AC9FFDB812B3EA /* Chatto */ = { + isa = PBXGroup; + children = ( + BBC0872AFC21DBB1EF8C9775F215B756 /* Chatto.h */, + AB2038633747734D88B4D933A146AE67 /* ReadOnlyOrderedDictionary.swift */, + AFC940116D1FE152A8B4391C8179BAB7 /* SerialTaskQueue.swift */, + 7F865526B535C40AA043DF3C40157EBB /* Utils.swift */, + 44E25DC6EAB44EA89F4244D294547A86 /* Chat Items */, + 6BF2DE770AC7D08DE1A80ED9891247E5 /* ChatController */, + 28A7EF7A9B56C49D03E6D43820AC3C9E /* Pod */, + 51FADDDCC03124536C75D2B05F6B328B /* Support Files */, + ); + name = Chatto; + path = ../..; + sourceTree = ""; + }; + 44E25DC6EAB44EA89F4244D294547A86 /* Chat Items */ = { + isa = PBXGroup; + children = ( + 5C8247FEE16DD077AD31937F3E008A95 /* BaseChatItemPresenter.swift */, + CFAF36B42F7ABC3D09FD5F061A0D6B79 /* ChatItemCompanion.swift */, + E5DB80495DEC9A7A3F171F2C8144F441 /* ChatItemProtocolDefinitions.swift */, + E4599A7F6AEF15DFF28C49B6FF667278 /* DummyChatItemPresenter.swift */, + ); + name = "Chat Items"; + path = "Chatto/Source/Chat Items"; + sourceTree = ""; + }; 474BECE036F9982A4536AD86894B69B6 /* TextMessages */ = { isa = PBXGroup; children = ( @@ -454,6 +489,20 @@ path = TextMessages; sourceTree = ""; }; + 51FADDDCC03124536C75D2B05F6B328B /* Support Files */ = { + isa = PBXGroup; + children = ( + 1E18E8AA22C49C13E1C5CF858B738DC8 /* Chatto.modulemap */, + 1223839FD87970CC27C696E8AFC08B73 /* Chatto.xcconfig */, + A42734C8FFED903A56F2ACA651B53739 /* Chatto-dummy.m */, + FB3F0B9729079B1E8A036EEA3B0C3E1C /* Chatto-prefix.pch */, + 4F8FDFD950B2CEC7365059B707D140D1 /* Chatto-umbrella.h */, + 2B4EB484C6FA399B96990E1C79915E64 /* Info.plist */, + ); + name = "Support Files"; + path = "ChattoApp/Pods/Target Support Files/Chatto"; + sourceTree = ""; + }; 52225918B65B4DB2949B01EDA32166D4 /* PhotoMessages */ = { isa = PBXGroup; children = ( @@ -476,40 +525,39 @@ path = "ChattoAdditions/Source/UI Components"; sourceTree = ""; }; - 60AC651C802E347E1D6FEB7C30CB8F41 /* Chat Items */ = { + 6B1E362069C276E133E5223A92CBC45E /* Photo */ = { isa = PBXGroup; children = ( - 8FE7CDA883280C5BDFD7A2E6C025833A /* BaseChatItemPresenter.swift */, - 4510561EB01709E73B706E8CD931E27D /* ChatItemCompanion.swift */, - FFD942A947D0F30C8639C1CBAB4AF302 /* ChatItemProtocolDefinitions.swift */, - 14B80E0E9904F4BFCCEA00B151D33F58 /* DummyChatItemPresenter.swift */, + 40C59E85FF73F4E4F180194642C7E7EC /* PhotosInputCell.swift */, + 15D9AC49FF1CA66072C8F284D4615DEE /* PhotosInputCellProvider.swift */, + 899948B07AF10EFF958FE42E03002B4E /* PhotosInputDataProvider.swift */, ); - name = "Chat Items"; - path = "Chatto/Source/Chat Items"; + name = Photo; + path = Photo; sourceTree = ""; }; - 6DA9B8896292756837F7099D5D261180 /* Text */ = { + 6BF2DE770AC7D08DE1A80ED9891247E5 /* ChatController */ = { isa = PBXGroup; children = ( - D410A8560196ED567FD09A0BBCAAC9F8 /* Text.xcassets */, + 8EC50CE002F4C3E5F8C47AA3D6B63CA5 /* BaseChatViewController.swift */, + 26FA5B1C9839F216FBAC1C8381EA6620 /* BaseChatViewController+AccessoryViewRevealer.swift */, + 5263B9973D3B6EC8CA1C8402347E902B /* BaseChatViewController+Changes.swift */, + D7FA81C32043964F72CC0BD5E1AF4FEA /* BaseChatViewController+Presenters.swift */, + 92D473620C87E8EF86FC76C5A564AC69 /* BaseChatViewController+Scrolling.swift */, + 1D34645FF568A8A90706512A58824527 /* ChatLayoutConfiguration.swift */, + BB58E1EC8BE45CFAAFBC41198E5D35BC /* Collaborators */, ); - name = Text; - path = Text; + name = ChatController; + path = Chatto/Source/ChatController; sourceTree = ""; }; - 75ACAAA5B806B24FB753C3D0F0C50E08 /* Camera */ = { + 6DA9B8896292756837F7099D5D261180 /* Text */ = { isa = PBXGroup; children = ( - 3C3A8A70E90E0D7AF0C7506702585A4E /* ImagePicker.swift */, - E9ABAEAD42B233C4C72F4D8C62D264AC /* LiveCameraCaptureSession.swift */, - 129420675D0E892156C6D5F890C31DE9 /* LiveCameraCell.swift */, - DA258F8A88B4DE305AF692CEE5C855A7 /* LiveCameraCellPresenter.swift */, - BF479F563BA6247F15B5BA474AF80975 /* PhotosInputCameraPicker.swift */, - CD2407785B3CE07C044E5860 /* DeviceImagePicker.swift */, - CD240F278096B97B5422DDEC /* SimulatorImagePicker.swift */, + D410A8560196ED567FD09A0BBCAAC9F8 /* Text.xcassets */, ); - name = Camera; - path = Camera; + name = Text; + path = Text; sourceTree = ""; }; 7DB346D0F39D3F0E887471402A8071AB = { @@ -532,32 +580,10 @@ name = Frameworks; sourceTree = ""; }; - 8922CE3C7F3299BD29D9A8D1F19249D9 /* Photo */ = { - isa = PBXGroup; - children = ( - 43B11277D4132D3470FC06F6E567361A /* PhotosInputCell.swift */, - 2E8F42B307C00B2A41B5509D17EE211A /* PhotosInputCellProvider.swift */, - DBA64E0B302B8C3DAD22C389E3F73CFB /* PhotosInputDataProvider.swift */, - ); - name = Photo; - path = Photo; - sourceTree = ""; - }; - 8C9A67A4CC2E6F8D43D518281CF5E4CC /* Placeholder */ = { - isa = PBXGroup; - children = ( - 593C30E9D0A0055838C2854296640A47 /* PhotosInputPlaceholderCell.swift */, - 663915E51C99CC0E3FF755D7D7C9B964 /* PhotosInputPlaceholderCellProvider.swift */, - D380068E3A21DDCA854A552D0681F12A /* PhotosInputPlaceholderDataProvider.swift */, - ); - name = Placeholder; - path = Placeholder; - sourceTree = ""; - }; 92F0134B58933BCDBB2DEC2938D0814F /* Development Pods */ = { isa = PBXGroup; children = ( - C55FDA764E3DB2D166DA5F96133D7211 /* Chatto */, + 3847617FA3586F5912AC9FFDB812B3EA /* Chatto */, 257642BACAAD92E7C1AD72EDAE39FD99 /* ChattoAdditions */, ); name = "Development Pods"; @@ -586,29 +612,29 @@ path = PhotoMessages; sourceTree = ""; }; - A6DFC6FE1A1B8A2218C942218A4003DE /* Products */ = { + A45F9C7674759BA2595821F733AA3F91 /* Photos */ = { isa = PBXGroup; children = ( - 0E8CD230BF38884D8498CDDAC2BD0AE7 /* Chatto.framework */, - 75A4D0F8C860BD4281E8AED08E680907 /* ChattoAdditions.framework */, - 6DAEAB5DAC1307E56BDF15E9DDC72623 /* Pods_ChattoApp.framework */, + 3476C0B5EE071FF5997DED8B07EFA11C /* PhotosChatInputItem.swift */, + 4A891FD7583480DA1F43E049418524D2 /* PhotosInputView.swift */, + C474939F7D05C999342F3B5B9F5D5168 /* PhotosInputViewItemSizeCalculator.swift */, + D89429FA94D510A5A6A77537122BBA05 /* PhotosInputWithPlaceholdersDataProvider.swift */, + 1BD9C740423E9041A302C65E0C1F43AB /* Camera */, + 6B1E362069C276E133E5223A92CBC45E /* Photo */, + 0CC4D77D4E8849FEF1B061254727ABDB /* Placeholder */, ); - name = Products; + name = Photos; + path = Photos; sourceTree = ""; }; - A736E97A92E826BFF6395274CED3155D /* Collaborators */ = { + A6DFC6FE1A1B8A2218C942218A4003DE /* Products */ = { isa = PBXGroup; children = ( - 6689FB692180AEBAC101759EAD0116C2 /* AccessoryViewRevealer.swift */, - 6E3235B63095189632DAF591C60640F6 /* BaseChatViewControllerView.swift */, - 2F938377FA02F6C0D99FD8706AC3C3D0 /* ChatCollectionViewLayout.swift */, - D9E20DA473442F4FE951198139ADCB9A /* ChatDataSourceProtocol.swift */, - 19441BE50AD243FC9F2E75C3DE5B8E80 /* ChatItemPresenterFactory.swift */, - 05D5600D8E7D22AC3E225129F527765E /* CollectionChanges.swift */, - F00A8A9ECFF12DCE30DABCE3E5E136D1 /* KeyboardTracker.swift */, + 0E8CD230BF38884D8498CDDAC2BD0AE7 /* Chatto.framework */, + 75A4D0F8C860BD4281E8AED08E680907 /* ChattoAdditions.framework */, + 6DAEAB5DAC1307E56BDF15E9DDC72623 /* Pods_ChattoApp.framework */, ); - name = Collaborators; - path = Collaborators; + name = Products; sourceTree = ""; }; AE6F80F46353E07AE954D6B1EDD9F911 /* Views */ = { @@ -636,34 +662,19 @@ path = CircleProgressIndicatorView; sourceTree = ""; }; - BA0E1940AC42B582281185CFA0A1E66F /* ChatController */ = { - isa = PBXGroup; - children = ( - DC6D20F1A27D9120A64F63AE5A503034 /* BaseChatViewController.swift */, - 425AA302DBD7925EAF5AC414D86AEA0B /* BaseChatViewController+AccessoryViewRevealer.swift */, - 46581CCBDE0B2F41FF3265FC82B1E001 /* BaseChatViewController+Changes.swift */, - C7A3114802D19936B30971AC47A85BAD /* BaseChatViewController+Presenters.swift */, - AFB8A0CFBD7C0AE7CB03BF74160D4DBA /* BaseChatViewController+Scrolling.swift */, - A736E97A92E826BFF6395274CED3155D /* Collaborators */, - ); - name = ChatController; - path = Chatto/Source/ChatController; - sourceTree = ""; - }; - C55FDA764E3DB2D166DA5F96133D7211 /* Chatto */ = { + BB58E1EC8BE45CFAAFBC41198E5D35BC /* Collaborators */ = { isa = PBXGroup; children = ( - 3ED7B54C4A2CE71FF6F698ED3A75D087 /* Chatto.h */, - A20874338A13B082557F5D7D5DAD78FE /* ReadOnlyOrderedDictionary.swift */, - 1985774D53B3A1654C7775FD6A07A399 /* SerialTaskQueue.swift */, - E7F3B7809E5A273EF73736CF423B9CB5 /* Utils.swift */, - 60AC651C802E347E1D6FEB7C30CB8F41 /* Chat Items */, - BA0E1940AC42B582281185CFA0A1E66F /* ChatController */, - F06DD6440DC2847A7D819C7E6C469E02 /* Pod */, - 28CAADEBE59305FF0AFA515404D9D6A5 /* Support Files */, + 73CF432CF510FECB05A97059F541A9C9 /* AccessoryViewRevealer.swift */, + 79432F3617D69C8DA909CFA540018DC4 /* BaseChatViewControllerView.swift */, + B1C6AC04E26A1E1DE63AD1FAFE3232E6 /* ChatCollectionViewLayout.swift */, + 87C8C12E18BF8E7E2EE26A2412E9DCFD /* ChatDataSourceProtocol.swift */, + B45107EC0B5669FFE263EEDC1376216D /* ChatItemPresenterFactory.swift */, + BA3D6A8FA7B4733B47E59765BAAE50B0 /* CollectionChanges.swift */, + 22F371B3EBB2A7B84B11B4687A5A4122 /* KeyboardTracker.swift */, ); - name = Chatto; - path = ../..; + name = Collaborators; + path = Collaborators; sourceTree = ""; }; CADDED158F05C91F72D157C51CA17C45 /* BaseMessage */ = { @@ -690,7 +701,7 @@ 2DD8E4BB9487A80F70C29231EA1E6295 /* HorizontalStackScrollView.swift */, F14F86937C99E9B9182BDC8D3D66B884 /* ReusableXibView.swift */, A500CFC58AF814D90C69A58ED2780972 /* TabInputButton.swift */, - 2D2264A5272B8D84F1F36EB119862DC4 /* Photos */, + A45F9C7674759BA2595821F733AA3F91 /* Photos */, 22A2D6F75C1471E06162A375AB446526 /* Text */, ); name = Input; @@ -764,14 +775,6 @@ path = ChattoAdditions/Source/Common; sourceTree = ""; }; - F06DD6440DC2847A7D819C7E6C469E02 /* Pod */ = { - isa = PBXGroup; - children = ( - 050EA91E2E5DB5E650DBAF3DD412C1FB /* Chatto.podspec */, - ); - name = Pod; - sourceTree = ""; - }; F33BCA37F50FA5D32BCEE6A31F3CCC65 /* Views */ = { isa = PBXGroup; children = ( @@ -793,55 +796,38 @@ /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ - 044A9A23330A57CF7DB42171A1A4D846 /* Headers */ = { + 030574653410EEDFEF711EDE4F23F3F0 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 733ECA7D1AEA031AA153E7A49C281A19 /* Pods-ChattoApp-umbrella.h in Headers */, + E18F6A8194F510AC0B084DCA7FA9922C /* Chatto-umbrella.h in Headers */, + EB33B65CCACA9146870CEEB75CC21BC4 /* Chatto.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 4C2E6440085347639274B5E55695A3CC /* Headers */ = { + 044A9A23330A57CF7DB42171A1A4D846 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 6CB02D239F26C9991C816CD677715057 /* Chatto-umbrella.h in Headers */, - 71E16DAE8DC770EB8839FFCED579143E /* Chatto.h in Headers */, + 733ECA7D1AEA031AA153E7A49C281A19 /* Pods-ChattoApp-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 713CFA1E060E0E1542BF6184168B0132 /* Headers */ = { + 84EE0BA41F07C64B950A4C303254DE6E /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - ED3A9540FCF8929A92605DD482096345 /* ChattoAdditions-umbrella.h in Headers */, - D9F713EAC4BD81B407957E3E29FEDE79 /* ChattoAdditions.h in Headers */, - 6D7F13AD0766C7171AA27435010DBD51 /* CircleIconView.h in Headers */, - C5CA29B99659A34C87C587840BE8B1CA /* CircleProgressIndicatorView.h in Headers */, - 3E43C0A2E3955FC38026140E26B4E602 /* CircleProgressView.h in Headers */, + 423A4E368CA258CE72ED24F0C784C28E /* ChattoAdditions-umbrella.h in Headers */, + CAFE51A88BA6BA95E5FC6AF81F3CDA1A /* ChattoAdditions.h in Headers */, + 48D774F9DBC66F7B3328E4DF830C7E5A /* CircleIconView.h in Headers */, + 5CA864BA6C30472334EA61B8A6D9A59B /* CircleProgressIndicatorView.h in Headers */, + C69B980A6911B033AC36CE4274FE6E46 /* CircleProgressView.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ - 0564C2782D1F2F8E464CB332E0FE7246 /* Chatto */ = { - isa = PBXNativeTarget; - buildConfigurationList = 0C6B695FB9120E769A46CB6A2BE56E58 /* Build configuration list for PBXNativeTarget "Chatto" */; - buildPhases = ( - FC7718CCB5674C515F6F48C858A4A737 /* Sources */, - 0B96D432D4DE15EDE40B14E86F312EE6 /* Frameworks */, - 4C2E6440085347639274B5E55695A3CC /* Headers */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = Chatto; - productName = Chatto; - productReference = 0E8CD230BF38884D8498CDDAC2BD0AE7 /* Chatto.framework */; - productType = "com.apple.product-type.framework"; - }; 83A90C41E2F6BCB5E19B5378BEB0B42A /* Pods-ChattoApp */ = { isa = PBXNativeTarget; buildConfigurationList = 1ACE60E84B8FD1DA1F249B79678D2A4E /* Build configuration list for PBXNativeTarget "Pods-ChattoApp" */; @@ -861,25 +847,42 @@ productReference = 6DAEAB5DAC1307E56BDF15E9DDC72623 /* Pods_ChattoApp.framework */; productType = "com.apple.product-type.framework"; }; - DCD24D044DCB3D3A8BB5461EC53DE4E2 /* ChattoAdditions */ = { + CB03F082A875F222026BAF0346E84EC5 /* ChattoAdditions */ = { isa = PBXNativeTarget; - buildConfigurationList = D409FEDA817C0F3E01C4F23EB3831EDF /* Build configuration list for PBXNativeTarget "ChattoAdditions" */; + buildConfigurationList = 62615C4FF060B952092F16A0387109C5 /* Build configuration list for PBXNativeTarget "ChattoAdditions" */; buildPhases = ( - DCFDEAF29A5E7F99544415DC497AD9AA /* Sources */, - F404562FFC16518B5FBEF36D049BDC46 /* Frameworks */, - 713CFA1E060E0E1542BF6184168B0132 /* Headers */, - 45C913FEB24561DECD46D14C9989EDE8 /* Resources */, + FE39F72DDD1E07BFC79E34946C9ABE3D /* Sources */, + B98817E05EF24CE3E5A13C748CF9DAFD /* Frameworks */, + 84EE0BA41F07C64B950A4C303254DE6E /* Headers */, + D7BC6B930C80E800ECA57F259358364B /* Resources */, ); buildRules = ( ); dependencies = ( - E3A00BAC4CD0E9F1098F630E28E6C8E6 /* PBXTargetDependency */, + 2FB2BAD92DFF592B15D3A68CF071C079 /* PBXTargetDependency */, ); name = ChattoAdditions; productName = ChattoAdditions; productReference = 75A4D0F8C860BD4281E8AED08E680907 /* ChattoAdditions.framework */; productType = "com.apple.product-type.framework"; }; + F3B3A79B2EF929FE3E146E8B922BFFF3 /* Chatto */ = { + isa = PBXNativeTarget; + buildConfigurationList = D42C7EDE276331796726730D7A9655F2 /* Build configuration list for PBXNativeTarget "Chatto" */; + buildPhases = ( + 0125C5751425D917C6559C688756A3B6 /* Sources */, + E26A7945162FB43401BD4587FA3ADEFE /* Frameworks */, + 030574653410EEDFEF711EDE4F23F3F0 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Chatto; + productName = Chatto; + productReference = 0E8CD230BF38884D8498CDDAC2BD0AE7 /* Chatto.framework */; + productType = "com.apple.product-type.framework"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -901,155 +904,156 @@ projectDirPath = ""; projectRoot = ""; targets = ( - 0564C2782D1F2F8E464CB332E0FE7246 /* Chatto */, - DCD24D044DCB3D3A8BB5461EC53DE4E2 /* ChattoAdditions */, + F3B3A79B2EF929FE3E146E8B922BFFF3 /* Chatto */, + CB03F082A875F222026BAF0346E84EC5 /* ChattoAdditions */, 83A90C41E2F6BCB5E19B5378BEB0B42A /* Pods-ChattoApp */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - 45C913FEB24561DECD46D14C9989EDE8 /* Resources */ = { + D7BC6B930C80E800ECA57F259358364B /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - AAC97E757D1592775A9A9499FB555858 /* BaseMessageAssets.xcassets in Resources */, - 00E3F827CF29D95C20BC041DE0B3E415 /* ChatInputBar.xib in Resources */, - 59F5745760DD39E7FDE89A10CA21B948 /* CircleProgressIndicator.xcassets in Resources */, - 7D20450EADD4BAEBAC1E1028D9768995 /* PhotoMessageAssets.xcassets in Resources */, - 1B5BAA97C46FBC289D2B770A2CF26195 /* Photos.xcassets in Resources */, - 759100F5B47B2E76F5CA16E2F37532D3 /* Text.xcassets in Resources */, + 70FEFCFC2A8832EB145F3E18916D4022 /* BaseMessageAssets.xcassets in Resources */, + 17A6A1AC584AAF6D214071188CF8D320 /* ChatInputBar.xib in Resources */, + 43618A8F6880123014BCFAD6EE452F43 /* CircleProgressIndicator.xcassets in Resources */, + BCE0DE4E6A81CBFA97A854FEB12D5748 /* PhotoMessageAssets.xcassets in Resources */, + 717869C722B7C46D09556EFB33A11486 /* Photos.xcassets in Resources */, + 37E5484E69AC3C4290114C9360C25321 /* Text.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - CDA3B34BC6D97B31FB60F315D389C2F7 /* Sources */ = { + 0125C5751425D917C6559C688756A3B6 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 93AC0348CFA081A20308C0FFA9A85A3A /* Pods-ChattoApp-dummy.m in Sources */, + E5240ACB57998CFD77EE321359242C05 /* AccessoryViewRevealer.swift in Sources */, + 9EA2120DF77F7DEFECC22032F1F58B29 /* BaseChatItemPresenter.swift in Sources */, + D6A412953E5130899000DCA9A94D49F2 /* BaseChatViewController+AccessoryViewRevealer.swift in Sources */, + 1EB3B46D4FA4A07B31843E1A5785F7B0 /* BaseChatViewController+Changes.swift in Sources */, + F4C269E8BB9AD5A1B691D7AB8A39D6CA /* BaseChatViewController+Presenters.swift in Sources */, + 2986205D8AC0CEEF268AE3E28A4878A9 /* BaseChatViewController+Scrolling.swift in Sources */, + 8DD30642274B7A93D205FD54A552B006 /* BaseChatViewController.swift in Sources */, + 5E08DBA5C1DCC7EA567AA8DC11DD64E1 /* BaseChatViewControllerView.swift in Sources */, + 425EAF6463FECAA4723451596ECA40B3 /* ChatCollectionViewLayout.swift in Sources */, + AF114E4CFA26AE52F2937237CDCD91EA /* ChatDataSourceProtocol.swift in Sources */, + 1B78F3EB05EB13125FE568781D7486FF /* ChatItemCompanion.swift in Sources */, + 69D0AB53007DF11147A1B1EC8987DF50 /* ChatItemPresenterFactory.swift in Sources */, + 7C0EFEE9B9E3DE06B84E4765ED934ED1 /* ChatItemProtocolDefinitions.swift in Sources */, + 3234AEC384AC96B20BA857B81DBFCC0C /* ChatLayoutConfiguration.swift in Sources */, + 89DF80AADDB0269D31EC805C0FD838E9 /* Chatto-dummy.m in Sources */, + 536C46DC87D180A26FB697C425647696 /* CollectionChanges.swift in Sources */, + 9FEF95A21384F801D04965CDD64C71FD /* DummyChatItemPresenter.swift in Sources */, + A3A132D4E243506251D0448F08935B93 /* KeyboardTracker.swift in Sources */, + 18CBC232D77FD725AF2592443A3CB3EA /* ReadOnlyOrderedDictionary.swift in Sources */, + 3990B9429830869037B61EB796198FAC /* SerialTaskQueue.swift in Sources */, + 02CE3BA69F02E6B00F6314F1C867BF50 /* Utils.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - DCFDEAF29A5E7F99544415DC497AD9AA /* Sources */ = { + CDA3B34BC6D97B31FB60F315D389C2F7 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 28075012B4DC5D40D6B054A83AA81BF8 /* Alignment.swift in Sources */, - A06C6E4AAEF5C39720886BA18621C919 /* AnimationUtils.swift in Sources */, - D653E8F4A1DAF0E61DF020F622DBA1D1 /* BaseMessageCollectionViewCell.swift in Sources */, - 00D6D10980978A3AD87F2EFA18D5FA53 /* BaseMessageCollectionViewCellDefaultStyle.swift in Sources */, - 48592135C286A8497752C7ED03A23CEE /* BaseMessageModel.swift in Sources */, - 93CD8A20A6A2DAA0C36A20F67C103030 /* BaseMessagePresenter.swift in Sources */, - 4C1E87BDED189A0548E50B02C69062B4 /* BaseMessageViewModel.swift in Sources */, - DAD6EDFF6F4E25EFB1DC50E550732E15 /* CGFloat+Additions.swift in Sources */, - DF03B550764571CA287E0B4B8CFD5DB2 /* CGPoint+Additions.swift in Sources */, - A528EB120A5E7DC270E7E2F133D85B3C /* CGRect+Additions.swift in Sources */, - 2500D71C245FFE4D6B9BFD4A2A1EDB85 /* CGSize+Additions.swift in Sources */, - CEB217F536637B792CD39700C6C09996 /* ChatInputBar.swift in Sources */, - F0A451A28135770A80CAE3312B2E396F /* ChatInputBarAppearance.swift in Sources */, - 512A57DEB9B46A901C1FC10527041D36 /* ChatInputBarPresenter.swift in Sources */, - E087569EF5E356913098318056B77BE3 /* ChatInputItem.swift in Sources */, - DF0DD294440693888AE371BD30638C9A /* ChatInputItemView.swift in Sources */, - 6355C90A3190FD3F4F748D9A50907DDE /* ChatItemDecorationAttributes.swift in Sources */, - C888A6F89201A5B9148B199FCC3A1329 /* ChattoAdditions-dummy.m in Sources */, - A1807B0B711E646B1E57F637E3D467FF /* CircleIconView.m in Sources */, - DFB12A9A065E868FE0EE84C6126EA37C /* CircleProgressIndicatorView.m in Sources */, - 43EB2F4B3C928EC0ABDE758E9A027F61 /* CircleProgressView.m in Sources */, - CC4F915B4A3E45BBFE4F9C409C345A2F /* ExpandableTextView.swift in Sources */, - 0D505833F07BC65FEBC299D37006365D /* HorizontalStackScrollView.swift in Sources */, - 60C8B2C6A1B1CE596A82309FDB96EE56 /* ImagePicker.swift in Sources */, - 7507614804E28F304AD99EE5C8B67C43 /* LiveCameraCaptureSession.swift in Sources */, - 2CDB23CA2683F68395293EE5DBD427A8 /* LiveCameraCell.swift in Sources */, - 3E32D7EA354D45031B987D3B0BA6B1F8 /* LiveCameraCellPresenter.swift in Sources */, - E601017C14729E02A50CC61844F9FC16 /* Observable.swift in Sources */, - 3E008FC7A2FDDCCCF61C7BD94C131EBE /* PhotoBubbleView.swift in Sources */, - AA0B570656617383FE7AFCC873A3F6C0 /* PhotoMessageCollectionViewCell.swift in Sources */, - A58BD56650DE9663F4A6B51B114E8921 /* PhotoMessageCollectionViewCellDefaultStyle.swift in Sources */, - 78F46BA4780730F9A3B1D419A4DC56BF /* PhotoMessageModel.swift in Sources */, - 1C0E2D574DEAA28340343074A044380C /* PhotoMessagePresenter.swift in Sources */, - 2EDA353EE9074C181A7F628FF5255F35 /* PhotoMessagePresenterBuilder.swift in Sources */, - FD053593E7C6C6E82265C241782F45F9 /* PhotoMessageViewModel.swift in Sources */, - 8F80B5B62BFD9C705AB6108ED449CCC1 /* PhotosChatInputItem.swift in Sources */, - 9ECEBD5C0D9255BF6888EB9D5D19D77A /* PhotosInputCameraPicker.swift in Sources */, - 8B417560642B39B55AB772AAAB4A5E25 /* PhotosInputCell.swift in Sources */, - 16361DBD3920836499A58C212E9B825F /* PhotosInputCellProvider.swift in Sources */, - 0EA4A981038BAA87CFD193759A602F8F /* PhotosInputDataProvider.swift in Sources */, - 14E1077906B79E35EB6C0D452E98E102 /* PhotosInputPlaceholderCell.swift in Sources */, - ED8761914EA48870B07EF342B4C412B1 /* PhotosInputPlaceholderCellProvider.swift in Sources */, - 919F6A1D05D00F1D815A5D6E30C16822 /* PhotosInputPlaceholderDataProvider.swift in Sources */, - 0C16A79AD329A1AE31DCB63829C8C87B /* PhotosInputView.swift in Sources */, - BD92A029D5888E3E83B13232899832BB /* PhotosInputViewItemSizeCalculator.swift in Sources */, - 259AE37389BAB08398971B61C68C0202 /* PhotosInputWithPlaceholdersDataProvider.swift in Sources */, - C12D5C1C7CF2DCC15D64201569A6A107 /* ReusableXibView.swift in Sources */, - 13F170B91F743BE7E900034704945334 /* TabInputButton.swift in Sources */, - F721CCDBC314636F25FC84F9002014A3 /* TextBubbleView.swift in Sources */, - FB8866C5639D10A9D6EF04ADC4667542 /* TextChatInputItem.swift in Sources */, - 3A87BB2197D9516F6A159670B8E98C26 /* TextMessageCollectionViewCell.swift in Sources */, - A6A57EC7C8F3AA159B14477221F8C91A /* TextMessageCollectionViewCellDefaultStyle.swift in Sources */, - CC1DC524A231D132832C59A91CB5F2BC /* TextMessageModel.swift in Sources */, - 5DB4ECF73BD0118F052100A502727579 /* TextMessagePresenter.swift in Sources */, - 31157864FC8DD8494902BD87CAEC950E /* TextMessagePresenterBuilder.swift in Sources */, - 8060B6D103DA4161BF922E14847B8736 /* TextMessageViewModel.swift in Sources */, - 902FA0B2997BA4D8AA0B17164278BBA7 /* UIColor+Additions.swift in Sources */, - CABD18923698A9608DFCC1A0A27A0C80 /* UIEdgeInsets+Additions.swift in Sources */, - FA5A27A37622D781F82E51B25551880F /* UIImage+Additions.swift in Sources */, - 3FE7D49AAD12760C3809D3EF079033DF /* UIScreen+Scale.swift in Sources */, - 39FE01D5BD4A9F43AE61C39CCFC868D8 /* UIView+Additions.swift in Sources */, - D383F5FDC2D260D8358A206310B7FC68 /* ViewDefinitions.swift in Sources */, - CD240780265A33455A58308A /* DeviceImagePicker.swift in Sources */, - CD240FBFE867CEE2C20A2C71 /* SimulatorImagePicker.swift in Sources */, + 93AC0348CFA081A20308C0FFA9A85A3A /* Pods-ChattoApp-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - FC7718CCB5674C515F6F48C858A4A737 /* Sources */ = { + FE39F72DDD1E07BFC79E34946C9ABE3D /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 1EBAAE2E59B3FDA14AAD805DFC2707D6 /* AccessoryViewRevealer.swift in Sources */, - 217914BBAE3847BF873C1386E1FAE9AA /* BaseChatItemPresenter.swift in Sources */, - 0D523E4FE6115F7A55C3AC1084204E4B /* BaseChatViewController+AccessoryViewRevealer.swift in Sources */, - E3FF292D87A07BA67A729AD36AEF5076 /* BaseChatViewController+Changes.swift in Sources */, - 0FD9575740CF2F8B25FF917D414DD453 /* BaseChatViewController+Presenters.swift in Sources */, - 010040154F5F454E72EF1468790FA4CD /* BaseChatViewController+Scrolling.swift in Sources */, - F6A0282EDBB0B7785CC58190CCFE9F8B /* BaseChatViewController.swift in Sources */, - 2F96149719263B6CB07600157780AF21 /* BaseChatViewControllerView.swift in Sources */, - 7B0EBDA75601E029EA64F03E579D0663 /* ChatCollectionViewLayout.swift in Sources */, - 1D22A8C6A20F2FE60BB35918061C3ECB /* ChatDataSourceProtocol.swift in Sources */, - FC9C847E639368AE9DCD4F4C0D745EF3 /* ChatItemCompanion.swift in Sources */, - 8867B0709DE6851C45CD27BC45D5E4E7 /* ChatItemPresenterFactory.swift in Sources */, - 33C9126C93D8B4F3D6A1543B4C98618E /* ChatItemProtocolDefinitions.swift in Sources */, - F44F9E965318C8D275A6D6F27D2BB14E /* Chatto-dummy.m in Sources */, - 532E7EF69E5BE6723F2A4EFAB7ED6607 /* CollectionChanges.swift in Sources */, - 2CB7713B0D33C9E905F429EF16FB86DF /* DummyChatItemPresenter.swift in Sources */, - 406F0C247B841E15DC8D6F0FF0420D73 /* KeyboardTracker.swift in Sources */, - 3FB5355485D2570D0EE541C1C640812F /* ReadOnlyOrderedDictionary.swift in Sources */, - 831E03B95B8F5E02ACF2250807749B41 /* SerialTaskQueue.swift in Sources */, - 3B378B2BBAC42362BDF8AB7F08688E8B /* Utils.swift in Sources */, + 36ECF3B6D22A9B26CF195921FA9FB166 /* Alignment.swift in Sources */, + FC4DA29E0DA40655AAAB6FA4F90079AC /* AnimationUtils.swift in Sources */, + FA7188EC15ECB27E3D34E079BAC86D52 /* BaseMessageCollectionViewCell.swift in Sources */, + 7C4D5F4CA2DAA84A15307B68ED914A97 /* BaseMessageCollectionViewCellDefaultStyle.swift in Sources */, + A636C4EF6A2A6F9D9EBCFA15FF972F8E /* BaseMessageModel.swift in Sources */, + 339A9E762CDD578F7DF8C8C9C5E34E97 /* BaseMessagePresenter.swift in Sources */, + D9A9FD53F50423D1D8FEA054E8B81098 /* BaseMessageViewModel.swift in Sources */, + A5617DD5238B2EDE314D6A9110CFE391 /* CGFloat+Additions.swift in Sources */, + 0E1462CEC9D2BB30016796D787FD3249 /* CGPoint+Additions.swift in Sources */, + AD34D11B6CFA8A807BCA16A1142A338D /* CGRect+Additions.swift in Sources */, + 5B2EB2FA2D00C9CA7B1B5774D6D1E6D5 /* CGSize+Additions.swift in Sources */, + 41D047F989032464108E6EE8764FC8FF /* ChatInputBar.swift in Sources */, + 11B2523F4443015EFDEA1DCCECF773D0 /* ChatInputBarAppearance.swift in Sources */, + 1A55F588D2BCAE5761C6389011C02661 /* ChatInputBarPresenter.swift in Sources */, + BFF30F4F1C7C3C91BA39B53F1A62F287 /* ChatInputItem.swift in Sources */, + D30F9E46E572C3BDF4673218FA283CDC /* ChatInputItemView.swift in Sources */, + D5BABA0BE0A5BD093648652DC808A8AD /* ChatItemDecorationAttributes.swift in Sources */, + 19B33E6CD8D93361BF336564EFDC27B9 /* ChattoAdditions-dummy.m in Sources */, + 325E12A4E947379B7B77829BBE990EAD /* CircleIconView.m in Sources */, + 123327C96E10DB97395C607A98CACEAB /* CircleProgressIndicatorView.m in Sources */, + FEA25065497E0BAE3FB16FC666C91DAC /* CircleProgressView.m in Sources */, + AD1F7BADAF279FADDC4712746786715E /* DeviceImagePicker.swift in Sources */, + 406277494EF48172137FE4D41DE545DE /* ExpandableTextView.swift in Sources */, + 0D08CE30D5143B5F68A145F915CED9A8 /* HorizontalStackScrollView.swift in Sources */, + 7EAA32B3B18209F7E9910D2A1F260361 /* ImagePicker.swift in Sources */, + 46B23101F2C9EB6C2D8D0A925C3A3E35 /* LiveCameraCaptureSession.swift in Sources */, + 5CC30B0AA5E0C72415D3C0467A8D4324 /* LiveCameraCell.swift in Sources */, + 3A524A7F6CC21ABBFD487AB542F665DC /* LiveCameraCellPresenter.swift in Sources */, + E1CC3FDDBFF4973752A92184E17B8F68 /* Observable.swift in Sources */, + 08F8014E7C34A1933EEE464F8A7FD948 /* PhotoBubbleView.swift in Sources */, + 936348BC9FA00DE4751CD9165E2D14E5 /* PhotoMessageCollectionViewCell.swift in Sources */, + F13E099F9760BDADA5EA165B3D2BD014 /* PhotoMessageCollectionViewCellDefaultStyle.swift in Sources */, + 705E7BFE90BC4F32123FD61B7D6DDE0D /* PhotoMessageModel.swift in Sources */, + F7385667FB15B42285F2739E5E192B52 /* PhotoMessagePresenter.swift in Sources */, + C89141D3D6A38A0B2522C3AAE6885F34 /* PhotoMessagePresenterBuilder.swift in Sources */, + F43492C2CEDEEA15778EE3EBAE4FA5C1 /* PhotoMessageViewModel.swift in Sources */, + 915D77F697630FFFE9B7456BD9158909 /* PhotosChatInputItem.swift in Sources */, + 60593D3B7251C8794767D33622E56259 /* PhotosInputCameraPicker.swift in Sources */, + 97E2827833D127D296B3901D29C13755 /* PhotosInputCell.swift in Sources */, + E89FC072AC9479505161CE9EB863C553 /* PhotosInputCellProvider.swift in Sources */, + A8C83B165CC00166011D78F473DE88A6 /* PhotosInputDataProvider.swift in Sources */, + 131899ACA4567508E705F077A2402BEA /* PhotosInputPlaceholderCell.swift in Sources */, + 827296B2AB1BCE4CCA8E47180866927D /* PhotosInputPlaceholderCellProvider.swift in Sources */, + B129DBB873EBB17585033BC75A427C60 /* PhotosInputPlaceholderDataProvider.swift in Sources */, + 3FFE645D7F0A109E86AC440814482B51 /* PhotosInputView.swift in Sources */, + CCDFEE7929998DB07E8FB8D20E610BF8 /* PhotosInputViewItemSizeCalculator.swift in Sources */, + 675AC2126A225E5DA52B5486BF106C4E /* PhotosInputWithPlaceholdersDataProvider.swift in Sources */, + ADA8733CB0BB2891CF2F5CA6D5BCD1B1 /* ReusableXibView.swift in Sources */, + C28C7557A9E4881AADAFFCA19436CBE3 /* SimulatorImagePicker.swift in Sources */, + 90D09BB277BF9EC20D5C035DD35271D9 /* TabInputButton.swift in Sources */, + 6E58A916AF862E96FE9E1E80E9CF1628 /* TextBubbleView.swift in Sources */, + 7C3B55D2D648098E0F561A189ADAD5B9 /* TextChatInputItem.swift in Sources */, + 0E2A38FE6272887678D5B2619CDF028F /* TextMessageCollectionViewCell.swift in Sources */, + DE5169876329E95228222EF2EA32C713 /* TextMessageCollectionViewCellDefaultStyle.swift in Sources */, + F68E941704E05913133B1FC3DC1EAE34 /* TextMessageModel.swift in Sources */, + A58FE8D84B5F1F4663AEDC149E3AE434 /* TextMessagePresenter.swift in Sources */, + 71BD18B5F73AA8E71E88803C2D9AFFDC /* TextMessagePresenterBuilder.swift in Sources */, + E0EF8F5002F1FB2CCDBFD4CB23D85CCA /* TextMessageViewModel.swift in Sources */, + 1AAD77F43DDDAE59C60718AC186CBA3D /* UIColor+Additions.swift in Sources */, + 64658EDE7621DF8D7CA77870B1060D71 /* UIEdgeInsets+Additions.swift in Sources */, + 513D3AC06D6C5D629E8D618B00F13101 /* UIImage+Additions.swift in Sources */, + 355EA957643570570C38A1A965305096 /* UIScreen+Scale.swift in Sources */, + 511CF5A6863FE5D4E5081DD49FDF685E /* UIView+Additions.swift in Sources */, + 3F6026561EF3D31C97E2F9C45648E444 /* ViewDefinitions.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 6E827308370CF34C79256B8EABA2D4A7 /* PBXTargetDependency */ = { + 2FB2BAD92DFF592B15D3A68CF071C079 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = Chatto; - target = 0564C2782D1F2F8E464CB332E0FE7246 /* Chatto */; - targetProxy = 919991093F4ADC46C15C3FE1FE49290F /* PBXContainerItemProxy */; + target = F3B3A79B2EF929FE3E146E8B922BFFF3 /* Chatto */; + targetProxy = 9830C72812585E9B6D4D7550B0BCA291 /* PBXContainerItemProxy */; }; - E3A00BAC4CD0E9F1098F630E28E6C8E6 /* PBXTargetDependency */ = { + 6E827308370CF34C79256B8EABA2D4A7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = Chatto; - target = 0564C2782D1F2F8E464CB332E0FE7246 /* Chatto */; - targetProxy = E15D700B0C37BBB75A542999FE2533A3 /* PBXContainerItemProxy */; + target = F3B3A79B2EF929FE3E146E8B922BFFF3 /* Chatto */; + targetProxy = 919991093F4ADC46C15C3FE1FE49290F /* PBXContainerItemProxy */; }; F1550BD030CD6847B1E3C4DCF342B150 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = ChattoAdditions; - target = DCD24D044DCB3D3A8BB5461EC53DE4E2 /* ChattoAdditions */; + target = CB03F082A875F222026BAF0346E84EC5 /* ChattoAdditions */; targetProxy = 06FA345DEABBFBA4C02A6207382A8FAA /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ @@ -1089,104 +1093,9 @@ }; name = Debug; }; - 43643072528A8AE057C78ED474CC4C45 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 8A58C02B190EA9F6AE9FB698D29DCBC1 /* ChattoAdditions.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/ChattoAdditions/ChattoAdditions-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/ChattoAdditions/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/ChattoAdditions/ChattoAdditions.modulemap"; - PRODUCT_NAME = ChattoAdditions; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 4.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - 531A252B777CB68E1FD986E343CC610C /* Release */ = { + 3EEA2F14360100CE5A85519BFF7BD914 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 4F90FA6D4FBA6832B0032AB803E89430 /* Chatto.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/Chatto/Chatto-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Chatto/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/Chatto/Chatto.modulemap"; - PRODUCT_NAME = Chatto; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 4.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - AFF137C0A571AE41193CCCBD6AA4B24B /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 8A58C02B190EA9F6AE9FB698D29DCBC1 /* ChattoAdditions.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/ChattoAdditions/ChattoAdditions-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/ChattoAdditions/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/ChattoAdditions/ChattoAdditions.modulemap"; - PRODUCT_NAME = ChattoAdditions; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 4.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - B263121BB873113DC023F3CB65BF89CB /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 4F90FA6D4FBA6832B0032AB803E89430 /* Chatto.xcconfig */; + baseConfigurationReference = 1223839FD87970CC27C696E8AFC08B73 /* Chatto.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -1370,18 +1279,104 @@ }; name = Release; }; + EEBF3D454A2B7A4C72799E02D78FFA3E /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 8A58C02B190EA9F6AE9FB698D29DCBC1 /* ChattoAdditions.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/ChattoAdditions/ChattoAdditions-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/ChattoAdditions/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/ChattoAdditions/ChattoAdditions.modulemap"; + PRODUCT_NAME = ChattoAdditions; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + F1AA1465A594E4AAF3EFC90A83F41339 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 1223839FD87970CC27C696E8AFC08B73 /* Chatto.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/Chatto/Chatto-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Chatto/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/Chatto/Chatto.modulemap"; + PRODUCT_NAME = Chatto; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + F9678CF70CE3905D2398B20A016EA9D1 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 8A58C02B190EA9F6AE9FB698D29DCBC1 /* ChattoAdditions.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/ChattoAdditions/ChattoAdditions-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/ChattoAdditions/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/ChattoAdditions/ChattoAdditions.modulemap"; + PRODUCT_NAME = ChattoAdditions; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 0C6B695FB9120E769A46CB6A2BE56E58 /* Build configuration list for PBXNativeTarget "Chatto" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - B263121BB873113DC023F3CB65BF89CB /* Debug */, - 531A252B777CB68E1FD986E343CC610C /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; 1ACE60E84B8FD1DA1F249B79678D2A4E /* Build configuration list for PBXNativeTarget "Pods-ChattoApp" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -1400,11 +1395,20 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - D409FEDA817C0F3E01C4F23EB3831EDF /* Build configuration list for PBXNativeTarget "ChattoAdditions" */ = { + 62615C4FF060B952092F16A0387109C5 /* Build configuration list for PBXNativeTarget "ChattoAdditions" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F9678CF70CE3905D2398B20A016EA9D1 /* Debug */, + EEBF3D454A2B7A4C72799E02D78FFA3E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + D42C7EDE276331796726730D7A9655F2 /* Build configuration list for PBXNativeTarget "Chatto" */ = { isa = XCConfigurationList; buildConfigurations = ( - 43643072528A8AE057C78ED474CC4C45 /* Debug */, - AFF137C0A571AE41193CCCBD6AA4B24B /* Release */, + 3EEA2F14360100CE5A85519BFF7BD914 /* Debug */, + F1AA1465A594E4AAF3EFC90A83F41339 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; From 9842619d8e97c82511dfd5984a795b7ba482ac0d Mon Sep 17 00:00:00 2001 From: Alexander Zimin Date: Wed, 21 Feb 2018 15:11:13 +0000 Subject: [PATCH 11/12] Fixed comments --- .../BaseChatViewController.swift | 20 ++++++------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/Chatto/Source/ChatController/BaseChatViewController.swift b/Chatto/Source/ChatController/BaseChatViewController.swift index 338e1e7af..848ae7ef5 100644 --- a/Chatto/Source/ChatController/BaseChatViewController.swift +++ b/Chatto/Source/ChatController/BaseChatViewController.swift @@ -239,9 +239,9 @@ open class BaseChatViewController: UIViewController, UICollectionViewDataSource, public var allContentFits: Bool { let inputHeightWithKeyboard = self.view.bounds.height - self.inputContainer.frame.minY - let newInsetTop = self.topLayoutGuide.length + self.layoutConfiguration.contentInsets.top - let newInsetBottom = self.layoutConfiguration.contentInsets.bottom + inputHeightWithKeyboard - let availableHeight = self.collectionView.bounds.height - (newInsetTop + newInsetBottom) + let insetTop = self.topLayoutGuide.length + self.layoutConfiguration.contentInsets.top + let insetBottom = self.layoutConfiguration.contentInsets.bottom + inputHeightWithKeyboard + let availableHeight = self.collectionView.bounds.height - (insetTop + insetBottom) let contentSize = self.collectionView.collectionViewLayout.collectionViewContentSize return availableHeight >= contentSize.height } @@ -281,21 +281,13 @@ open class BaseChatViewController: UIViewController, UICollectionViewDataSource, guard shouldUpdateContentOffset else { return } let inputIsAtBottom = self.view.bounds.maxY - self.inputContainer.frame.maxY <= 0 - if allContentFits { - var contentOffset = self.collectionView.contentOffset - contentOffset.y = -self.collectionView.contentInset.top - self.updateContentViewOffset(contentOffset) + if self.allContentFits { + self.collectionView.contentOffset.y = -self.collectionView.contentInset.top } else if !isInteracting || inputIsAtBottom { - var contentOffset = self.collectionView.contentOffset - contentOffset.y = newContentOffsetY - self.updateContentViewOffset(contentOffset) + self.collectionView.contentOffset.y = newContentOffsetY } } - open func updateContentViewOffset(_ newValue: CGPoint) { - self.collectionView.contentOffset = newValue - } - func rectAtIndexPath(_ indexPath: IndexPath?) -> CGRect? { if let indexPath = indexPath { return self.collectionView.collectionViewLayout.layoutAttributesForItem(at: indexPath)?.frame From 6b9ee94d106905a22a0398d5d6aa4b41b6ba9689 Mon Sep 17 00:00:00 2001 From: Anton Schukin Date: Sun, 25 Feb 2018 13:58:35 +0000 Subject: [PATCH 12/12] Fixed issue with wrong input bar position when hidesBottomBarWhenPushed is true on iPhone X --- .../BaseChatViewController.swift | 31 ++- ChattoApp/ChattoApp.xcodeproj/project.pbxproj | 28 +-- .../ChattoApp/Base.lproj/Main.storyboard | 233 ------------------ ChattoApp/ChattoApp/Info.plist | 2 - ChattoApp/ChattoApp/Source/AppDelegate.swift | 31 +-- .../Source/CellsViewController.swift | 61 +++++ .../DemoChatViewController.swift | 2 + .../Source/ChatExamplesViewController.swift | 94 +++++++ ...ChatWithTabBarExamplesViewController.swift | 59 +++++ .../Source/ConversationsViewController.swift | 66 ----- 10 files changed, 253 insertions(+), 354 deletions(-) delete mode 100644 ChattoApp/ChattoApp/Base.lproj/Main.storyboard create mode 100644 ChattoApp/ChattoApp/Source/CellsViewController.swift create mode 100644 ChattoApp/ChattoApp/Source/ChatExamplesViewController.swift create mode 100644 ChattoApp/ChattoApp/Source/ChatWithTabBarExamplesViewController.swift delete mode 100644 ChattoApp/ChattoApp/Source/ConversationsViewController.swift diff --git a/Chatto/Source/ChatController/BaseChatViewController.swift b/Chatto/Source/ChatController/BaseChatViewController.swift index 848ae7ef5..0e0aef4bd 100644 --- a/Chatto/Source/ChatController/BaseChatViewController.swift +++ b/Chatto/Source/ChatController/BaseChatViewController.swift @@ -184,20 +184,25 @@ open class BaseChatViewController: UIViewController, UICollectionViewDataSource, } private func setupInputContainerBottomConstraint() { - // If we have been pushed on nav controller and hidesBottomBarWhenPushed = true, then ignore bottomLayoutMargin - // because it has incorrect value when we actually have a bottom bar (tabbar) - // Also if instance of BaseChatViewController is added as childViewController to another view controller, we had to check all this stuf on parent instance instead of self - let navigatedController: UIViewController - if let parent = self.parent, !(parent is UINavigationController || parent is UITabBarController) { - navigatedController = parent - } else { - navigatedController = self - } - - if navigatedController.hidesBottomBarWhenPushed && (navigationController?.viewControllers.count ?? 0) > 1 && navigationController?.viewControllers.last == navigatedController { - self.inputContainerBottomConstraint.constant = 0 - } else { + if #available(iOS 11.0, *) { self.inputContainerBottomConstraint.constant = self.bottomLayoutGuide.length + } else { + // If we have been pushed on nav controller and hidesBottomBarWhenPushed = true, then ignore bottomLayoutMargin + // because it has incorrect value when we actually have a bottom bar (tabbar) + // Also if instance of BaseChatViewController is added as childViewController to another view controller, we had to check all this stuf on parent instance instead of self + // UPD: Fixed in iOS 11.0 + let navigatedController: UIViewController + if let parent = self.parent, !(parent is UINavigationController || parent is UITabBarController) { + navigatedController = parent + } else { + navigatedController = self + } + + if navigatedController.hidesBottomBarWhenPushed && (navigationController?.viewControllers.count ?? 0) > 1 && navigationController?.viewControllers.last == navigatedController { + self.inputContainerBottomConstraint.constant = 0 + } else { + self.inputContainerBottomConstraint.constant = self.bottomLayoutGuide.length + } } } diff --git a/ChattoApp/ChattoApp.xcodeproj/project.pbxproj b/ChattoApp/ChattoApp.xcodeproj/project.pbxproj index eae3fe7af..9e3967b9f 100644 --- a/ChattoApp/ChattoApp.xcodeproj/project.pbxproj +++ b/ChattoApp/ChattoApp.xcodeproj/project.pbxproj @@ -7,11 +7,12 @@ objects = { /* Begin PBXBuildFile section */ + 0997CD2F2042E42100D7BDF9 /* CellsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0997CD2E2042E42100D7BDF9 /* CellsViewController.swift */; }; + 0997CD312042E58400D7BDF9 /* ChatWithTabBarExamplesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0997CD302042E58400D7BDF9 /* ChatWithTabBarExamplesViewController.swift */; }; 5587302E1FCD7EE5005BC2EC /* MessagesSelectionChatViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5587302D1FCD7EE5005BC2EC /* MessagesSelectionChatViewController.swift */; }; 558730341FCD8891005BC2EC /* AddRandomMessageChatViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 558730331FCD8891005BC2EC /* AddRandomMessageChatViewController.swift */; }; 55A77B4A1FCC5EE70040C77E /* MessagesSelectorProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55A77B491FCC5EE70040C77E /* MessagesSelectorProtocol.swift */; }; 55A77B4C1FCC5FFB0040C77E /* BaseMessagesSelector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55A77B4B1FCC5FFB0040C77E /* BaseMessagesSelector.swift */; }; - C33FBFAE1BDE441C008E3545 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C33FBFAC1BDE441C008E3545 /* Main.storyboard */; }; C33FBFB01BDE441C008E3545 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C33FBFAF1BDE441C008E3545 /* Assets.xcassets */; }; C33FBFB31BDE441C008E3545 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C33FBFB11BDE441C008E3545 /* LaunchScreen.storyboard */; }; C341D42E1C9635DF00FD3463 /* TimeSeparatorModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C341D42B1C9635DF00FD3463 /* TimeSeparatorModel.swift */; }; @@ -20,7 +21,7 @@ C35A6F4F1BF807EC0085CA19 /* SlidingDataSourceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C35A6F4E1BF807EC0085CA19 /* SlidingDataSourceTests.swift */; }; C3F91DB61C75EF9E00D461D2 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3F91DA01C75EF9E00D461D2 /* AppDelegate.swift */; }; C3F91DB71C75EF9E00D461D2 /* DemoChatItemsDecorator.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3F91DA11C75EF9E00D461D2 /* DemoChatItemsDecorator.swift */; }; - C3F91DB81C75EF9E00D461D2 /* ConversationsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3F91DA21C75EF9E00D461D2 /* ConversationsViewController.swift */; }; + C3F91DB81C75EF9E00D461D2 /* ChatExamplesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3F91DA21C75EF9E00D461D2 /* ChatExamplesViewController.swift */; }; C3F91DBC1C75EF9E00D461D2 /* DemoChatViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3F91DA81C75EF9E00D461D2 /* DemoChatViewController.swift */; }; C3F91DBD1C75EF9E00D461D2 /* DemoChatDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3F91DA91C75EF9E00D461D2 /* DemoChatDataSource.swift */; }; C3F91DBE1C75EF9E00D461D2 /* DemoChatMessageFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3F91DAA1C75EF9E00D461D2 /* DemoChatMessageFactory.swift */; }; @@ -64,6 +65,8 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 0997CD2E2042E42100D7BDF9 /* CellsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CellsViewController.swift; sourceTree = ""; }; + 0997CD302042E58400D7BDF9 /* ChatWithTabBarExamplesViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatWithTabBarExamplesViewController.swift; sourceTree = ""; }; 13A796C853501DB82BA5DC27 /* Pods_ChattoApp.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ChattoApp.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 2CCB5DAFC70B636492325895 /* Pods-ChattoApp.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ChattoApp.debug.xcconfig"; path = "Pods/Target Support Files/Pods-ChattoApp/Pods-ChattoApp.debug.xcconfig"; sourceTree = ""; }; 5587302D1FCD7EE5005BC2EC /* MessagesSelectionChatViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessagesSelectionChatViewController.swift; sourceTree = ""; }; @@ -73,7 +76,6 @@ 623390018DA74FF277EE2626 /* Pods.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 6DABD92E2BA40464C1727DA2 /* Pods-ChattoApp.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ChattoApp.release.xcconfig"; path = "Pods/Target Support Files/Pods-ChattoApp/Pods-ChattoApp.release.xcconfig"; sourceTree = ""; }; C33FBFA51BDE441C008E3545 /* ChattoApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ChattoApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; - C33FBFAD1BDE441C008E3545 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; C33FBFAF1BDE441C008E3545 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; C33FBFB21BDE441C008E3545 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; C33FBFB41BDE441C008E3545 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; @@ -85,7 +87,7 @@ C35A6F4E1BF807EC0085CA19 /* SlidingDataSourceTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SlidingDataSourceTests.swift; sourceTree = ""; }; C3F91DA01C75EF9E00D461D2 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; C3F91DA11C75EF9E00D461D2 /* DemoChatItemsDecorator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DemoChatItemsDecorator.swift; sourceTree = ""; }; - C3F91DA21C75EF9E00D461D2 /* ConversationsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConversationsViewController.swift; sourceTree = ""; }; + C3F91DA21C75EF9E00D461D2 /* ChatExamplesViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatExamplesViewController.swift; sourceTree = ""; }; C3F91DA81C75EF9E00D461D2 /* DemoChatViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DemoChatViewController.swift; sourceTree = ""; }; C3F91DA91C75EF9E00D461D2 /* DemoChatDataSource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DemoChatDataSource.swift; sourceTree = ""; }; C3F91DAA1C75EF9E00D461D2 /* DemoChatMessageFactory.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DemoChatMessageFactory.swift; sourceTree = ""; }; @@ -200,7 +202,6 @@ isa = PBXGroup; children = ( C3F91D9F1C75EF9E00D461D2 /* Source */, - C33FBFAC1BDE441C008E3545 /* Main.storyboard */, C33FBFAF1BDE441C008E3545 /* Assets.xcassets */, C33FBFB11BDE441C008E3545 /* LaunchScreen.storyboard */, C33FBFB41BDE441C008E3545 /* Info.plist */, @@ -234,7 +235,9 @@ 55A77B501FCC6BEA0040C77E /* Chat View Controllers */, 55A77B471FCC41CC0040C77E /* Chat Items */, C3F91DA01C75EF9E00D461D2 /* AppDelegate.swift */, - C3F91DA21C75EF9E00D461D2 /* ConversationsViewController.swift */, + 0997CD2E2042E42100D7BDF9 /* CellsViewController.swift */, + C3F91DA21C75EF9E00D461D2 /* ChatExamplesViewController.swift */, + 0997CD302042E58400D7BDF9 /* ChatWithTabBarExamplesViewController.swift */, C3F91DB01C75EF9E00D461D2 /* SlidingDatasSource.swift */, 55A77B491FCC5EE70040C77E /* MessagesSelectorProtocol.swift */, 55A77B4B1FCC5FFB0040C77E /* BaseMessagesSelector.swift */, @@ -365,7 +368,6 @@ C33FBFB31BDE441C008E3545 /* LaunchScreen.storyboard in Resources */, C3F91DCD1C75EFE300D461D2 /* SendingStatusCollectionViewCell.xib in Resources */, C33FBFB01BDE441C008E3545 /* Assets.xcassets in Resources */, - C33FBFAE1BDE441C008E3545 /* Main.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -455,7 +457,7 @@ 55A77B4A1FCC5EE70040C77E /* MessagesSelectorProtocol.swift in Sources */, FE2D050B1C915ADB006F902B /* BaseMessageCollectionViewCellAvatarStyle.swift in Sources */, C3F91DBF1C75EF9E00D461D2 /* DemoChatMessageSender.swift in Sources */, - C3F91DB81C75EF9E00D461D2 /* ConversationsViewController.swift in Sources */, + C3F91DB81C75EF9E00D461D2 /* ChatExamplesViewController.swift in Sources */, C3F91DC41C75EF9E00D461D2 /* DemoTextMessageHandler.swift in Sources */, C3F91DC31C75EF9E00D461D2 /* SlidingDatasSource.swift in Sources */, C3F91DC71C75EF9E00D461D2 /* BaseMessageHandler.swift in Sources */, @@ -472,6 +474,8 @@ 5587302E1FCD7EE5005BC2EC /* MessagesSelectionChatViewController.swift in Sources */, C3F91DCC1C75EFE300D461D2 /* SendingStatusCollectionViewCell.swift in Sources */, C3F91DB71C75EF9E00D461D2 /* DemoChatItemsDecorator.swift in Sources */, + 0997CD2F2042E42100D7BDF9 /* CellsViewController.swift in Sources */, + 0997CD312042E58400D7BDF9 /* ChatWithTabBarExamplesViewController.swift in Sources */, 558730341FCD8891005BC2EC /* AddRandomMessageChatViewController.swift in Sources */, C3F91DC11C75EF9E00D461D2 /* DemoPhotoMessageModel.swift in Sources */, C3F91DC21C75EF9E00D461D2 /* DemoPhotoMessageViewModel.swift in Sources */, @@ -499,14 +503,6 @@ /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ - C33FBFAC1BDE441C008E3545 /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - C33FBFAD1BDE441C008E3545 /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; C33FBFB11BDE441C008E3545 /* LaunchScreen.storyboard */ = { isa = PBXVariantGroup; children = ( diff --git a/ChattoApp/ChattoApp/Base.lproj/Main.storyboard b/ChattoApp/ChattoApp/Base.lproj/Main.storyboard deleted file mode 100644 index f2d4e0138..000000000 --- a/ChattoApp/ChattoApp/Base.lproj/Main.storyboard +++ /dev/null @@ -1,233 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ChattoApp/ChattoApp/Info.plist b/ChattoApp/ChattoApp/Info.plist index 9e12b6d40..80e2d66eb 100644 --- a/ChattoApp/ChattoApp/Info.plist +++ b/ChattoApp/ChattoApp/Info.plist @@ -28,8 +28,6 @@ NSPhotoLibraryUsageDescription UILaunchStoryboardName LaunchScreen - UIMainStoryboardFile - Main UIRequiredDeviceCapabilities armv7 diff --git a/ChattoApp/ChattoApp/Source/AppDelegate.swift b/ChattoApp/ChattoApp/Source/AppDelegate.swift index 174165c3c..c50052e40 100644 --- a/ChattoApp/ChattoApp/Source/AppDelegate.swift +++ b/ChattoApp/ChattoApp/Source/AppDelegate.swift @@ -29,31 +29,14 @@ class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? - func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { - // Override point for customization after application launch. + func application(_ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { + let rootViewController = ChatExamplesViewController() + let window = UIWindow() + window.rootViewController = UINavigationController(rootViewController: rootViewController) + self.window = window + self.window?.makeKeyAndVisible() return true } - func applicationWillResignActive(_ application: UIApplication) { - // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. - // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. - } - - func applicationDidEnterBackground(_ application: UIApplication) { - // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. - // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. - } - - func applicationWillEnterForeground(_ application: UIApplication) { - // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. - } - - func applicationDidBecomeActive(_ application: UIApplication) { - // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. - } - - func applicationWillTerminate(_ application: UIApplication) { - // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. - } - } diff --git a/ChattoApp/ChattoApp/Source/CellsViewController.swift b/ChattoApp/ChattoApp/Source/CellsViewController.swift new file mode 100644 index 000000000..ae3314d53 --- /dev/null +++ b/ChattoApp/ChattoApp/Source/CellsViewController.swift @@ -0,0 +1,61 @@ +/* + The MIT License (MIT) + + Copyright (c) 2015-present Badoo Trading Limited. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +import UIKit + +class CellsViewController: UITableViewController { + + struct CellItem { + let title: String + let action: () -> Void + } + + var cellItems: [CellItem] = [] + + override func viewDidLoad() { + super.viewDidLoad() + + self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: UITableViewCell.reuseIdentifier) + } + + override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return self.cellItems.count + } + + override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCell(withIdentifier: UITableViewCell.reuseIdentifier, for: indexPath) + cell.textLabel?.text = self.cellItems[indexPath.row].title + return cell + } + + override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + self.cellItems[indexPath.row].action() + } +} + +extension UITableViewCell { + static var reuseIdentifier: String { + return String(describing: self) + } +} diff --git a/ChattoApp/ChattoApp/Source/Chat View Controllers/DemoChatViewController.swift b/ChattoApp/ChattoApp/Source/Chat View Controllers/DemoChatViewController.swift index a7f6dbcfe..ae25120a2 100644 --- a/ChattoApp/ChattoApp/Source/Chat View Controllers/DemoChatViewController.swift +++ b/ChattoApp/ChattoApp/Source/Chat View Controllers/DemoChatViewController.swift @@ -34,6 +34,7 @@ class DemoChatViewController: BaseChatViewController { var dataSource: DemoChatDataSource! { didSet { self.chatDataSource = self.dataSource + self.messageSender = self.dataSource.messageSender } } @@ -44,6 +45,7 @@ class DemoChatViewController: BaseChatViewController { override func viewDidLoad() { super.viewDidLoad() + self.title = "Chat" self.messagesSelector.delegate = self self.chatItemsDecorator = DemoChatItemsDecorator(messagesSelector: self.messagesSelector) } diff --git a/ChattoApp/ChattoApp/Source/ChatExamplesViewController.swift b/ChattoApp/ChattoApp/Source/ChatExamplesViewController.swift new file mode 100644 index 000000000..fc118097b --- /dev/null +++ b/ChattoApp/ChattoApp/Source/ChatExamplesViewController.swift @@ -0,0 +1,94 @@ +/* + The MIT License (MIT) + + Copyright (c) 2015-present Badoo Trading Limited. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +import UIKit + +class ChatExamplesViewController: CellsViewController { + + override func viewDidLoad() { + super.viewDidLoad() + + self.title = "Examples" + + self.cellItems = [ + self.makeOverviewCellItem(), + self.makeChatCellItem(title: "Empty chat", messagesCount: 0), + self.makeChatCellItem(title: "Chat with 10000 messages", messagesCount: 10_000), + self.makeMessageSelectionCellItem(), + self.makeOpenWithTabBarCellItem(), + ] + } + + // MARK: - Cells + + private func makeOverviewCellItem() -> CellItem { + return CellItem(title: "Overview", action: { [weak self] in + let dataSource = DemoChatDataSource(messages: DemoChatMessageFactory.makeOverviewMessages(), pageSize: 50) + let viewController = AddRandomMessagesChatViewController() + viewController.dataSource = dataSource + self?.navigationController?.pushViewController(viewController, animated: true) + }) + } + + private func makeChatCellItem(title: String, messagesCount: Int) -> CellItem { + return CellItem(title: title, action: { [weak self] in + let dataSource = DemoChatDataSource(count: messagesCount, pageSize: 50) + let viewController = AddRandomMessagesChatViewController() + viewController.dataSource = dataSource + self?.navigationController?.pushViewController(viewController, animated: true) + }) + } + + private func makeMessageSelectionCellItem() -> CellItem { + return CellItem(title: "Chat with message selection", action: { [weak self] in + let messages = DemoChatMessageFactory.makeMessagesSelectionMessages() + let dataSource = DemoChatDataSource(messages: messages, pageSize: 50) + let viewController = MessagesSelectionChatViewController() + viewController.dataSource = dataSource + self?.navigationController?.pushViewController(viewController, animated: true) + }) + } + + private func makeOpenWithTabBarCellItem() -> CellItem { + return CellItem(title: "UITabBarController examples", action: { [weak self] in + guard let sSelf = self else { return } + let viewController = ChatWithTabBarExamplesViewController() + viewController.navigationItem.leftBarButtonItem = UIBarButtonItem( + title: "Close", + style: .done, + target: sSelf, + action: #selector(sSelf.dismissPresentedController) + ) + let navigationController = UINavigationController(rootViewController: viewController) + let tabBarViewController = UITabBarController() + tabBarViewController.setViewControllers([navigationController], animated: false) + sSelf.present(tabBarViewController, animated: true, completion: nil) + }) + } + + @objc + private func dismissPresentedController() { + self.dismiss(animated: true, completion: nil) + } +} diff --git a/ChattoApp/ChattoApp/Source/ChatWithTabBarExamplesViewController.swift b/ChattoApp/ChattoApp/Source/ChatWithTabBarExamplesViewController.swift new file mode 100644 index 000000000..81a8a18c0 --- /dev/null +++ b/ChattoApp/ChattoApp/Source/ChatWithTabBarExamplesViewController.swift @@ -0,0 +1,59 @@ +/* + The MIT License (MIT) + + Copyright (c) 2015-present Badoo Trading Limited. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +import UIKit + +class ChatWithTabBarExamplesViewController: CellsViewController { + + override func viewDidLoad() { + super.viewDidLoad() + + self.title = "Examples" + + self.cellItems = [ + self.makeChatWithHiddenTabBarCellItem(), + self.makeChatWithVisibleTabBarCellItem() + ] + } + + private func makeChatWithHiddenTabBarCellItem() -> CellItem { + return CellItem(title: "Chat with hidden tab bar", action: { [weak self] in + self?.pushChatViewController(hidesBottomBar: true) + }) + } + + private func makeChatWithVisibleTabBarCellItem() -> CellItem { + return CellItem(title: "Chat with visible tab bar", action: { [weak self] in + self?.pushChatViewController(hidesBottomBar: false) + }) + } + + private func pushChatViewController(hidesBottomBar: Bool) { + let dataSource = DemoChatDataSource(count: 0, pageSize: 50) + let viewController = AddRandomMessagesChatViewController() + viewController.dataSource = dataSource + viewController.hidesBottomBarWhenPushed = hidesBottomBar + self.navigationController?.pushViewController(viewController, animated: true) + } +} diff --git a/ChattoApp/ChattoApp/Source/ConversationsViewController.swift b/ChattoApp/ChattoApp/Source/ConversationsViewController.swift deleted file mode 100644 index 3efbf9fa5..000000000 --- a/ChattoApp/ChattoApp/Source/ConversationsViewController.swift +++ /dev/null @@ -1,66 +0,0 @@ -/* - The MIT License (MIT) - - Copyright (c) 2015-present Badoo Trading Limited. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. -*/ - -import UIKit - -class ConversationsViewController: UITableViewController { - - override func prepare(for segue: UIStoryboardSegue, sender: Any?) { - - var initialCount = 0 - let pageSize = 50 - - var dataSource: DemoChatDataSource! - if segue.identifier == "0 messages" { - initialCount = 0 - } else if segue.identifier == "2 messages" { - initialCount = 2 - } else if segue.identifier == "10000 messages" { - initialCount = 10000 - } else if segue.identifier == "overview" { - dataSource = DemoChatDataSource(messages: DemoChatMessageFactory.makeOverviewMessages(), pageSize: pageSize) - } else if segue.identifier == "messages_selection" { - dataSource = DemoChatDataSource(messages: DemoChatMessageFactory.makeMessagesSelectionMessages(), pageSize: pageSize) - } else { - assert(false, "segue not handled!") - } - - let chatController = { () -> DemoChatViewController? in - if let controller = segue.destination as? DemoChatViewController { - return controller - } - if let tabController = segue.destination as? UITabBarController, - let controller = tabController.viewControllers?.first as? DemoChatViewController { - return controller - } - return nil - }()! - - if dataSource == nil { - dataSource = DemoChatDataSource(count: initialCount, pageSize: pageSize) - } - chatController.dataSource = dataSource - chatController.messageSender = dataSource.messageSender - } -}