Bläddra i källkod

Inputbar accessory view refactoring (#1435)

* remove InputBarAccessoryView from pods

* re-add tweaked InputBarAccessoryView directly to our repository

* refactoring ChatViewController, use contentInsetAdjustmentBehavior remove a lot of manual bottom and top inset calculation code

* fixing lint issues

* another apporach to work around the cnacel-swipe-to-dismiss UI bug

* replace ChatInputBar, move logic to InputBarAccessoryView

* add missing call to setup scrollDownButton

* fix blur background

* fix InputBarAccessoryView layout in phone landscape with shown keyboard

* if keyboard is hidden use default maxTextViewHeight calculation, InputBarAccessoryView, shouldn

* take bottom safe area insets into account when evaluating if the keyboard is actually visible or not

* fix hard-coded padding

* make sure UI is updated correctly after keyboard showed up in phone landscape mode

* complement comment

* remove obsolete comment
cyBerta 3 år sedan
förälder
incheckning
f91be6885e
66 ändrade filer med 2428 tillägg och 4439 borttagningar
  1. 1 1
      DcCore/DcCore/Helper/DcColors.swift
  2. 0 1
      Podfile
  3. 1 7
      Podfile.lock
  4. 0 22
      Pods/InputBarAccessoryView/LICENSE
  5. 0 140
      Pods/InputBarAccessoryView/README.md
  6. 0 235
      Pods/InputBarAccessoryView/Sources/Plugins/AttachmentManager/AttachmentManager.swift
  7. 0 41
      Pods/InputBarAccessoryView/Sources/Plugins/AttachmentManager/Protocols/AttachmentManagerDataSource.swift
  8. 0 81
      Pods/InputBarAccessoryView/Sources/Plugins/AttachmentManager/Protocols/AttachmentManagerDelegate.swift
  9. 0 132
      Pods/InputBarAccessoryView/Sources/Plugins/AttachmentManager/Views/AttachmentCell.swift
  10. 0 82
      Pods/InputBarAccessoryView/Sources/Plugins/AttachmentManager/Views/AttachmentsView.swift
  11. 0 67
      Pods/InputBarAccessoryView/Sources/Plugins/AttachmentManager/Views/ImageAttachmentCell.swift
  12. 0 503
      Pods/InputBarAccessoryView/Sources/Plugins/AutocompleteManager/AutocompleteManager.swift
  13. 0 48
      Pods/InputBarAccessoryView/Sources/Plugins/AutocompleteManager/Models/AutocompleteCompletion.swift
  14. 0 52
      Pods/InputBarAccessoryView/Sources/Plugins/AutocompleteManager/Models/AutocompleteSession.swift
  15. 0 67
      Pods/InputBarAccessoryView/Sources/Plugins/AutocompleteManager/Protocols/AutocompleteManagerDataSource.swift
  16. 0 82
      Pods/InputBarAccessoryView/Sources/Plugins/AutocompleteManager/Protocols/AutocompleteManagerDelegate.swift
  17. 0 97
      Pods/InputBarAccessoryView/Sources/Plugins/AutocompleteManager/Views/AutocompleteCell.swift
  18. 0 41
      Pods/InputBarAccessoryView/Sources/Plugins/AutocompleteManager/Views/AutocompleteTableView.swift
  19. 0 91
      Pods/InputBarAccessoryView/Sources/Supporting Files/InputBarAccessoryView+Availability.swift
  20. 0 88
      Pods/InputBarAccessoryView/Sources/ViewControllers/InputBarViewController.swift
  21. 1 7
      Pods/Manifest.lock
  22. 1860 1957
      Pods/Pods.xcodeproj/project.pbxproj
  23. 0 26
      Pods/Target Support Files/InputBarAccessoryView/InputBarAccessoryView-Info.plist
  24. 0 5
      Pods/Target Support Files/InputBarAccessoryView/InputBarAccessoryView-dummy.m
  25. 0 12
      Pods/Target Support Files/InputBarAccessoryView/InputBarAccessoryView-prefix.pch
  26. 0 16
      Pods/Target Support Files/InputBarAccessoryView/InputBarAccessoryView-umbrella.h
  27. 0 14
      Pods/Target Support Files/InputBarAccessoryView/InputBarAccessoryView.debug.xcconfig
  28. 0 6
      Pods/Target Support Files/InputBarAccessoryView/InputBarAccessoryView.modulemap
  29. 0 14
      Pods/Target Support Files/InputBarAccessoryView/InputBarAccessoryView.release.xcconfig
  30. 0 11
      Pods/Target Support Files/InputBarAccessoryView/InputBarAccessoryView.xcconfig
  31. 0 26
      Pods/Target Support Files/Pods-deltachat-ios/Pods-deltachat-ios-acknowledgements.markdown
  32. 0 32
      Pods/Target Support Files/Pods-deltachat-ios/Pods-deltachat-ios-acknowledgements.plist
  33. 0 2
      Pods/Target Support Files/Pods-deltachat-ios/Pods-deltachat-ios-frameworks.sh
  34. 4 4
      Pods/Target Support Files/Pods-deltachat-ios/Pods-deltachat-ios.debug.xcconfig
  35. 4 4
      Pods/Target Support Files/Pods-deltachat-ios/Pods-deltachat-ios.release.xcconfig
  36. 3 3
      Pods/Target Support Files/Pods-deltachat-iosTests/Pods-deltachat-iosTests.debug.xcconfig
  37. 3 3
      Pods/Target Support Files/Pods-deltachat-iosTests/Pods-deltachat-iosTests.release.xcconfig
  38. 124 6
      deltachat-ios.xcodeproj/project.pbxproj
  39. 68 77
      deltachat-ios/Chat/ChatViewController.swift
  40. 8 4
      deltachat-ios/Chat/InputBarAccessoryView/Controls/InputBarButtonItem.swift
  41. 1 1
      deltachat-ios/Chat/InputBarAccessoryView/Controls/InputBarSendButton.swift
  42. 53 17
      deltachat-ios/Chat/InputBarAccessoryView/Extensions/NSMutableAttributedString+Extensions.swift
  43. 1 2
      deltachat-ios/Chat/InputBarAccessoryView/Extensions/NSNotification+Extensions.swift
  44. 0 0
      deltachat-ios/Chat/InputBarAccessoryView/Extensions/String+Extensions.swift
  45. 5 8
      deltachat-ios/Chat/InputBarAccessoryView/Extensions/UITextView+Extensions.swift
  46. 1 1
      deltachat-ios/Chat/InputBarAccessoryView/Extensions/UIView+AutoLayout.swift
  47. 224 81
      deltachat-ios/Chat/InputBarAccessoryView/InputBarAccessoryView.swift
  48. 1 1
      deltachat-ios/Chat/InputBarAccessoryView/InputStackView.swift
  49. 32 24
      deltachat-ios/Chat/InputBarAccessoryView/InputTextView.swift
  50. 1 1
      deltachat-ios/Chat/InputBarAccessoryView/KeyboardManager/KeyboardEvent.swift
  51. 7 4
      deltachat-ios/Chat/InputBarAccessoryView/KeyboardManager/KeyboardManager.swift
  52. 1 1
      deltachat-ios/Chat/InputBarAccessoryView/KeyboardManager/KeyboardNotification.swift
  53. 6 1
      deltachat-ios/Chat/InputBarAccessoryView/Models/HorizontalEdgePadding.swift
  54. 1 1
      deltachat-ios/Chat/InputBarAccessoryView/Models/NSConstraintLayoutSet.swift
  55. 1 1
      deltachat-ios/Chat/InputBarAccessoryView/Protocols/InputBarAccessoryViewDelegate.swift
  56. 2 2
      deltachat-ios/Chat/InputBarAccessoryView/Protocols/InputItem.swift
  57. 2 2
      deltachat-ios/Chat/InputBarAccessoryView/Protocols/InputPlugin.swift
  58. 8 4
      deltachat-ios/Chat/InputBarAccessoryView/SeparatorLine.swift
  59. 0 1
      deltachat-ios/Chat/Views/ChatContactRequestBar.swift
  60. 0 1
      deltachat-ios/Chat/Views/ChatEditingBar.swift
  61. 0 171
      deltachat-ios/Chat/Views/ChatInputBar.swift
  62. 1 1
      deltachat-ios/Chat/Views/ChatInputTextView.swift
  63. 0 1
      deltachat-ios/Chat/Views/ChatSearchAccessoryBar.swift
  64. 1 1
      deltachat-ios/Chat/Views/ChatTableView.swift
  65. 2 3
      deltachat-ios/Chat/Views/DraftArea.swift
  66. 0 1
      deltachat-ios/Chat/Views/QuotePreview.swift

+ 1 - 1
DcCore/DcCore/Helper/DcColors.swift

@@ -14,7 +14,7 @@ public struct DcColors {
                                                                  dark: .black)
     public static let contactCellBackgroundColor = UIColor.themeColor(light: .white, dark: .black)
     public static let defaultBackgroundColor = UIColor.themeColor(light: .white, dark: .black)
-    public static let defaultTransparentBackgroundColor = DcColors.defaultBackgroundColor.withAlphaComponent(0.75)
+    public static let defaultTransparentBackgroundColor = DcColors.defaultBackgroundColor.withAlphaComponent(0.5)
     public static let defaultInverseColor = UIColor.themeColor(light: .black, dark: .white)
     public static let profileCellBackgroundColor = UIColor.themeColor(light: white, dark: actionCellBackgroundDark)
     public static let chatBackgroundColor = UIColor.themeColor(light: .white, dark: .black)

+ 0 - 1
Podfile

@@ -12,7 +12,6 @@ target 'deltachat-ios' do
   pod 'ReachabilitySwift'
   pod 'SwiftyBeaver'
   pod 'DBDebugToolkit'
-  pod 'InputBarAccessoryView'
   pod 'SCSiriWaveformView'
   pod 'SDWebImage', '~> 5.9.1'
   pod 'SDWebImageWebPCoder'

+ 1 - 7
Podfile.lock

@@ -3,9 +3,6 @@ PODS:
     - CocoaLumberjack/Core (= 3.7.2)
   - CocoaLumberjack/Core (3.7.2)
   - DBDebugToolkit (0.6.0)
-  - InputBarAccessoryView (4.3.1):
-    - InputBarAccessoryView/Core (= 4.3.1)
-  - InputBarAccessoryView/Core (4.3.1)
   - libwebp (1.2.0):
     - libwebp/demux (= 1.2.0)
     - libwebp/mux (= 1.2.0)
@@ -34,7 +31,6 @@ PODS:
 
 DEPENDENCIES:
   - DBDebugToolkit
-  - InputBarAccessoryView
   - ReachabilitySwift
   - SCSiriWaveformView
   - SDWebImage (~> 5.9.1)
@@ -49,7 +45,6 @@ SPEC REPOS:
   trunk:
     - CocoaLumberjack
     - DBDebugToolkit
-    - InputBarAccessoryView
     - libwebp
     - ReachabilitySwift
     - SCSiriWaveformView
@@ -73,7 +68,6 @@ CHECKOUT OPTIONS:
 SPEC CHECKSUMS:
   CocoaLumberjack: b7e05132ff94f6ae4dfa9d5bce9141893a21d9da
   DBDebugToolkit: 03eb3483da4daf03b853b83ade5a8da9c8b7aff4
-  InputBarAccessoryView: 58a348be7ea2736c7eec60e5c315511c2dbb39fd
   libwebp: e90b9c01d99205d03b6bb8f2c8c415e5a4ef66f0
   ReachabilitySwift: 4032e2f59586e11e3b0ebe15b167abdd587a388b
   SCSiriWaveformView: 15b9dd6f94c7536e2032b34a35c6ff74d38c7411
@@ -85,6 +79,6 @@ SPEC CHECKSUMS:
   SwiftLint: 99f82d07b837b942dd563c668de129a03fc3fb52
   SwiftyBeaver: 576177b2c5c94b3aedd5993914e91271a0524e88
 
-PODFILE CHECKSUM: 632fce258414c6c6231891ec0ba5fb604075674b
+PODFILE CHECKSUM: b1373ee5525a53ced60269aa3cfce2018c295507
 
 COCOAPODS: 1.11.2

+ 0 - 22
Pods/InputBarAccessoryView/LICENSE

@@ -1,22 +0,0 @@
-
-The MIT License (MIT)
-
-Copyright (c) Nathan Tannar <nathantannar4@gmail.com> 2017-2019
-
-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.

+ 0 - 140
Pods/InputBarAccessoryView/README.md

@@ -1,140 +0,0 @@
-[![Image](./Screenshots/Preview.gif)]()
-
-# InputBarAccessoryView
-
-### Features
-
-- [x] Autocomplete text with @mention, #hashtag or any other prefix 
-- [x] A self-sizing `UITextView` with an optional fixed height (can be replaced with any other view)
-- [x] Image paste support   
-- [x] Autocomplete attributed text highlighting
-- [x] Reactive components that respond to given events
-- [x] Top/Bottom/Left/Right `InputStackView`s that act as toolbars to place buttons
-- [x] `RxSwift`/`RxCocoa` Support with `RxExtensions` Cocoapod subspec
-- [x] Drop in attachment view for file/photo management
-- [x] Plugin support for your own `InputPlugin`s
-- [x] Compatible with all iPhones and iPads
-- [x] RTL Support
-
-### Installation via CocoaPods
-
-```ruby
-# Swift 5.0
-pod 'InputBarAccessoryView'
-# Swift 4.2
-pod 'InputBarAccessoryView', '4.2.2'
-```
-
-### Installation via Carthage
-
-```ruby
-# Swift 5.0
-github "nathantannar4/InputBarAccessoryView"
-# Swift 4.2
-github "nathantannar4/InputBarAccessoryView" "4.2.2"
-```
-
-### Requirements
-
-iOS 9.0+
-Swift 5.0
-
-> The latest Swift 4.2 release is v4.2.2 
-
-### Documentation
-
-[Getting Started](./GETTING_STARTED.md)
-
-> See the Example project to see how you can make the iMessage, Slack, Facebook and GitHawk input bars!
-
-### Example Usage
-
-<img src="https://raw.githubusercontent.com/nathantannar4/InputBarAccessoryView/master/Screenshots/ScreenshotA.png" width="242" height="432"> <img src="https://raw.githubusercontent.com/nathantannar4/InputBarAccessoryView/master/Screenshots/ScreenshotB.png" width="242" height="432"> <img src="https://raw.githubusercontent.com/nathantannar4/InputBarAccessoryView/master/Screenshots/ScreenshotC.png" width="242" height="432"> <img src="https://raw.githubusercontent.com/nathantannar4/InputBarAccessoryView/master/Screenshots/ScreenshotD.png" width="242" height="432"> <img src="https://raw.githubusercontent.com/nathantannar4/InputBarAccessoryView/master/Screenshots/ScreenshotE.png" width="242" height="432"> <img src="https://raw.githubusercontent.com/nathantannar4/InputBarAccessoryView/master/Screenshots/ScreenshotF.png" width="242" height="432">
-
-### Featured In
-
-Add your app to the list of apps using this library and make a pull request.
-
-- [MessageKit](https://github.com/MessageKit/MessageKit) *(renamed to MessageInputBar)*
-<p>
-  <img src="https://raw.githubusercontent.com/MessageKit/MessageKit/master/Assets/mklogo.png" title="MessageKit Logo" height="50">
-</p>
-
-- [MessageViewController](https://github.com/GitHawkApp/MessageViewController) *(Autocomplete Highlighting Algorithm)*
-<p>
-  <img src="https://avatars3.githubusercontent.com/u/32285710?s=200&v=4" title="GitHawk Logo" height="50">
-</p>
-
-### See Also
-
-iMessage style [TypingIndicator](https://github.com/nathantannar4/TypingIndicator) for chat apps
-
-## Latest Releases
-- 4.3.1
-    - Add `RxSwift`/`RxCocoa` support through extensions and delegate proxies, requires Cocoapods installation of  `InputBarAccessoryView/RxExtensions`
-- 4.3.0
-    - Swift 5 support
-- 4.2.2
-    - Fixed image paste orientation issue in `InputTextView`
-- 4.2.1
-    - Fixed autocompletes of completions that contain spaces
-    - Depricated `isCaseSensitive` in favor of a function asignment to pre-process autocompletions
-- 4.2.0
-    - Added new API for overriding the main middle view, normally the `InputTextView` so it can be replaced with views such as a "Join" button", `setMiddleContentView(_ view: UIView?, animated: Bool)`
-- 4.1.2
-        - Add `InputBarViewController` which contains an `InputBarAccessoryView` as the `inputAccessoryView` by default with a convenient `isInputBarHidden: Bool` property to show/hide it 
-- 4.1.1
-        - Add `frameInsets: HorizontalEdgePadding` property to `InputBarAccessoryView` to inset the view to be compatible with `UISplitViewController` or other custom containers where the view should not be the full width
-- 4.1.0
-        - Fix issue where setting long strings in `viewDidLoad` broke inital layout, Issue #41
-        - Add `deleteCompletionByParts: Bool` flag to `AutocompleteManager` to allow for partial deletions of autocompletes rather than just the entire substring. 
-        - Add `InputBarSendButton` to use as the `sendButton` in `InputBarAccessoryView`. This subclass of `InputBarButtonItem` has a `UIActivityIndicatorView` to show a spinner when making HTTP requests
-
-### [CHANGELOG](./CHANGELOG.md)
-
-**Find a bug? Open an issue!**
-
-## Layout
-
-The layout of the `InputBarAccessoryView` is made of of 4  `InputStackView`'s and an `InputTextView`. The padding of the subviews can be easily adjusted by changing the `padding` and `textViewPadding` properties. The constraints will automatically be updated.
-
-<img src="https://raw.githubusercontent.com/nathantannar4/InputBarAccessoryView/master/Screenshots/Layout.png">
-
-It is important to note that each of the `InputStackView `'s to the left and right of the `InputTextView` are anchored by a width constraint. This way the `InputTextView` will always fill the space inbetween in addition to providing methods that can easily be called to hide all buttons to the right or left of the `InputTextView` by setting the width constraint constant to 0. The bottom and top stack views are not height constraint and rely on their `intrinsicContentSize`
-
-```swift
-func setLeftStackViewWidthConstant(to newValue: CGFloat, animated: Bool)
-
-func setRightStackViewWidthConstant(to newValue: CGFloat, animated: Bool)
-```
-
-### Reactive Hooks
-
-Each `InputBarButtonItem` has properties that can hold actions that will be executed during various hooks such as the button being touched, the `UITextView `text changing and more! Thanks to these easy hooks with a few lines of code the items can be easily resized and animated similar to that of the Facebook messenger app.
-
-```swift
-// MARK: - Hooks
-    
-public typealias InputBarButtonItemAction = ((InputBarButtonItem) -> Void)    
-    
-private var onTouchUpInsideAction: InputBarButtonItemAction?
-private var onKeyboardEditingBeginsAction: InputBarButtonItemAction?
-private var onKeyboardEditingEndsAction: InputBarButtonItemAction?
-private var onKeyboardSwipeGestureAction: ((InputBarButtonItem, UISwipeGestureRecognizer) -> Void)?
-private var onTextViewDidChangeAction: ((InputBarButtonItem, InputTextView) -> Void)?
-private var onSelectedAction: InputBarButtonItemAction?
-private var onDeselectedAction: InputBarButtonItemAction?
-private var onEnabledAction: InputBarButtonItemAction?
-private var onDisabledAction: InputBarButtonItemAction?
-```
-
-## Author
-<p>
-	<img src="https://github.com/nathantannar4/NTComponents/raw/master/NTComponents/Assets/Nathan.png" width="100" height="100">
-</p>
-
-**Nathan Tannar** - [https://nathantannar.me](https://nathantannar.me)
-
-## License
-
-Distributed under the MIT license. See ``LICENSE`` for more information.

+ 0 - 235
Pods/InputBarAccessoryView/Sources/Plugins/AttachmentManager/AttachmentManager.swift

@@ -1,235 +0,0 @@
-//
-//  AttachmentManager.swift
-//  InputBarAccessoryView
-//
-//  Copyright © 2017-2019 Nathan Tannar.
-//
-//  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.
-//
-//  Created by Nathan Tannar on 10/4/17.
-//
-
-import UIKit
-
-open class AttachmentManager: NSObject, InputPlugin {
-    
-    public enum Attachment {
-        case image(UIImage)
-        case url(URL)
-        case data(Data)
-        
-        @available(*, deprecated, message: ".other(AnyObject) has been depricated as of 2.0.0")
-        case other(AnyObject)
-    }
-    
-    // MARK: - Properties [Public]
-    
-    /// A protocol that can recieve notifications from the `AttachmentManager`
-    open weak var delegate: AttachmentManagerDelegate?
-    
-    /// A protocol to passes data to the `AttachmentManager`
-    open weak var dataSource: AttachmentManagerDataSource?
-    
-    open lazy var attachmentView: AttachmentCollectionView = { [weak self] in
-        let attachmentView = AttachmentCollectionView()
-        attachmentView.dataSource = self
-        attachmentView.delegate = self
-        return attachmentView
-    }()
-    
-    /// The attachments that the managers holds
-    private(set) public var attachments = [Attachment]() { didSet { reloadData() } }
-    
-    /// A flag you can use to determine if you want the manager to be always visible
-    open var isPersistent = false { didSet { attachmentView.reloadData() } }
-    
-    /// A flag to determine if the AddAttachmentCell is visible
-    open var showAddAttachmentCell = true { didSet { attachmentView.reloadData() } }
-    
-    /// The color applied to the backgroundColor of the deleteButton in each `AttachmentCell`
-    open var tintColor: UIColor = UIColor(red: 0, green: 0.5, blue: 1, alpha: 1)
-    
-    // MARK: - Initialization
-    
-    public override init() {
-        super.init()
-    }
-    
-    // MARK: - InputPlugin
-    
-    open func reloadData() {
-        attachmentView.reloadData()
-        delegate?.attachmentManager(self, didReloadTo: attachments)
-        delegate?.attachmentManager(self, shouldBecomeVisible: attachments.count > 0 || isPersistent)
-    }
-    
-    /// Invalidates the `AttachmentManagers` session by removing all attachments
-    open func invalidate() {
-        attachments = []
-    }
-    
-    /// Appends the object to the attachments
-    ///
-    /// - Parameter object: The object to append
-    @discardableResult
-    open func handleInput(of object: AnyObject) -> Bool {
-        let attachment: Attachment
-        if let image = object as? UIImage {
-            attachment = .image(image)
-        } else if let url = object as? URL {
-            attachment = .url(url)
-        } else if let data = object as? Data {
-            attachment = .data(data)
-        } else {
-            return false
-        }
-        
-        insertAttachment(attachment, at: attachments.count)
-        return true
-    }
-    
-    // MARK: - API [Public]
-    
-    /// Performs an animated insertion of an attachment at an index
-    ///
-    /// - Parameter index: The index to insert the attachment at
-    open func insertAttachment(_ attachment: Attachment, at index: Int) {
-        
-        attachmentView.performBatchUpdates({
-            self.attachments.insert(attachment, at: index)
-            self.attachmentView.insertItems(at: [IndexPath(row: index, section: 0)])
-        }, completion: { success in
-            self.attachmentView.reloadData()
-            self.delegate?.attachmentManager(self, didInsert: attachment, at: index)
-            self.delegate?.attachmentManager(self, shouldBecomeVisible: self.attachments.count > 0 || self.isPersistent)
-        })
-    }
-    
-    /// Performs an animated removal of an attachment at an index
-    ///
-    /// - Parameter index: The index to remove the attachment at
-    open func removeAttachment(at index: Int) {
-        
-        let attachment = attachments[index]
-        attachmentView.performBatchUpdates({
-            self.attachments.remove(at: index)
-            self.attachmentView.deleteItems(at: [IndexPath(row: index, section: 0)])
-        }, completion: { success in
-            self.attachmentView.reloadData()
-            self.delegate?.attachmentManager(self, didRemove: attachment, at: index)
-            self.delegate?.attachmentManager(self, shouldBecomeVisible: self.attachments.count > 0 || self.isPersistent)
-        })
-    }
-    
-}
-
-extension AttachmentManager: UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
-    
-    // MARK: - UICollectionViewDelegate
-    
-    final public func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
-        if indexPath.row == attachments.count {
-            delegate?.attachmentManager(self, didSelectAddAttachmentAt: indexPath.row)
-            delegate?.attachmentManager(self, shouldBecomeVisible: attachments.count > 0 || isPersistent)
-        }
-    }
-    
-    // MARK: - UICollectionViewDataSource
-    
-    final public func numberOfItems(inSection section: Int) -> Int {
-        return 1
-    }
-    
-    final public func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
-        return attachments.count + (showAddAttachmentCell ? 1 : 0)
-    }
-    
-    final public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
-        
-        if indexPath.row == attachments.count && showAddAttachmentCell {
-            return createAttachmentCell(in: collectionView, at: indexPath)
-        }
-        
-        let attachment = attachments[indexPath.row]
-        
-        if let cell = dataSource?.attachmentManager(self, cellFor: attachment, at: indexPath.row) {
-            return cell
-        } else {
-            
-            // Only images are supported by default
-            switch attachment {
-            case .image(let image):
-                guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: ImageAttachmentCell.reuseIdentifier, for: indexPath) as? ImageAttachmentCell else {
-                    fatalError()
-                }
-                cell.attachment = attachment
-                cell.indexPath = indexPath
-                cell.manager = self
-                cell.imageView.image = image
-                cell.imageView.tintColor = tintColor
-                cell.deleteButton.backgroundColor = tintColor
-                return cell
-            default:
-                return collectionView.dequeueReusableCell(withReuseIdentifier: AttachmentCell.reuseIdentifier, for: indexPath) as! AttachmentCell
-            }
-            
-        }
-    }
-    
-    // MARK: - UICollectionViewDelegateFlowLayout
-    
-    final public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
-        
-        var height = attachmentView.intrinsicContentHeight
-        if let layout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout {
-            height -= (layout.sectionInset.bottom + layout.sectionInset.top + collectionView.contentInset.top + collectionView.contentInset.bottom)
-        }
-        return CGSize(width: height, height: height)
-    }
-    
-    open func createAttachmentCell(in collectionView: UICollectionView, at indexPath: IndexPath) -> AttachmentCell {
-        
-        guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: AttachmentCell.reuseIdentifier, for: indexPath) as? AttachmentCell else {
-            fatalError()
-        }
-        cell.deleteButton.isHidden = true
-        // Draw a plus
-        let frame = CGRect(origin: CGPoint(x: cell.bounds.origin.x,
-                                           y: cell.bounds.origin.y),
-                           size: CGSize(width: cell.bounds.width - cell.padding.left - cell.padding.right,
-                                        height: cell.bounds.height - cell.padding.top - cell.padding.bottom))
-        let strokeWidth: CGFloat = 3
-        let length: CGFloat = frame.width / 2
-        let vLayer = CAShapeLayer()
-        vLayer.path = UIBezierPath(roundedRect: CGRect(x: frame.midX - (strokeWidth / 2),
-                                                       y: frame.midY - (length / 2),
-                                                       width: strokeWidth,
-                                                       height: length), cornerRadius: 5).cgPath
-        vLayer.fillColor = UIColor.lightGray.cgColor
-        let hLayer = CAShapeLayer()
-        hLayer.path = UIBezierPath(roundedRect: CGRect(x: frame.midX - (length / 2),
-                                                       y: frame.midY - (strokeWidth / 2),
-                                                       width: length,
-                                                       height: strokeWidth), cornerRadius: 5).cgPath
-        hLayer.fillColor = UIColor.lightGray.cgColor
-        cell.containerView.layer.addSublayer(vLayer)
-        cell.containerView.layer.addSublayer(hLayer)
-        return cell
-    }
-}

+ 0 - 41
Pods/InputBarAccessoryView/Sources/Plugins/AttachmentManager/Protocols/AttachmentManagerDataSource.swift

@@ -1,41 +0,0 @@
-//
-//  AttachmentManagerDataSource.swift
-//  InputBarAccessoryView
-//
-//  Copyright © 2017-2019 Nathan Tannar.
-//
-//  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.
-//
-//  Created by Nathan Tannar on 10/6/17.
-//
-
-import Foundation
-
-/// AttachmentManagerDataSource is a protocol to passes data to the AttachmentManager
-public protocol AttachmentManagerDataSource: AnyObject {
-    
-    /// The AttachmentCell for the attachment that is to be inserted into the AttachmentView
-    ///
-    /// - Parameters:
-    ///   - manager: The AttachmentManager
-    ///   - attachment: The object
-    ///   - index: The index in the AttachmentView
-    /// - Returns: An AttachmentCell
-    func attachmentManager(_ manager: AttachmentManager, cellFor attachment: AttachmentManager.Attachment, at index: Int) -> AttachmentCell
-}

+ 0 - 81
Pods/InputBarAccessoryView/Sources/Plugins/AttachmentManager/Protocols/AttachmentManagerDelegate.swift

@@ -1,81 +0,0 @@
-//
-//  AttachmentManagerDelegate.swift
-//  InputBarAccessoryView
-//
-//  Copyright © 2017-2019 Nathan Tannar.
-//
-//  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.
-//
-//  Created by Nathan Tannar on 10/6/17.
-//
-
-import UIKit
-
-/// AttachmentManagerDelegate is a protocol that can recieve notifications from the AttachmentManager
-public protocol AttachmentManagerDelegate: AnyObject {
-    
-    /// Can be used to determine if the AttachmentManager should be inserted into an InputStackView
-    ///
-    /// - Parameters:
-    ///   - manager: The AttachmentManager
-    ///   - shouldBecomeVisible: If the AttachmentManager should be presented or dismissed
-    func attachmentManager(_ manager: AttachmentManager, shouldBecomeVisible: Bool)
-    
-    
-    /// Notifys when an attachment has been inserted into the AttachmentManager
-    ///
-    /// - Parameters:
-    ///   - manager: The AttachmentManager
-    ///   - attachment: The attachment that was inserted
-    ///   - index: The index of the attachment in the AttachmentManager's attachments array
-    func attachmentManager(_ manager: AttachmentManager, didInsert attachment: AttachmentManager.Attachment, at index: Int)
-    
-    /// Notifys when an attachment has been removed from the AttachmentManager
-    ///
-    /// - Parameters:
-    ///   - manager: The AttachmentManager
-    ///   - attachment: The attachment that was removed
-    ///   - index: The index of the attachment in the AttachmentManager's attachments array
-    func attachmentManager(_ manager: AttachmentManager, didRemove attachment: AttachmentManager.Attachment, at index: Int)
-    
-    /// Notifys when the AttachmentManager was reloaded
-    ///
-    /// - Parameters:
-    ///   - manager: The AttachmentManager
-    ///   - attachments: The AttachmentManager's attachments array
-    func attachmentManager(_ manager: AttachmentManager, didReloadTo attachments: [AttachmentManager.Attachment])
-    
-    /// Notifys when the AddAttachmentCell was selected
-    ///
-    /// - Parameters:
-    ///   - manager: The AttachmentManager
-    ///   - attachments: The index of the AddAttachmentCell
-    func attachmentManager(_ manager: AttachmentManager, didSelectAddAttachmentAt index: Int)
-}
-
-public extension AttachmentManagerDelegate {
-    
-    func attachmentManager(_ manager: AttachmentManager, didInsert attachment: AttachmentManager.Attachment, at index: Int) {}
-    
-    func attachmentManager(_ manager: AttachmentManager, didRemove attachment: AttachmentManager.Attachment, at index: Int) {}
-    
-    func attachmentManager(_ manager: AttachmentManager, didReloadTo attachments: [AttachmentManager.Attachment]) {}
-    
-    func attachmentManager(_ manager: AttachmentManager, didSelectAddAttachmentAt index: Int) {}
-}

+ 0 - 132
Pods/InputBarAccessoryView/Sources/Plugins/AttachmentManager/Views/AttachmentCell.swift

@@ -1,132 +0,0 @@
-//
-//  AttachmentCell.swift
-//  InputBarAccessoryView
-//
-//  Copyright © 2017-2019 Nathan Tannar.
-//
-//  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.
-//
-//  Created by Nathan Tannar on 10/4/17.
-//
-
-import UIKit
-
-open class AttachmentCell: UICollectionViewCell {
-    
-    // MARK: - Properties
-    
-    class var reuseIdentifier: String {
-        return "AttachmentCell"
-    }
-    
-    public let containerView: UIView = {
-        let view = UIView()
-        view.translatesAutoresizingMaskIntoConstraints = false
-        view.backgroundColor = .groupTableViewBackground
-        view.layer.cornerRadius = 8
-        view.clipsToBounds = true
-        return view
-    }()
-    
-    open var padding: UIEdgeInsets = UIEdgeInsets(top: 5, left: 5, bottom: 5, right: 5) {
-        didSet {
-            updateContainerPadding()
-        }
-    }
-    
-    open lazy var deleteButton: UIButton = { [weak self] in
-        let button = UIButton()
-        button.setAttributedTitle(NSMutableAttributedString().bold("X", fontSize: 15, textColor: .white), for: .normal)
-        button.setAttributedTitle(NSMutableAttributedString().bold("X", fontSize: 15, textColor: UIColor.white.withAlphaComponent(0.5)), for: .highlighted)
-        button.layer.cornerRadius = 10
-        button.clipsToBounds = true
-        button.backgroundColor = UIColor(red: 0, green: 122/255, blue: 1, alpha: 1)
-        button.addTarget(self, action: #selector(deleteAttachment), for: .touchUpInside)
-        return button
-    }()
-    
-    open var attachment: AttachmentManager.Attachment?
-    
-    open var indexPath: IndexPath?
-    
-    open weak var manager: AttachmentManager?
-    
-    private var containerViewLayoutSet: NSLayoutConstraintSet?
-    
-    // MARK: - Initialization
-    
-    public override init(frame: CGRect) {
-        super.init(frame: frame)
-        setup()
-    }
-    
-    required public init?(coder aDecoder: NSCoder) {
-        super.init(coder: aDecoder)
-        setup()
-    }
-    
-    open override func prepareForReuse() {
-        super.prepareForReuse()
-        indexPath = nil
-        manager = nil
-        attachment = nil
-    }
-    
-    // MARK: - Setup
-    
-    private func setup() {
-        
-        setupSubviews()
-        setupConstraints()
-    }
-    
-    private func setupSubviews() {
-        
-        contentView.addSubview(containerView)
-        contentView.addSubview(deleteButton)
-    }
-
-    private func setupConstraints() {
-        
-        containerViewLayoutSet = NSLayoutConstraintSet(
-            top:    containerView.topAnchor.constraint(equalTo: contentView.topAnchor, constant: padding.top),
-            bottom: containerView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -padding.bottom),
-            left:   containerView.leftAnchor.constraint(equalTo: contentView.leftAnchor, constant: padding.left),
-            right:  containerView.rightAnchor.constraint(equalTo: contentView.rightAnchor, constant: -padding.right)
-        ).activate()
-        deleteButton.addConstraints(contentView.topAnchor, right: contentView.rightAnchor, widthConstant: 20, heightConstant: 20)
-    }
-    
-    private func updateContainerPadding() {
-        
-        containerViewLayoutSet?.top?.constant = padding.top
-        containerViewLayoutSet?.bottom?.constant = -padding.bottom
-        containerViewLayoutSet?.left?.constant = padding.left
-        containerViewLayoutSet?.right?.constant = -padding.right
-    }
-    
-    // MARK: - User Actions
-    
-    @objc
-    func deleteAttachment() {
-        
-        guard let index = indexPath?.row else { return }
-        manager?.removeAttachment(at: index)
-    }
-}

+ 0 - 82
Pods/InputBarAccessoryView/Sources/Plugins/AttachmentManager/Views/AttachmentsView.swift

@@ -1,82 +0,0 @@
-//
-//  AttachmentCollectionView.swift
-//  InputBarAccessoryView
-//
-//  Copyright © 2017-2019 Nathan Tannar.
-//
-//  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.
-//
-//  Created by Nathan Tannar on 10/4/17.
-//
-
-import UIKit
-
-@available(*, deprecated, message: "AttachmentsView has been renamed to AttachmentCollectionView")
-public typealias AttachmentsView = AttachmentCollectionView
-
-open class AttachmentCollectionView: UICollectionView {
-    
-    // MARK: - Properties
-    
-    open var intrinsicContentHeight: CGFloat = 100 {
-        didSet {
-            invalidateIntrinsicContentSize()
-        }
-    }
-    
-    open override var intrinsicContentSize: CGSize {
-        return CGSize(width: 0, height: intrinsicContentHeight)
-    }
-    
-    // MARK: - Initialization
-    
-    public init() {
-        let layout = UICollectionViewFlowLayout()
-        layout.scrollDirection = .horizontal
-        layout.minimumLineSpacing = 0
-        layout.sectionInset.top = 5
-        layout.sectionInset.bottom = 5
-        layout.headerReferenceSize = CGSize(width: 12, height: 0)
-        layout.footerReferenceSize = CGSize(width: 12, height: 0)
-        super.init(frame: .zero, collectionViewLayout: layout)
-        setup()
-    }
-    
-    public override init(frame: CGRect, collectionViewLayout layout: UICollectionViewLayout) {
-        super.init(frame: frame, collectionViewLayout: layout)
-        setup()
-    }
-    
-    required public init?(coder aDecoder: NSCoder) {
-        super.init(coder: aDecoder)
-        setup()
-    }
-    
-    // MARK: - Setup
-    
-    private func setup() {
-        
-        backgroundColor = .white
-        alwaysBounceHorizontal = true
-        showsHorizontalScrollIndicator = true
-        setContentHuggingPriority(UILayoutPriority.defaultHigh, for: .vertical)
-        register(AttachmentCell.self, forCellWithReuseIdentifier: AttachmentCell.reuseIdentifier)
-        register(ImageAttachmentCell.self, forCellWithReuseIdentifier: ImageAttachmentCell.reuseIdentifier)
-    }
-}

+ 0 - 67
Pods/InputBarAccessoryView/Sources/Plugins/AttachmentManager/Views/ImageAttachmentCell.swift

@@ -1,67 +0,0 @@
-//
-//  ImageAttachmentCell.swift
-//  InputBarAccessoryView
-//
-//  Copyright © 2017-2019 Nathan Tannar.
-//
-//  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.
-//
-//  Created by Nathan Tannar on 10/6/17.
-//
-
-import UIKit
-
-open class ImageAttachmentCell: AttachmentCell {
-    
-    // MARK: - Properties
-    
-    override class var reuseIdentifier: String {
-        return "ImageAttachmentCell"
-    }
-    
-    public let imageView: UIImageView = {
-        let imageView = UIImageView()
-        imageView.contentMode = .scaleAspectFill
-        return imageView
-    }()
-    
-    // MARK: - Initialization
-    
-    public override init(frame: CGRect) {
-        super.init(frame: frame)
-        setup()
-    }
-    
-    required public init?(coder aDecoder: NSCoder) {
-        super.init(coder: aDecoder)
-        setup()
-    }
-    
-    open override func prepareForReuse() {
-        super.prepareForReuse()
-        imageView.image = nil
-    }
-    
-    // MARK: - Setup
-    
-    private func setup() {
-        containerView.addSubview(imageView)
-        imageView.fillSuperview()
-    }
-}

+ 0 - 503
Pods/InputBarAccessoryView/Sources/Plugins/AutocompleteManager/AutocompleteManager.swift

@@ -1,503 +0,0 @@
-//
-//  AttachmentManager.swift
-//  InputBarAccessoryView
-//
-//  Copyright © 2017-2019 Nathan Tannar.
-//
-//  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.
-//
-//  Created by Nathan Tannar on 10/4/17.
-//
-
-import UIKit
-
-public extension NSAttributedString.Key {
-    
-    /// A key used for referencing which substrings were autocompleted
-    /// by InputBarAccessoryView.AutocompleteManager
-    static let autocompleted = NSAttributedString.Key("com.system.autocompletekey")
-    
-    /// A key used for referencing the context of autocompleted substrings
-    /// by InputBarAccessoryView.AutocompleteManager
-    static let autocompletedContext = NSAttributedString.Key("com.system.autocompletekey.context")
-}
-
-open class AutocompleteManager: NSObject, InputPlugin, UITextViewDelegate, UITableViewDelegate, UITableViewDataSource {
-    
-    // MARK: - Properties [Public]
-    
-    /// A protocol that passes data to the `AutocompleteManager`
-    open weak var dataSource: AutocompleteManagerDataSource?
-    
-    /// A protocol that more precisely defines `AutocompleteManager` logic
-    open weak var delegate: AutocompleteManagerDelegate?
-    
-    /// A reference to the `InputTextView` that the `AutocompleteManager` is using
-    private(set) public weak var textView: UITextView?
-    
-    @available(*, deprecated, message: "`inputTextView` has been renamed to `textView` of type `UITextView`")
-    public var inputTextView: InputTextView? { return textView as? InputTextView }
-    
-    /// An ongoing session reference that holds the prefix, range and text to complete with
-    private(set) public var currentSession: AutocompleteSession?
-    
-    /// The `AutocompleteTableView` that renders available autocompletes for the `currentSession`
-    open lazy var tableView: AutocompleteTableView = { [weak self] in
-        let tableView = AutocompleteTableView()
-        tableView.register(AutocompleteCell.self, forCellReuseIdentifier: AutocompleteCell.reuseIdentifier)
-        tableView.separatorStyle = .none
-        tableView.backgroundColor = .white
-        tableView.rowHeight = 44
-        tableView.delegate = self
-        tableView.dataSource = self
-        return tableView
-    }()
-    
-    /// Adds an additional space after the autocompleted text when true.
-    /// Default value is `TRUE`
-    open var appendSpaceOnCompletion = true
-    
-    /// Keeps the prefix typed when text is autocompleted.
-    /// Default value is `TRUE`
-    open var keepPrefixOnCompletion = true
-    
-    /// Allows a single space character to be entered mid autocompletion.
-    ///
-    /// For example, your autocomplete is "Nathan Tannar", the .whitespace deliminater
-    /// set would terminate the session after "Nathan". By setting `maxSpaceCountDuringCompletion`
-    /// the session termination will disregard that number of spaces
-    ///
-    /// Default value is `0`
-    open var maxSpaceCountDuringCompletion: Int = 0
-
-    /// When enabled, autocomplete completions that contain whitespace will be deleted in parts.
-    /// This meands backspacing on "@Nathan Tannar" will result in " Tannar" being removed first
-    /// with a second backspace action required to delete "@Nathan"
-    ///
-    /// Default value is `TRUE`
-    open var deleteCompletionByParts = true
-    
-    /// The default text attributes
-    open var defaultTextAttributes: [NSAttributedString.Key: Any] =
-        [.font: UIFont.preferredFont(forTextStyle: .body), .foregroundColor: UIColor.black]
-    
-    /// The NSAttributedString.Key.paragraphStyle value applied to attributed strings
-    public let paragraphStyle: NSMutableParagraphStyle = {
-        let style = NSMutableParagraphStyle()
-        style.paragraphSpacingBefore = 2
-        style.lineHeightMultiple = 1
-        return style
-    }()
-
-    /// A block that filters the `AutocompleteCompletion`'s sourced
-    /// from the `dataSource`, based on the `AutocompleteSession`.
-    /// The default function requires the `AutocompleteCompletion.text`
-    /// string contains the `AutocompleteSession.filter`
-    /// string ignoring case
-    open var filterBlock: (AutocompleteSession, AutocompleteCompletion) -> (Bool) = { session, completion in completion.text.lowercased().contains(session.filter.lowercased())
-    }
-    
-    // MARK: - Properties [Private]
-    
-    /// The prefices that the manager will recognize
-    public private(set) var autocompletePrefixes = Set<String>()
-    
-    /// The delimiters that the manager will terminate a session with
-    /// The default value is: [.whitespaces, .newlines]
-    public private(set) var autocompleteDelimiterSets: Set<CharacterSet> = [.whitespaces, .newlines]
-    
-    /// The text attributes applied to highlighted substrings for each prefix
-    public private(set) var autocompleteTextAttributes = [String: [NSAttributedString.Key: Any]]()
-    
-    /// A reference to `defaultTextAttributes` that adds the NSAttributedAutocompleteKey
-    private var typingTextAttributes: [NSAttributedString.Key: Any] {
-        var attributes = defaultTextAttributes
-        attributes[.autocompleted] = false
-        attributes[.autocompletedContext] = nil
-        attributes[.paragraphStyle] = paragraphStyle
-        return attributes
-    }
-    
-    /// The current autocomplete text options filtered by the text after the prefix
-    private var currentAutocompleteOptions: [AutocompleteCompletion] {
-        
-        guard let session = currentSession, let completions = dataSource?.autocompleteManager(self, autocompleteSourceFor: session.prefix) else { return [] }
-        guard !session.filter.isEmpty else { return completions }
-        return completions.filter { completion in
-            return filterBlock(session, completion)
-        }
-    }
-    
-    // MARK: - Initialization
-    
-    public init(for textView: UITextView) {
-        super.init()
-        self.textView = textView
-        self.textView?.delegate = self
-    }
-    
-    // MARK: - InputPlugin
-    
-    /// Reloads the InputPlugin's session
-    open func reloadData() {
-
-        var delimiterSet = autocompleteDelimiterSets.reduce(CharacterSet()) { result, set in
-            return result.union(set)
-        }
-        let query = textView?.find(prefixes: autocompletePrefixes, with: delimiterSet)
-        
-        guard let result = query else {
-            if let session = currentSession, session.spaceCounter <= maxSpaceCountDuringCompletion {
-                delimiterSet = delimiterSet.subtracting(.whitespaces)
-                guard let result = textView?.find(prefixes: [session.prefix], with: delimiterSet) else {
-                    unregisterCurrentSession()
-                    return
-                }
-                let wordWithoutPrefix = (result.word as NSString).substring(from: result.prefix.utf16.count)
-                updateCurrentSession(to: wordWithoutPrefix)
-            } else {
-                unregisterCurrentSession()
-            }
-            return
-        }
-        let wordWithoutPrefix = (result.word as NSString).substring(from: result.prefix.utf16.count)
-        guard let session = AutocompleteSession(prefix: result.prefix, range: result.range, filter: wordWithoutPrefix) else { return }
-        guard let currentSession = currentSession else {
-            registerCurrentSession(to: session)
-            return
-        }
-        if currentSession == session {
-            updateCurrentSession(to: wordWithoutPrefix)
-        } else {
-            registerCurrentSession(to: session)
-        }
-    }
-    
-    /// Invalidates the InputPlugin's session
-    open func invalidate() {
-        unregisterCurrentSession()
-    }
-    
-    /// Passes an object into the InputPlugin's session to handle
-    ///
-    /// - Parameter object: A string to append
-    @discardableResult
-    open func handleInput(of object: AnyObject) -> Bool {
-        guard let newText = object as? String, let textView = textView else { return false }
-        let attributedString = NSMutableAttributedString(attributedString: textView.attributedText)
-        let newAttributedString = NSAttributedString(string: newText, attributes: typingTextAttributes)
-        attributedString.append(newAttributedString)
-        textView.attributedText = attributedString
-        reloadData()
-        return true
-    }
-    
-    // MARK: - API [Public]
-    
-    /// Registers a prefix and its the attributes to apply to its autocompleted strings
-    ///
-    /// - Parameters:
-    ///   - prefix: The prefix such as: @, # or !
-    ///   - attributedTextAttributes: The attributes to apply to the NSAttributedString
-    open func register(prefix: String, with attributedTextAttributes: [NSAttributedString.Key:Any]? = nil) {
-        autocompletePrefixes.insert(prefix)
-        autocompleteTextAttributes[prefix] = attributedTextAttributes
-        autocompleteTextAttributes[prefix]?[.paragraphStyle] = paragraphStyle
-    }
-    
-    /// Unregisters a prefix and removes its associated cached attributes
-    ///
-    /// - Parameter prefix: The prefix such as: @, # or !
-    open func unregister(prefix: String) {
-        autocompletePrefixes.remove(prefix)
-        autocompleteTextAttributes[prefix] = nil
-    }
-    
-    /// Registers a CharacterSet as a delimiter
-    ///
-    /// - Parameter delimiterSet: The `CharacterSet` to recognize as a delimiter
-    open func register(delimiterSet set: CharacterSet) {
-        autocompleteDelimiterSets.insert(set)
-    }
-    
-    /// Unregisters a CharacterSet
-    ///
-    /// - Parameter delimiterSet: The `CharacterSet` to recognize as a delimiter
-    open func unregister(delimiterSet set: CharacterSet) {
-        autocompleteDelimiterSets.remove(set)
-    }
-    
-    /// Replaces the current prefix and filter text with the supplied text
-    ///
-    /// - Parameters:
-    ///   - text: The replacement text
-    open func autocomplete(with session: AutocompleteSession) {
-        
-        guard let textView = textView else { return }
-        guard delegate?.autocompleteManager(self, shouldComplete: session.prefix, with: session.filter) != false else { return }
-        
-        // Create a range that overlaps the prefix
-        let prefixLength = session.prefix.utf16.count
-        let insertionRange = NSRange(
-            location: session.range.location + (keepPrefixOnCompletion ? prefixLength : 0),
-            length: session.filter.utf16.count + (!keepPrefixOnCompletion ? prefixLength : 0)
-        )
-        
-        // Transform range
-        guard let range = Range(insertionRange, in: textView.text) else { return }
-        let nsrange = NSRange(range, in: textView.text)
-        
-        // Replace the attributedText with a modified version
-        let autocomplete = session.completion?.text ?? ""
-        insertAutocomplete(autocomplete, at: session, for: nsrange)
-        
-        // Move Cursor to the end of the inserted text
-        let selectedLocation = insertionRange.location + autocomplete.utf16.count + (appendSpaceOnCompletion ? 1 : 0)
-        textView.selectedRange = NSRange(
-            location: selectedLocation,
-            length: 0
-        )
-        
-        // End the session
-        unregisterCurrentSession()
-    }
-    
-    /// Returns an attributed string with bolded characters matching the characters typed in the session
-    ///
-    /// - Parameter session: The `AutocompleteSession` to form an `NSMutableAttributedString` with
-    /// - Returns: An `NSMutableAttributedString`
-    open func attributedText(matching session: AutocompleteSession,
-                             fontSize: CGFloat = 15,
-                             keepPrefix: Bool = true) -> NSMutableAttributedString {
-        
-        guard let completion = session.completion else {
-            return NSMutableAttributedString()
-        }
-        
-        // Bolds the text that currently matches the filter
-        let matchingRange = (completion.text as NSString).range(of: session.filter, options: .caseInsensitive)
-        let attributedString = NSMutableAttributedString().normal(completion.text, fontSize: fontSize)
-        attributedString.addAttributes([.font: UIFont.boldSystemFont(ofSize: fontSize)], range: matchingRange)
-        
-        guard keepPrefix else { return attributedString }
-        let stringWithPrefix = NSMutableAttributedString().normal(String(session.prefix), fontSize: fontSize)
-        stringWithPrefix.append(attributedString)
-        return stringWithPrefix
-    }
-    
-    // MARK: - API [Private]
-    
-    /// Resets the `InputTextView`'s typingAttributes to `defaultTextAttributes`
-    private func preserveTypingAttributes() {
-        textView?.typingAttributes = typingTextAttributes
-    }
-    
-    
-    /// Inserts an autocomplete for a given selection
-    ///
-    /// - Parameters:
-    ///   - autocomplete: The 'String' to autocomplete to
-    ///   - sesstion: The 'AutocompleteSession'
-    ///   - range: The 'NSRange' to insert over
-    private func insertAutocomplete(_ autocomplete: String, at session: AutocompleteSession, for range: NSRange) {
-        
-        guard let textView = textView else { return }
-        
-        // Apply the autocomplete attributes
-        var attrs = autocompleteTextAttributes[session.prefix] ?? defaultTextAttributes
-        attrs[.autocompleted] = true
-        attrs[.autocompletedContext] = session.completion?.context
-        let newString = (keepPrefixOnCompletion ? session.prefix : "") + autocomplete
-        let newAttributedString = NSAttributedString(string: newString, attributes: attrs)
-        
-        // Modify the NSRange to include the prefix length
-        let rangeModifier = keepPrefixOnCompletion ? session.prefix.count : 0
-        let highlightedRange = NSRange(location: range.location - rangeModifier, length: range.length + rangeModifier)
-        
-        // Replace the attributedText with a modified version including the autocompete
-        let newAttributedText = textView.attributedText.replacingCharacters(in: highlightedRange, with: newAttributedString)
-        if appendSpaceOnCompletion {
-            newAttributedText.append(NSAttributedString(string: " ", attributes: typingTextAttributes))
-        }
-        
-        // Set to a blank attributed string to prevent keyboard autocorrect from cloberring the insert
-        textView.attributedText = NSAttributedString()
-
-        textView.attributedText = newAttributedText
-    }
-    
-    /// Initializes a session with a new `AutocompleteSession` object
-    ///
-    /// - Parameters:
-    ///   - session: The session to register
-    private func registerCurrentSession(to session: AutocompleteSession) {
-        
-        guard delegate?.autocompleteManager(self, shouldRegister: session.prefix, at: session.range) != false else { return }
-        currentSession = session
-        layoutIfNeeded()
-        delegate?.autocompleteManager(self, shouldBecomeVisible: true)
-    }
-    
-    /// Updates the session to a new String to filter results with
-    ///
-    /// - Parameters:
-    ///   - filterText: The String to filter `AutocompleteCompletion`s
-    private func updateCurrentSession(to filterText: String) {
-        
-        currentSession?.filter = filterText
-        layoutIfNeeded()
-        delegate?.autocompleteManager(self, shouldBecomeVisible: true)
-    }
-    
-    /// Invalidates the `currentSession` session if it existed
-    private func unregisterCurrentSession() {
-        
-        guard let session = currentSession else { return }
-        guard delegate?.autocompleteManager(self, shouldUnregister: session.prefix) != false else { return }
-        currentSession = nil
-        layoutIfNeeded()
-        delegate?.autocompleteManager(self, shouldBecomeVisible: false)
-    }
-    
-    /// Calls the required methods to relayout the `AutocompleteTableView` in it's superview
-    private func layoutIfNeeded() {
-        
-        tableView.reloadData()
-        
-        // Resize the table to be fit properly in an `InputStackView`
-        tableView.invalidateIntrinsicContentSize()
-        
-        // Layout the table's superview
-        tableView.superview?.layoutIfNeeded()
-    }
-    
-    // MARK: - UITextViewDelegate
-    
-    public func textViewDidChange(_ textView: UITextView) {
-        reloadData()
-    }
-    
-    public func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
-        
-        // Ensure that the text to be inserted is not using previous attributes
-        preserveTypingAttributes()
-        
-        if let session = currentSession {
-            let textToReplace = (textView.text as NSString).substring(with: range)
-            let deleteSpaceCount = textToReplace.filter { $0 == .space }.count
-            let insertSpaceCount = text.filter { $0 == .space }.count
-            let spaceCountDiff = insertSpaceCount - deleteSpaceCount
-            session.spaceCounter = spaceCountDiff
-        }
-        
-        let totalRange = NSRange(location: 0, length: textView.attributedText.length)
-        let selectedRange = textView.selectedRange
-        
-        // range.length > 0: Backspace/removing text
-        // range.lowerBound < textView.selectedRange.lowerBound: Ignore trying to delete
-        //      the substring if the user is already doing so
-        // range == selectedRange: User selected a chunk to delete
-        if range.length > 0, range.location < selectedRange.location {
-            
-            // Backspace/removing text
-            let attributes = textView.attributedText.attributes(at: range.location, longestEffectiveRange: nil, in: range)
-            let isAutocompleted = attributes[.autocompleted] as? Bool ?? false
-            
-            if isAutocompleted {
-                textView.attributedText.enumerateAttribute(.autocompleted, in: totalRange, options: .reverse) { _, subrange, stop in
-                    
-                    let intersection = NSIntersectionRange(range, subrange)
-                    guard intersection.length > 0 else { return }
-                    defer { stop.pointee = true }
-
-                    let nothing = NSAttributedString(string: "", attributes: typingTextAttributes)
-
-                    let textToReplace = textView.attributedText.attributedSubstring(from: subrange).string
-                    guard deleteCompletionByParts, let delimiterRange = textToReplace.rangeOfCharacter(from: .whitespacesAndNewlines, options: .backwards, range: Range(subrange, in: textToReplace)) else {
-                        // Replace entire autocomplete
-                        textView.attributedText = textView.attributedText.replacingCharacters(in: subrange, with: nothing)
-                        textView.selectedRange = NSRange(location: subrange.location, length: 0)
-                        return
-                    }
-                    // Delete up to delimiter
-                    let delimiterLocation = delimiterRange.lowerBound.utf16Offset(in: textToReplace)
-                    let length = subrange.length - delimiterLocation
-                    let rangeFromDelimiter = NSRange(location: delimiterLocation + subrange.location, length: length)
-                    textView.attributedText = textView.attributedText.replacingCharacters(in: rangeFromDelimiter, with: nothing)
-                    textView.selectedRange = NSRange(location: subrange.location + delimiterLocation, length: 0)
-                }
-                unregisterCurrentSession()
-                return false
-            }
-        } else if range.length >= 0, range.location < totalRange.length {
-            
-            // Inserting text in the middle of an autocompleted string
-            let attributes = textView.attributedText.attributes(at: range.location, longestEffectiveRange: nil, in: range)
-            let isAutocompleted = attributes[.autocompleted] as? Bool ?? false
-            if isAutocompleted {
-                textView.attributedText.enumerateAttribute(.autocompleted, in: totalRange, options: .reverse) { _, subrange, stop in
-                    
-                    let compareRange = range.length == 0 ? NSRange(location: range.location, length: 1) : range
-                    let intersection = NSIntersectionRange(compareRange, subrange)
-                    guard intersection.length > 0 else { return }
-                    
-                    let mutable = NSMutableAttributedString(attributedString: textView.attributedText)
-                    mutable.setAttributes(typingTextAttributes, range: subrange)
-                    let replacementText = NSAttributedString(string: text, attributes: typingTextAttributes)
-                    textView.attributedText = mutable.replacingCharacters(in: range, with: replacementText)
-                    textView.selectedRange = NSRange(location: range.location + text.count, length: 0)
-                    stop.pointee = true
-                }
-                unregisterCurrentSession()
-                return false
-            }
-        }
-        return true
-    }
-    
-    // MARK: - UITableViewDataSource
-    
-    open func numberOfSections(in tableView: UITableView) -> Int {
-        return 1
-    }
-    
-    open func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
-        return currentAutocompleteOptions.count
-    }
-    
-    open func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
-        
-        guard let session = currentSession else { fatalError("Attempted to render a cell for a nil `AutocompleteSession`") }
-        session.completion = currentAutocompleteOptions[indexPath.row]
-        guard let cell = dataSource?.autocompleteManager(self, tableView: tableView, cellForRowAt: indexPath, for: session) else {
-            fatalError("Failed to return a cell from `dataSource: AutocompleteManagerDataSource`")
-        }
-        return cell
-    }
-    
-    // MARK: - UITableViewDelegate
-    
-    open func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
-        
-        guard let session = currentSession else { return }
-        session.completion = currentAutocompleteOptions[indexPath.row]
-        autocomplete(with: session)
-    }
-    
-}

+ 0 - 48
Pods/InputBarAccessoryView/Sources/Plugins/AutocompleteManager/Models/AutocompleteCompletion.swift

@@ -1,48 +0,0 @@
-//
-//  AutocompleteCompletion.swift
-//  InputBarAccessoryView
-//
-//  Copyright © 2017-2019 Nathan Tannar.
-//
-//  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.
-//
-//  Created by Nathan Tannar on 10/4/17.
-//
-
-import Foundation
-
-public struct AutocompleteCompletion {
-    
-    // The String to insert/replace upon autocompletion
-    public let text: String
-    
-    // The context of the completion that you may need later when completed
-    public let context: [String: Any]?
-    
-    public init(text: String, context: [String: Any]? = nil) {
-        self.text = text
-        self.context = context
-    }
-    
-    @available(*, deprecated, message: "`displayText` should no longer be used, use `context: [String: Any]` instead")
-    public init(_ text: String, displayText: String) {
-        self.text = text
-        self.context = nil
-    }
-}

+ 0 - 52
Pods/InputBarAccessoryView/Sources/Plugins/AutocompleteManager/Models/AutocompleteSession.swift

@@ -1,52 +0,0 @@
-//
-//  AutocompleteSession.swift
-//  InputBarAccessoryView
-//
-//  Copyright © 2017-2019 Nathan Tannar.
-//
-//  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.
-//
-//  Created by Nathan Tannar on 10/4/17.
-//
-
-import Foundation
-
-/// A class containing data on the `AutocompleteManager`'s session
-public class AutocompleteSession {
-    
-    public let prefix: String
-    public let range: NSRange
-    public var filter: String
-    public var completion: AutocompleteCompletion?
-    internal var spaceCounter: Int = 0
-    
-    public init?(prefix: String?, range: NSRange?, filter: String?) {
-        guard let pfx = prefix, let rng = range, let flt = filter else { return nil }
-        self.prefix = pfx
-        self.range = rng
-        self.filter = flt
-    }
-}
-
-extension AutocompleteSession: Equatable {
-
-    public static func == (lhs: AutocompleteSession, rhs: AutocompleteSession) -> Bool {
-        return lhs.prefix == rhs.prefix && lhs.range == rhs.range
-    }
-}

+ 0 - 67
Pods/InputBarAccessoryView/Sources/Plugins/AutocompleteManager/Protocols/AutocompleteManagerDataSource.swift

@@ -1,67 +0,0 @@
-//
-//  AutocompleteManagerDataSource.swift
-//  InputBarAccessoryView
-//
-//  Copyright © 2017-2019 Nathan Tannar.
-//
-//  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.
-//
-//  Created by Nathan Tannar on 10/1/17.
-//
-
-import UIKit
-
-/// AutocompleteManagerDataSource is a protocol that passes data to the AutocompleteManager
-public protocol AutocompleteManagerDataSource: AnyObject {
-    
-    /// The autocomplete options for the registered prefix.
-    ///
-    /// - Parameters:
-    ///   - manager: The AutocompleteManager
-    ///   - prefix: The registered prefix
-    /// - Returns: An array of `AutocompleteCompletion` options for the given prefix
-    func autocompleteManager(_ manager: AutocompleteManager, autocompleteSourceFor prefix: String) -> [AutocompleteCompletion]
-    
-    /// The cell to populate the `AutocompleteTableView` with
-    ///
-    /// - Parameters:
-    ///   - manager: The `AttachmentManager` that sources the UITableViewDataSource
-    ///   - tableView: The `AttachmentManager`'s `AutocompleteTableView`
-    ///   - indexPath: The `IndexPath` of the cell
-    ///   - session: The current `Session` of the `AutocompleteManager`
-    /// - Returns: A UITableViewCell to populate the `AutocompleteTableView`
-    func autocompleteManager(_ manager: AutocompleteManager, tableView: UITableView, cellForRowAt indexPath: IndexPath, for session: AutocompleteSession) -> UITableViewCell
-}
-
-public extension AutocompleteManagerDataSource {
-    
-    func autocompleteManager(_ manager: AutocompleteManager, tableView: UITableView, cellForRowAt indexPath: IndexPath, for session: AutocompleteSession) -> UITableViewCell {
-        
-        guard let cell = tableView.dequeueReusableCell(withIdentifier: AutocompleteCell.reuseIdentifier, for: indexPath) as? AutocompleteCell else {
-            fatalError("AutocompleteCell is not registered")
-        }
-        
-        cell.textLabel?.attributedText = manager.attributedText(matching: session, fontSize: 13)
-        cell.backgroundColor = .white
-        cell.separatorLine.isHidden = tableView.numberOfRows(inSection: indexPath.section) - 1 == indexPath.row
-        return cell
-        
-    }
-    
-}

+ 0 - 82
Pods/InputBarAccessoryView/Sources/Plugins/AutocompleteManager/Protocols/AutocompleteManagerDelegate.swift

@@ -1,82 +0,0 @@
-//
-//  AutocompleteManagerDelegate.swift
-//  InputBarAccessoryView
-//
-//  Copyright © 2017-2019 Nathan Tannar.
-//
-//  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.
-//
-//  Created by Nathan Tannar on 10/4/17.
-//
-
-import UIKit
-
-/// AutocompleteManagerDelegate is a protocol that more precisely define AutocompleteManager logic
-public protocol AutocompleteManagerDelegate: AnyObject {
-    
-    /// Can be used to determine if the AutocompleteManager should be inserted into an InputStackView
-    ///
-    /// - Parameters:
-    ///   - manager: The AutocompleteManager
-    ///   - shouldBecomeVisible: If the AutocompleteManager should be presented or dismissed
-    func autocompleteManager(_ manager: AutocompleteManager, shouldBecomeVisible: Bool)
-    
-    /// Determines if a prefix character should be registered to initialize the auto-complete selection table
-    ///
-    /// - Parameters:
-    ///   - manager: The AutocompleteManager
-    ///   - prefix: The prefix `Character` could be registered
-    ///   - range: The `NSRange` of the prefix in the UITextView managed by the AutocompleteManager
-    /// - Returns: If the prefix should be registered. Default is TRUE
-    func autocompleteManager(_ manager: AutocompleteManager, shouldRegister prefix: String, at range: NSRange) -> Bool
-    
-    /// Determines if a prefix character should be unregistered to de-initialize the auto-complete selection table
-    ///
-    /// - Parameters:
-    ///   - manager: The AutocompleteManager
-    ///   - prefix: The prefix character could be unregistered
-    ///   - range: The range of the prefix in the UITextView managed by the AutocompleteManager
-    /// - Returns: If the prefix should be unregistered. Default is TRUE
-    func autocompleteManager(_ manager: AutocompleteManager, shouldUnregister prefix: String) -> Bool
-    
-    /// Determines if a prefix character can should be autocompleted
-    ///
-    /// - Parameters:
-    ///   - manager: The AutocompleteManager
-    ///   - prefix: The prefix character that is currently registered
-    ///   - text: The text to autocomplete with
-    /// - Returns: If the prefix can be autocompleted. Default is TRUE
-    func autocompleteManager(_ manager: AutocompleteManager, shouldComplete prefix: String, with text: String) -> Bool
-}
-
-public extension AutocompleteManagerDelegate {
-    
-    func autocompleteManager(_ manager: AutocompleteManager, shouldRegister prefix: String, at range: NSRange) -> Bool {
-        return true
-    }
-    
-    func autocompleteManager(_ manager: AutocompleteManager, shouldUnregister prefix: String) -> Bool {
-        return true
-    }
-    
-    func autocompleteManager(_ manager: AutocompleteManager, shouldComplete prefix: String, with text: String) -> Bool {
-        return true
-    }
-}
-

+ 0 - 97
Pods/InputBarAccessoryView/Sources/Plugins/AutocompleteManager/Views/AutocompleteCell.swift

@@ -1,97 +0,0 @@
-//
-//  AutocompleteCell.swift
-//  InputBarAccessoryView
-//
-//  Copyright © 2017-2019 Nathan Tannar.
-//
-//  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.
-//
-//  Created by Nathan Tannar on 10/4/17.
-//
-
-import UIKit
-
-open class AutocompleteCell: UITableViewCell {
-    
-    // MARK: - Properties
-    
-    open class var reuseIdentifier: String {
-        return "AutocompleteCell"
-    }
-    
-    /// A boarder line anchored to the top of the view
-    public let separatorLine = SeparatorLine()
-    
-    open var imageViewEdgeInsets: UIEdgeInsets = .zero { didSet { setNeedsLayout() } }
-    
-    // MARK: - Initialization
-    
-    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
-        super.init(style: .subtitle, reuseIdentifier: reuseIdentifier)
-        setup()
-    }
-    
-    required public init?(coder aDecoder: NSCoder) {
-        super.init(coder: aDecoder)
-        setup()
-    }
-    
-    open override func prepareForReuse() {
-        super.prepareForReuse()
-        textLabel?.text = nil
-        detailTextLabel?.text = nil
-        imageView?.image = nil
-        imageViewEdgeInsets = .zero
-        separatorLine.backgroundColor = .lightGray
-        separatorLine.isHidden = false
-    }
-    
-    // MARK: - Setup
-    
-    private func setup() {
-        
-        setupSubviews()
-        setupConstraints()
-    }
-    
-    open func setupSubviews() {
-        
-        addSubview(separatorLine)
-    }
-    
-    open func setupConstraints() {
-        
-        separatorLine.addConstraints(left: leftAnchor, bottom: bottomAnchor, right: rightAnchor, heightConstant: 0.5)
-    }
-    
-    open override func layoutSubviews() {
-        super.layoutSubviews()
-        guard let imageViewFrame = imageView?.frame else { return }
-        let imageViewOrigin = CGPoint(x: imageViewFrame.origin.x + imageViewEdgeInsets.left, y: imageViewFrame.origin.y + imageViewEdgeInsets.top)
-        let imageViewSize = CGSize(width: imageViewFrame.size.width - imageViewEdgeInsets.left - imageViewEdgeInsets.right, height: imageViewFrame.size.height - imageViewEdgeInsets.top - imageViewEdgeInsets.bottom)
-        imageView?.frame = CGRect(origin: imageViewOrigin, size: imageViewSize)
-    }
-    
-    // MARK: - API [Public]
-    
-    @available(*, deprecated, message: "This function has been moved to the `AutocompleteManager`")
-    open func attributedText(matching session: AutocompleteSession) -> NSMutableAttributedString {
-        fatalError("Please use `func attributedText(matching:, fontSize:)` implemented in the `AutocompleteManager`")
-    }
-}

+ 0 - 41
Pods/InputBarAccessoryView/Sources/Plugins/AutocompleteManager/Views/AutocompleteTableView.swift

@@ -1,41 +0,0 @@
-//
-//  AutocompleteTableView.swift
-//  InputBarAccessoryView
-//
-//  Copyright © 2017-2019 Nathan Tannar.
-//
-//  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.
-//
-//  Created by Nathan Tannar on 10/4/17.
-//
-
-import UIKit
-
-open class AutocompleteTableView: UITableView {
-    
-    /// The max visible rows visible in the autocomplete table before the user has to scroll throught them
-    open var maxVisibleRows = 3 { didSet { invalidateIntrinsicContentSize() } }
-    
-    open override var intrinsicContentSize: CGSize {
-        
-        let rows = numberOfRows(inSection: 0) < maxVisibleRows ? numberOfRows(inSection: 0) : maxVisibleRows
-        return CGSize(width: super.intrinsicContentSize.width, height: (CGFloat(rows) * rowHeight))
-    }
-    
-}

+ 0 - 91
Pods/InputBarAccessoryView/Sources/Supporting Files/InputBarAccessoryView+Availability.swift

@@ -1,91 +0,0 @@
-//
-//  InputBarAccessoryView+Availability.swift
-//  InputBarAccessoryView
-//
-//  Copyright © 2017-2019 Nathan Tannar.
-//
-//  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.
-//
-//  Created by Nathan Tannar on 2/12/17.
-//
-
-import UIKit
-
-@available(*, deprecated, message: "InputManager has been renamed to InputPlugin")
-public typealias InputManager = InputPlugin
-
-extension InputPlugin {
-    
-    @available(*, deprecated, message: "`handleInput(object:)` should return a `Bool` if handle was successful or now")
-    func handleInput(of object: AnyObject) {
-        _ = self.handleInput(of: object)
-    }
-}
-
-extension AutocompleteCompletion {
-    
-    // An optional string to display instead of `text`, for example emojis
-    @available(*, deprecated, message: "`displayText` should no longer be used, use `context: [String: Any]` instead")
-    public var displayText: String? {
-        return text
-    }
-}
-
-extension AutocompleteManager {
-    /// If the autocomplete matches should be made by casting the strings to lowercase.
-    /// Default value is `FALSE`
-    /// DEPRICATED; will always return `FALSE`
-    @available(*, deprecated, message: "`isCaseSensitive` was replaced in favour of a more customizable `filterBlock: (String) -> (Bool)`")
-    public var isCaseSensitive: Bool {
-        get { return false }
-        set {
-            if isCaseSensitive {
-                filterBlock = { session, completion in
-                    completion.text.contains(session.filter)
-                }
-            } else {
-                filterBlock = { session, completion in completion.text.lowercased().contains(session.filter.lowercased())
-                }
-            }
-        }
-    }
-}
-
-extension InputBarAccessoryView {
-
-    /**
-     The anchor constants used by the InputStackView
-
-     ````
-     V:|...-(padding.top)-(textViewPadding.top)-[InputTextView]-(textViewPadding.bottom)-[InputStackView.bottom]-...|
-
-     H:|...-[InputStackView.left]-(textViewPadding.left)-[InputTextView]-(textViewPadding.right)-[InputStackView.right]-...|
-     ````
-
-     */
-    @available(*, deprecated, message: "The `InputTextView` now resides in the `middleContentView` and thus this property has been renamed to `middleContentViewPadding`")
-    public var textViewPadding: UIEdgeInsets {
-        get {
-            return middleContentViewPadding
-        }
-        set {
-            middleContentViewPadding = newValue
-        }
-    }
-}

+ 0 - 88
Pods/InputBarAccessoryView/Sources/ViewControllers/InputBarViewController.swift

@@ -1,88 +0,0 @@
-//
-//  InputBarViewController.swift
-//  InputBarAccessoryView
-//
-//  Copyright © 2017-2019 Nathan Tannar.
-//
-//  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.
-//
-//  Created by Nathan Tannar on 9/13/18.
-//
-
-import UIKit
-
-/// An simple `UIViewController` subclass that is ready to work
-/// with an `inputAccessoryView`
-open class InputBarViewController: UIViewController, InputBarAccessoryViewDelegate {
-
-    /// A powerful InputAccessoryView ideal for messaging applications
-    public let inputBar = InputBarAccessoryView()
-
-    /// A boolean value that when changed will update the `inputAccessoryView`
-    /// of the `InputBarViewController`. When set to `TRUE`, the
-    /// `inputAccessoryView` is set to `nil` and the `inputBar` slides off
-    /// the screen.
-    ///
-    /// The default value is FALSE
-    open var isInputBarHidden: Bool = false {
-        didSet {
-            isInputBarHiddenDidChange()
-        }
-    }
-
-    open override var inputAccessoryView: UIView? {
-        return isInputBarHidden ? nil : inputBar
-    }
-
-    open override var canBecomeFirstResponder: Bool {
-        return !isInputBarHidden
-    }
-
-    open override func viewDidLoad() {
-        super.viewDidLoad()
-        inputBar.delegate = self
-    }
-
-    /// Invoked when `isInputBarHidden` changes to become or
-    /// resign first responder
-    open func isInputBarHiddenDidChange() {
-        if isInputBarHidden, isFirstResponder {
-            resignFirstResponder()
-        } else if !isFirstResponder {
-            becomeFirstResponder()
-        }
-    }
-
-    @discardableResult
-    open override func resignFirstResponder() -> Bool {
-        inputBar.inputTextView.resignFirstResponder()
-        return super.resignFirstResponder()
-    }
-
-    // MARK: - InputBarAccessoryViewDelegate
-
-    open func inputBar(_ inputBar: InputBarAccessoryView, didPressSendButtonWith text: String) { }
-
-    open func inputBar(_ inputBar: InputBarAccessoryView, textViewTextDidChangeTo text: String) { }
-
-    open func inputBar(_ inputBar: InputBarAccessoryView, didChangeIntrinsicContentTo size: CGSize) { }
-
-    open func inputBar(_ inputBar: InputBarAccessoryView, didSwipeTextViewWith gesture: UISwipeGestureRecognizer) { }
-}
-

+ 1 - 7
Pods/Manifest.lock

@@ -3,9 +3,6 @@ PODS:
     - CocoaLumberjack/Core (= 3.7.2)
   - CocoaLumberjack/Core (3.7.2)
   - DBDebugToolkit (0.6.0)
-  - InputBarAccessoryView (4.3.1):
-    - InputBarAccessoryView/Core (= 4.3.1)
-  - InputBarAccessoryView/Core (4.3.1)
   - libwebp (1.2.0):
     - libwebp/demux (= 1.2.0)
     - libwebp/mux (= 1.2.0)
@@ -34,7 +31,6 @@ PODS:
 
 DEPENDENCIES:
   - DBDebugToolkit
-  - InputBarAccessoryView
   - ReachabilitySwift
   - SCSiriWaveformView
   - SDWebImage (~> 5.9.1)
@@ -49,7 +45,6 @@ SPEC REPOS:
   trunk:
     - CocoaLumberjack
     - DBDebugToolkit
-    - InputBarAccessoryView
     - libwebp
     - ReachabilitySwift
     - SCSiriWaveformView
@@ -73,7 +68,6 @@ CHECKOUT OPTIONS:
 SPEC CHECKSUMS:
   CocoaLumberjack: b7e05132ff94f6ae4dfa9d5bce9141893a21d9da
   DBDebugToolkit: 03eb3483da4daf03b853b83ade5a8da9c8b7aff4
-  InputBarAccessoryView: 58a348be7ea2736c7eec60e5c315511c2dbb39fd
   libwebp: e90b9c01d99205d03b6bb8f2c8c415e5a4ef66f0
   ReachabilitySwift: 4032e2f59586e11e3b0ebe15b167abdd587a388b
   SCSiriWaveformView: 15b9dd6f94c7536e2032b34a35c6ff74d38c7411
@@ -85,6 +79,6 @@ SPEC CHECKSUMS:
   SwiftLint: 99f82d07b837b942dd563c668de129a03fc3fb52
   SwiftyBeaver: 576177b2c5c94b3aedd5993914e91271a0524e88
 
-PODFILE CHECKSUM: 632fce258414c6c6231891ec0ba5fb604075674b
+PODFILE CHECKSUM: b1373ee5525a53ced60269aa3cfce2018c295507
 
 COCOAPODS: 1.11.2

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 1860 - 1957
Pods/Pods.xcodeproj/project.pbxproj


+ 0 - 26
Pods/Target Support Files/InputBarAccessoryView/InputBarAccessoryView-Info.plist

@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-  <key>CFBundleDevelopmentRegion</key>
-  <string>en</string>
-  <key>CFBundleExecutable</key>
-  <string>${EXECUTABLE_NAME}</string>
-  <key>CFBundleIdentifier</key>
-  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
-  <key>CFBundleInfoDictionaryVersion</key>
-  <string>6.0</string>
-  <key>CFBundleName</key>
-  <string>${PRODUCT_NAME}</string>
-  <key>CFBundlePackageType</key>
-  <string>FMWK</string>
-  <key>CFBundleShortVersionString</key>
-  <string>4.3.1</string>
-  <key>CFBundleSignature</key>
-  <string>????</string>
-  <key>CFBundleVersion</key>
-  <string>${CURRENT_PROJECT_VERSION}</string>
-  <key>NSPrincipalClass</key>
-  <string></string>
-</dict>
-</plist>

+ 0 - 5
Pods/Target Support Files/InputBarAccessoryView/InputBarAccessoryView-dummy.m

@@ -1,5 +0,0 @@
-#import <Foundation/Foundation.h>
-@interface PodsDummy_InputBarAccessoryView : NSObject
-@end
-@implementation PodsDummy_InputBarAccessoryView
-@end

+ 0 - 12
Pods/Target Support Files/InputBarAccessoryView/InputBarAccessoryView-prefix.pch

@@ -1,12 +0,0 @@
-#ifdef __OBJC__
-#import <UIKit/UIKit.h>
-#else
-#ifndef FOUNDATION_EXPORT
-#if defined(__cplusplus)
-#define FOUNDATION_EXPORT extern "C"
-#else
-#define FOUNDATION_EXPORT extern
-#endif
-#endif
-#endif
-

+ 0 - 16
Pods/Target Support Files/InputBarAccessoryView/InputBarAccessoryView-umbrella.h

@@ -1,16 +0,0 @@
-#ifdef __OBJC__
-#import <UIKit/UIKit.h>
-#else
-#ifndef FOUNDATION_EXPORT
-#if defined(__cplusplus)
-#define FOUNDATION_EXPORT extern "C"
-#else
-#define FOUNDATION_EXPORT extern
-#endif
-#endif
-#endif
-
-
-FOUNDATION_EXPORT double InputBarAccessoryViewVersionNumber;
-FOUNDATION_EXPORT const unsigned char InputBarAccessoryViewVersionString[];
-

+ 0 - 14
Pods/Target Support Files/InputBarAccessoryView/InputBarAccessoryView.debug.xcconfig

@@ -1,14 +0,0 @@
-CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
-CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/InputBarAccessoryView
-GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
-LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
-OTHER_LDFLAGS = $(inherited) -framework "UIKit"
-OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS -suppress-warnings
-PODS_BUILD_DIR = ${BUILD_DIR}
-PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
-PODS_ROOT = ${SRCROOT}
-PODS_TARGET_SRCROOT = ${PODS_ROOT}/InputBarAccessoryView
-PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
-PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
-SKIP_INSTALL = YES
-USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES

+ 0 - 6
Pods/Target Support Files/InputBarAccessoryView/InputBarAccessoryView.modulemap

@@ -1,6 +0,0 @@
-framework module InputBarAccessoryView {
-  umbrella header "InputBarAccessoryView-umbrella.h"
-
-  export *
-  module * { export * }
-}

+ 0 - 14
Pods/Target Support Files/InputBarAccessoryView/InputBarAccessoryView.release.xcconfig

@@ -1,14 +0,0 @@
-CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
-CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/InputBarAccessoryView
-GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
-LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
-OTHER_LDFLAGS = $(inherited) -framework "UIKit"
-OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS -suppress-warnings
-PODS_BUILD_DIR = ${BUILD_DIR}
-PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
-PODS_ROOT = ${SRCROOT}
-PODS_TARGET_SRCROOT = ${PODS_ROOT}/InputBarAccessoryView
-PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
-PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
-SKIP_INSTALL = YES
-USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES

+ 0 - 11
Pods/Target Support Files/InputBarAccessoryView/InputBarAccessoryView.xcconfig

@@ -1,11 +0,0 @@
-CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/InputBarAccessoryView
-GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
-OTHER_LDFLAGS = $(inherited) -framework "UIKit"
-OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS -suppress-warnings
-PODS_BUILD_DIR = ${BUILD_DIR}
-PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
-PODS_ROOT = ${SRCROOT}
-PODS_TARGET_SRCROOT = ${PODS_ROOT}/InputBarAccessoryView
-PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
-SKIP_INSTALL = YES
-USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES

+ 0 - 26
Pods/Target Support Files/Pods-deltachat-ios/Pods-deltachat-ios-acknowledgements.markdown

@@ -42,32 +42,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 THE SOFTWARE.
 
 
-## InputBarAccessoryView
-
-
-The MIT License (MIT)
-
-Copyright (c) Nathan Tannar <nathantannar4@gmail.com> 2017-2019
-
-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.
-
-
 ## ReachabilitySwift
 
 Copyright (c) 2016 Ashley Mills

+ 0 - 32
Pods/Target Support Files/Pods-deltachat-ios/Pods-deltachat-ios-acknowledgements.plist

@@ -65,38 +65,6 @@ THE SOFTWARE.
 			<key>Type</key>
 			<string>PSGroupSpecifier</string>
 		</dict>
-		<dict>
-			<key>FooterText</key>
-			<string>
-The MIT License (MIT)
-
-Copyright (c) Nathan Tannar &lt;nathantannar4@gmail.com&gt; 2017-2019
-
-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.
-</string>
-			<key>License</key>
-			<string>MIT</string>
-			<key>Title</key>
-			<string>InputBarAccessoryView</string>
-			<key>Type</key>
-			<string>PSGroupSpecifier</string>
-		</dict>
 		<dict>
 			<key>FooterText</key>
 			<string>Copyright (c) 2016 Ashley Mills

+ 0 - 2
Pods/Target Support Files/Pods-deltachat-ios/Pods-deltachat-ios-frameworks.sh

@@ -178,7 +178,6 @@ code_sign_if_enabled() {
 if [[ "$CONFIGURATION" == "Debug" ]]; then
   install_framework "${BUILT_PRODUCTS_DIR}/CocoaLumberjack/CocoaLumberjack.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/DBDebugToolkit/DBDebugToolkit.framework"
-  install_framework "${BUILT_PRODUCTS_DIR}/InputBarAccessoryView/InputBarAccessoryView.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/ReachabilitySwift/Reachability.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/SCSiriWaveformView/SCSiriWaveformView.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/SDWebImage/SDWebImage.framework"
@@ -191,7 +190,6 @@ fi
 if [[ "$CONFIGURATION" == "Release" ]]; then
   install_framework "${BUILT_PRODUCTS_DIR}/CocoaLumberjack/CocoaLumberjack.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/DBDebugToolkit/DBDebugToolkit.framework"
-  install_framework "${BUILT_PRODUCTS_DIR}/InputBarAccessoryView/InputBarAccessoryView.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/ReachabilitySwift/Reachability.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/SCSiriWaveformView/SCSiriWaveformView.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/SDWebImage/SDWebImage.framework"

+ 4 - 4
Pods/Target Support Files/Pods-deltachat-ios/Pods-deltachat-ios.debug.xcconfig

@@ -1,12 +1,12 @@
 ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES
 CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
-FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/CocoaLumberjack" "${PODS_CONFIGURATION_BUILD_DIR}/DBDebugToolkit" "${PODS_CONFIGURATION_BUILD_DIR}/InputBarAccessoryView" "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift" "${PODS_CONFIGURATION_BUILD_DIR}/SCSiriWaveformView" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageSVGKitPlugin" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageWebPCoder" "${PODS_CONFIGURATION_BUILD_DIR}/SVGKit" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyBeaver" "${PODS_CONFIGURATION_BUILD_DIR}/libwebp"
+FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/CocoaLumberjack" "${PODS_CONFIGURATION_BUILD_DIR}/DBDebugToolkit" "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift" "${PODS_CONFIGURATION_BUILD_DIR}/SCSiriWaveformView" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageSVGKitPlugin" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageWebPCoder" "${PODS_CONFIGURATION_BUILD_DIR}/SVGKit" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyBeaver" "${PODS_CONFIGURATION_BUILD_DIR}/libwebp"
 GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 $(inherited) SD_WEBP=1
-HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/CocoaLumberjack/CocoaLumberjack.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/DBDebugToolkit/DBDebugToolkit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/InputBarAccessoryView/InputBarAccessoryView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift/Reachability.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SCSiriWaveformView/SCSiriWaveformView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageSVGKitPlugin/SDWebImageSVGKitPlugin.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageWebPCoder/SDWebImageWebPCoder.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SVGKit/SVGKit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyBeaver/SwiftyBeaver.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/libwebp/libwebp.framework/Headers"
+HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/CocoaLumberjack/CocoaLumberjack.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/DBDebugToolkit/DBDebugToolkit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift/Reachability.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SCSiriWaveformView/SCSiriWaveformView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageSVGKitPlugin/SDWebImageSVGKitPlugin.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageWebPCoder/SDWebImageWebPCoder.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SVGKit/SVGKit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyBeaver/SwiftyBeaver.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/libwebp/libwebp.framework/Headers"
 LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks'
 LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
-OTHER_CFLAGS = $(inherited) -isystem "${PODS_CONFIGURATION_BUILD_DIR}/CocoaLumberjack/CocoaLumberjack.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/DBDebugToolkit/DBDebugToolkit.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/InputBarAccessoryView/InputBarAccessoryView.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift/Reachability.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/SCSiriWaveformView/SCSiriWaveformView.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageSVGKitPlugin/SDWebImageSVGKitPlugin.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageWebPCoder/SDWebImageWebPCoder.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/SVGKit/SVGKit.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyBeaver/SwiftyBeaver.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/libwebp/libwebp.framework/Headers" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/CocoaLumberjack" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/DBDebugToolkit" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/InputBarAccessoryView" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/SCSiriWaveformView" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageSVGKitPlugin" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageWebPCoder" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/SVGKit" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyBeaver" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/libwebp"
-OTHER_LDFLAGS = $(inherited) -l"xml2" -framework "AVFoundation" -framework "CocoaLumberjack" -framework "CoreGraphics" -framework "CoreTelephony" -framework "CoreText" -framework "DBDebugToolkit" -framework "Foundation" -framework "ImageIO" -framework "InputBarAccessoryView" -framework "QuartzCore" -framework "Reachability" -framework "SCSiriWaveformView" -framework "SDWebImage" -framework "SDWebImageSVGKitPlugin" -framework "SDWebImageWebPCoder" -framework "SVGKit" -framework "SwiftyBeaver" -framework "SystemConfiguration" -framework "UIKit" -framework "libwebp"
+OTHER_CFLAGS = $(inherited) -isystem "${PODS_CONFIGURATION_BUILD_DIR}/CocoaLumberjack/CocoaLumberjack.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/DBDebugToolkit/DBDebugToolkit.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift/Reachability.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/SCSiriWaveformView/SCSiriWaveformView.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageSVGKitPlugin/SDWebImageSVGKitPlugin.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageWebPCoder/SDWebImageWebPCoder.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/SVGKit/SVGKit.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyBeaver/SwiftyBeaver.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/libwebp/libwebp.framework/Headers" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/CocoaLumberjack" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/DBDebugToolkit" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/SCSiriWaveformView" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageSVGKitPlugin" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageWebPCoder" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/SVGKit" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyBeaver" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/libwebp"
+OTHER_LDFLAGS = $(inherited) -l"xml2" -framework "AVFoundation" -framework "CocoaLumberjack" -framework "CoreGraphics" -framework "CoreTelephony" -framework "CoreText" -framework "DBDebugToolkit" -framework "Foundation" -framework "ImageIO" -framework "QuartzCore" -framework "Reachability" -framework "SCSiriWaveformView" -framework "SDWebImage" -framework "SDWebImageSVGKitPlugin" -framework "SDWebImageWebPCoder" -framework "SVGKit" -framework "SwiftyBeaver" -framework "SystemConfiguration" -framework "UIKit" -framework "libwebp"
 OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
 PODS_BUILD_DIR = ${BUILD_DIR}
 PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)

+ 4 - 4
Pods/Target Support Files/Pods-deltachat-ios/Pods-deltachat-ios.release.xcconfig

@@ -1,12 +1,12 @@
 ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES
 CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
-FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/CocoaLumberjack" "${PODS_CONFIGURATION_BUILD_DIR}/DBDebugToolkit" "${PODS_CONFIGURATION_BUILD_DIR}/InputBarAccessoryView" "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift" "${PODS_CONFIGURATION_BUILD_DIR}/SCSiriWaveformView" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageSVGKitPlugin" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageWebPCoder" "${PODS_CONFIGURATION_BUILD_DIR}/SVGKit" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyBeaver" "${PODS_CONFIGURATION_BUILD_DIR}/libwebp"
+FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/CocoaLumberjack" "${PODS_CONFIGURATION_BUILD_DIR}/DBDebugToolkit" "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift" "${PODS_CONFIGURATION_BUILD_DIR}/SCSiriWaveformView" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageSVGKitPlugin" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageWebPCoder" "${PODS_CONFIGURATION_BUILD_DIR}/SVGKit" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyBeaver" "${PODS_CONFIGURATION_BUILD_DIR}/libwebp"
 GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 $(inherited) SD_WEBP=1
-HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/CocoaLumberjack/CocoaLumberjack.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/DBDebugToolkit/DBDebugToolkit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/InputBarAccessoryView/InputBarAccessoryView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift/Reachability.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SCSiriWaveformView/SCSiriWaveformView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageSVGKitPlugin/SDWebImageSVGKitPlugin.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageWebPCoder/SDWebImageWebPCoder.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SVGKit/SVGKit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyBeaver/SwiftyBeaver.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/libwebp/libwebp.framework/Headers"
+HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/CocoaLumberjack/CocoaLumberjack.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/DBDebugToolkit/DBDebugToolkit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift/Reachability.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SCSiriWaveformView/SCSiriWaveformView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageSVGKitPlugin/SDWebImageSVGKitPlugin.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageWebPCoder/SDWebImageWebPCoder.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SVGKit/SVGKit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyBeaver/SwiftyBeaver.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/libwebp/libwebp.framework/Headers"
 LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks'
 LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
-OTHER_CFLAGS = $(inherited) -isystem "${PODS_CONFIGURATION_BUILD_DIR}/CocoaLumberjack/CocoaLumberjack.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/DBDebugToolkit/DBDebugToolkit.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/InputBarAccessoryView/InputBarAccessoryView.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift/Reachability.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/SCSiriWaveformView/SCSiriWaveformView.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageSVGKitPlugin/SDWebImageSVGKitPlugin.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageWebPCoder/SDWebImageWebPCoder.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/SVGKit/SVGKit.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyBeaver/SwiftyBeaver.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/libwebp/libwebp.framework/Headers" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/CocoaLumberjack" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/DBDebugToolkit" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/InputBarAccessoryView" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/SCSiriWaveformView" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageSVGKitPlugin" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageWebPCoder" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/SVGKit" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyBeaver" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/libwebp"
-OTHER_LDFLAGS = $(inherited) -l"xml2" -framework "AVFoundation" -framework "CocoaLumberjack" -framework "CoreGraphics" -framework "CoreTelephony" -framework "CoreText" -framework "DBDebugToolkit" -framework "Foundation" -framework "ImageIO" -framework "InputBarAccessoryView" -framework "QuartzCore" -framework "Reachability" -framework "SCSiriWaveformView" -framework "SDWebImage" -framework "SDWebImageSVGKitPlugin" -framework "SDWebImageWebPCoder" -framework "SVGKit" -framework "SwiftyBeaver" -framework "SystemConfiguration" -framework "UIKit" -framework "libwebp"
+OTHER_CFLAGS = $(inherited) -isystem "${PODS_CONFIGURATION_BUILD_DIR}/CocoaLumberjack/CocoaLumberjack.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/DBDebugToolkit/DBDebugToolkit.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift/Reachability.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/SCSiriWaveformView/SCSiriWaveformView.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageSVGKitPlugin/SDWebImageSVGKitPlugin.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageWebPCoder/SDWebImageWebPCoder.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/SVGKit/SVGKit.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyBeaver/SwiftyBeaver.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/libwebp/libwebp.framework/Headers" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/CocoaLumberjack" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/DBDebugToolkit" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/SCSiriWaveformView" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageSVGKitPlugin" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageWebPCoder" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/SVGKit" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyBeaver" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/libwebp"
+OTHER_LDFLAGS = $(inherited) -l"xml2" -framework "AVFoundation" -framework "CocoaLumberjack" -framework "CoreGraphics" -framework "CoreTelephony" -framework "CoreText" -framework "DBDebugToolkit" -framework "Foundation" -framework "ImageIO" -framework "QuartzCore" -framework "Reachability" -framework "SCSiriWaveformView" -framework "SDWebImage" -framework "SDWebImageSVGKitPlugin" -framework "SDWebImageWebPCoder" -framework "SVGKit" -framework "SwiftyBeaver" -framework "SystemConfiguration" -framework "UIKit" -framework "libwebp"
 OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
 PODS_BUILD_DIR = ${BUILD_DIR}
 PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)

+ 3 - 3
Pods/Target Support Files/Pods-deltachat-iosTests/Pods-deltachat-iosTests.debug.xcconfig

@@ -1,8 +1,8 @@
 CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
-FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/CocoaLumberjack" "${PODS_CONFIGURATION_BUILD_DIR}/DBDebugToolkit" "${PODS_CONFIGURATION_BUILD_DIR}/InputBarAccessoryView" "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift" "${PODS_CONFIGURATION_BUILD_DIR}/SCSiriWaveformView" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageSVGKitPlugin" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageWebPCoder" "${PODS_CONFIGURATION_BUILD_DIR}/SVGKit" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyBeaver" "${PODS_CONFIGURATION_BUILD_DIR}/libwebp"
+FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/CocoaLumberjack" "${PODS_CONFIGURATION_BUILD_DIR}/DBDebugToolkit" "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift" "${PODS_CONFIGURATION_BUILD_DIR}/SCSiriWaveformView" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageSVGKitPlugin" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageWebPCoder" "${PODS_CONFIGURATION_BUILD_DIR}/SVGKit" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyBeaver" "${PODS_CONFIGURATION_BUILD_DIR}/libwebp"
 GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 $(inherited) SD_WEBP=1
-HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/CocoaLumberjack/CocoaLumberjack.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/DBDebugToolkit/DBDebugToolkit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/InputBarAccessoryView/InputBarAccessoryView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift/Reachability.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SCSiriWaveformView/SCSiriWaveformView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageSVGKitPlugin/SDWebImageSVGKitPlugin.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageWebPCoder/SDWebImageWebPCoder.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SVGKit/SVGKit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyBeaver/SwiftyBeaver.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/libwebp/libwebp.framework/Headers"
-OTHER_LDFLAGS = $(inherited) -l"xml2" -framework "AVFoundation" -framework "CocoaLumberjack" -framework "CoreGraphics" -framework "CoreTelephony" -framework "CoreText" -framework "DBDebugToolkit" -framework "Foundation" -framework "ImageIO" -framework "InputBarAccessoryView" -framework "QuartzCore" -framework "Reachability" -framework "SCSiriWaveformView" -framework "SDWebImage" -framework "SDWebImageSVGKitPlugin" -framework "SDWebImageWebPCoder" -framework "SVGKit" -framework "SwiftyBeaver" -framework "SystemConfiguration" -framework "UIKit" -framework "libwebp"
+HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/CocoaLumberjack/CocoaLumberjack.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/DBDebugToolkit/DBDebugToolkit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift/Reachability.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SCSiriWaveformView/SCSiriWaveformView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageSVGKitPlugin/SDWebImageSVGKitPlugin.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageWebPCoder/SDWebImageWebPCoder.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SVGKit/SVGKit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyBeaver/SwiftyBeaver.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/libwebp/libwebp.framework/Headers"
+OTHER_LDFLAGS = $(inherited) -l"xml2" -framework "AVFoundation" -framework "CocoaLumberjack" -framework "CoreGraphics" -framework "CoreTelephony" -framework "CoreText" -framework "DBDebugToolkit" -framework "Foundation" -framework "ImageIO" -framework "QuartzCore" -framework "Reachability" -framework "SCSiriWaveformView" -framework "SDWebImage" -framework "SDWebImageSVGKitPlugin" -framework "SDWebImageWebPCoder" -framework "SVGKit" -framework "SwiftyBeaver" -framework "SystemConfiguration" -framework "UIKit" -framework "libwebp"
 PODS_BUILD_DIR = ${BUILD_DIR}
 PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
 PODS_PODFILE_DIR_PATH = ${SRCROOT}/.

+ 3 - 3
Pods/Target Support Files/Pods-deltachat-iosTests/Pods-deltachat-iosTests.release.xcconfig

@@ -1,8 +1,8 @@
 CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
-FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/CocoaLumberjack" "${PODS_CONFIGURATION_BUILD_DIR}/DBDebugToolkit" "${PODS_CONFIGURATION_BUILD_DIR}/InputBarAccessoryView" "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift" "${PODS_CONFIGURATION_BUILD_DIR}/SCSiriWaveformView" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageSVGKitPlugin" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageWebPCoder" "${PODS_CONFIGURATION_BUILD_DIR}/SVGKit" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyBeaver" "${PODS_CONFIGURATION_BUILD_DIR}/libwebp"
+FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/CocoaLumberjack" "${PODS_CONFIGURATION_BUILD_DIR}/DBDebugToolkit" "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift" "${PODS_CONFIGURATION_BUILD_DIR}/SCSiriWaveformView" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageSVGKitPlugin" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageWebPCoder" "${PODS_CONFIGURATION_BUILD_DIR}/SVGKit" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyBeaver" "${PODS_CONFIGURATION_BUILD_DIR}/libwebp"
 GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 $(inherited) SD_WEBP=1
-HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/CocoaLumberjack/CocoaLumberjack.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/DBDebugToolkit/DBDebugToolkit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/InputBarAccessoryView/InputBarAccessoryView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift/Reachability.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SCSiriWaveformView/SCSiriWaveformView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageSVGKitPlugin/SDWebImageSVGKitPlugin.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageWebPCoder/SDWebImageWebPCoder.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SVGKit/SVGKit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyBeaver/SwiftyBeaver.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/libwebp/libwebp.framework/Headers"
-OTHER_LDFLAGS = $(inherited) -l"xml2" -framework "AVFoundation" -framework "CocoaLumberjack" -framework "CoreGraphics" -framework "CoreTelephony" -framework "CoreText" -framework "DBDebugToolkit" -framework "Foundation" -framework "ImageIO" -framework "InputBarAccessoryView" -framework "QuartzCore" -framework "Reachability" -framework "SCSiriWaveformView" -framework "SDWebImage" -framework "SDWebImageSVGKitPlugin" -framework "SDWebImageWebPCoder" -framework "SVGKit" -framework "SwiftyBeaver" -framework "SystemConfiguration" -framework "UIKit" -framework "libwebp"
+HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/CocoaLumberjack/CocoaLumberjack.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/DBDebugToolkit/DBDebugToolkit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift/Reachability.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SCSiriWaveformView/SCSiriWaveformView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageSVGKitPlugin/SDWebImageSVGKitPlugin.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageWebPCoder/SDWebImageWebPCoder.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SVGKit/SVGKit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyBeaver/SwiftyBeaver.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/libwebp/libwebp.framework/Headers"
+OTHER_LDFLAGS = $(inherited) -l"xml2" -framework "AVFoundation" -framework "CocoaLumberjack" -framework "CoreGraphics" -framework "CoreTelephony" -framework "CoreText" -framework "DBDebugToolkit" -framework "Foundation" -framework "ImageIO" -framework "QuartzCore" -framework "Reachability" -framework "SCSiriWaveformView" -framework "SDWebImage" -framework "SDWebImageSVGKitPlugin" -framework "SDWebImageWebPCoder" -framework "SVGKit" -framework "SwiftyBeaver" -framework "SystemConfiguration" -framework "UIKit" -framework "libwebp"
 PODS_BUILD_DIR = ${BUILD_DIR}
 PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
 PODS_PODFILE_DIR_PATH = ${SRCROOT}/.

+ 124 - 6
deltachat-ios.xcodeproj/project.pbxproj

@@ -38,7 +38,6 @@
 		303492AD2577CAC300A523D0 /* FileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 303492AC2577CAC300A523D0 /* FileView.swift */; };
 		303492B32577E40700A523D0 /* DocumentPreview.swift in Sources */ = {isa = PBXBuildFile; fileRef = 303492B22577E40700A523D0 /* DocumentPreview.swift */; };
 		303492CB257A814200A523D0 /* DraftArea.swift in Sources */ = {isa = PBXBuildFile; fileRef = 303492CA257A814200A523D0 /* DraftArea.swift */; };
-		303492CF2587C2DC00A523D0 /* ChatInputBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 303492CE2587C2DC00A523D0 /* ChatInputBar.swift */; };
 		304219D3243F588500516852 /* DcCore.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 304219D1243F588500516852 /* DcCore.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
 		304219D92440734A00516852 /* DcMsg+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 304219D82440734A00516852 /* DcMsg+Extension.swift */; };
 		304F5E44244F571C00462538 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 7A9FB14A1FB061E2001FEA36 /* Assets.xcassets */; };
@@ -70,6 +69,25 @@
 		30734326249A280B00BF9AD1 /* MediaQualityController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30734325249A280B00BF9AD1 /* MediaQualityController.swift */; };
 		307A82CC25B8D26700748B57 /* ChatEditingBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 307A82CB25B8D26700748B57 /* ChatEditingBar.swift */; };
 		307D822E241669C7006D2490 /* LocationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 307D822D241669C7006D2490 /* LocationManager.swift */; };
+		3080A00F277DDA4C00E74565 /* InputBarAccessoryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3080A00E277DDA4C00E74565 /* InputBarAccessoryView.swift */; };
+		3080A013277DDABA00E74565 /* KeyboardNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3080A010277DDAB900E74565 /* KeyboardNotification.swift */; };
+		3080A014277DDABA00E74565 /* KeyboardManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3080A011277DDAB900E74565 /* KeyboardManager.swift */; };
+		3080A015277DDABA00E74565 /* KeyboardEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3080A012277DDAB900E74565 /* KeyboardEvent.swift */; };
+		3080A01B277DDB8A00E74565 /* InputPlugin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3080A018277DDB8900E74565 /* InputPlugin.swift */; };
+		3080A01C277DDB8A00E74565 /* InputBarAccessoryViewDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3080A019277DDB8A00E74565 /* InputBarAccessoryViewDelegate.swift */; };
+		3080A01D277DDB8A00E74565 /* InputItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3080A01A277DDB8A00E74565 /* InputItem.swift */; };
+		3080A021277DE09900E74565 /* InputStackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3080A01E277DE09800E74565 /* InputStackView.swift */; };
+		3080A022277DE09900E74565 /* InputTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3080A01F277DE09800E74565 /* InputTextView.swift */; };
+		3080A023277DE09900E74565 /* SeparatorLine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3080A020277DE09900E74565 /* SeparatorLine.swift */; };
+		3080A027277DE12D00E74565 /* InputBarButtonItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3080A025277DE12D00E74565 /* InputBarButtonItem.swift */; };
+		3080A028277DE12D00E74565 /* InputBarSendButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3080A026277DE12D00E74565 /* InputBarSendButton.swift */; };
+		3080A02C277DE26000E74565 /* NSConstraintLayoutSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3080A02A277DE26000E74565 /* NSConstraintLayoutSet.swift */; };
+		3080A02D277DE26000E74565 /* HorizontalEdgePadding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3080A02B277DE26000E74565 /* HorizontalEdgePadding.swift */; };
+		3080A034277DE30100E74565 /* NSNotification+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3080A02F277DE2FF00E74565 /* NSNotification+Extensions.swift */; };
+		3080A035277DE30100E74565 /* String+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3080A030277DE2FF00E74565 /* String+Extensions.swift */; };
+		3080A036277DE30100E74565 /* NSMutableAttributedString+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3080A031277DE30000E74565 /* NSMutableAttributedString+Extensions.swift */; };
+		3080A037277DE30100E74565 /* UITextView+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3080A032277DE30000E74565 /* UITextView+Extensions.swift */; };
+		3080A038277DE30100E74565 /* UIView+AutoLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3080A033277DE30100E74565 /* UIView+AutoLayout.swift */; };
 		30860EE926F49E64002651A6 /* DownloadOnDemandViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30860EE826F49E64002651A6 /* DownloadOnDemandViewController.swift */; };
 		3095A351237DD1F700AB07F7 /* MediaPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3095A350237DD1F700AB07F7 /* MediaPicker.swift */; };
 		30A4149724F6EFBE00EC91EB /* InfoMessageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30A4149624F6EFBE00EC91EB /* InfoMessageCell.swift */; };
@@ -260,7 +278,6 @@
 		303492AC2577CAC300A523D0 /* FileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileView.swift; sourceTree = "<group>"; };
 		303492B22577E40700A523D0 /* DocumentPreview.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DocumentPreview.swift; sourceTree = "<group>"; };
 		303492CA257A814200A523D0 /* DraftArea.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DraftArea.swift; sourceTree = "<group>"; };
-		303492CE2587C2DC00A523D0 /* ChatInputBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatInputBar.swift; sourceTree = "<group>"; };
 		304219D1243F588500516852 /* DcCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = DcCore.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		304219D82440734A00516852 /* DcMsg+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DcMsg+Extension.swift"; sourceTree = "<group>"; };
 		304F769425DD237B0094B5E2 /* WebViewViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebViewViewController.swift; sourceTree = "<group>"; };
@@ -325,6 +342,25 @@
 		30734325249A280B00BF9AD1 /* MediaQualityController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MediaQualityController.swift; sourceTree = "<group>"; };
 		307A82CB25B8D26700748B57 /* ChatEditingBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatEditingBar.swift; sourceTree = "<group>"; };
 		307D822D241669C7006D2490 /* LocationManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationManager.swift; sourceTree = "<group>"; };
+		3080A00E277DDA4C00E74565 /* InputBarAccessoryView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InputBarAccessoryView.swift; sourceTree = "<group>"; };
+		3080A010277DDAB900E74565 /* KeyboardNotification.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KeyboardNotification.swift; sourceTree = "<group>"; };
+		3080A011277DDAB900E74565 /* KeyboardManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KeyboardManager.swift; sourceTree = "<group>"; };
+		3080A012277DDAB900E74565 /* KeyboardEvent.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KeyboardEvent.swift; sourceTree = "<group>"; };
+		3080A018277DDB8900E74565 /* InputPlugin.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InputPlugin.swift; sourceTree = "<group>"; };
+		3080A019277DDB8A00E74565 /* InputBarAccessoryViewDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InputBarAccessoryViewDelegate.swift; sourceTree = "<group>"; };
+		3080A01A277DDB8A00E74565 /* InputItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InputItem.swift; sourceTree = "<group>"; };
+		3080A01E277DE09800E74565 /* InputStackView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InputStackView.swift; sourceTree = "<group>"; };
+		3080A01F277DE09800E74565 /* InputTextView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InputTextView.swift; sourceTree = "<group>"; };
+		3080A020277DE09900E74565 /* SeparatorLine.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SeparatorLine.swift; sourceTree = "<group>"; };
+		3080A025277DE12D00E74565 /* InputBarButtonItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InputBarButtonItem.swift; sourceTree = "<group>"; };
+		3080A026277DE12D00E74565 /* InputBarSendButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InputBarSendButton.swift; sourceTree = "<group>"; };
+		3080A02A277DE26000E74565 /* NSConstraintLayoutSet.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NSConstraintLayoutSet.swift; sourceTree = "<group>"; };
+		3080A02B277DE26000E74565 /* HorizontalEdgePadding.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HorizontalEdgePadding.swift; sourceTree = "<group>"; };
+		3080A02F277DE2FF00E74565 /* NSNotification+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSNotification+Extensions.swift"; sourceTree = "<group>"; };
+		3080A030277DE2FF00E74565 /* String+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "String+Extensions.swift"; sourceTree = "<group>"; };
+		3080A031277DE30000E74565 /* NSMutableAttributedString+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSMutableAttributedString+Extensions.swift"; sourceTree = "<group>"; };
+		3080A032277DE30000E74565 /* UITextView+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UITextView+Extensions.swift"; sourceTree = "<group>"; };
+		3080A033277DE30100E74565 /* UIView+AutoLayout.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIView+AutoLayout.swift"; sourceTree = "<group>"; };
 		30860EE826F49E64002651A6 /* DownloadOnDemandViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DownloadOnDemandViewController.swift; sourceTree = "<group>"; };
 		3095A350237DD1F700AB07F7 /* MediaPicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MediaPicker.swift; sourceTree = "<group>"; };
 		30A4149624F6EFBE00EC91EB /* InfoMessageCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InfoMessageCell.swift; sourceTree = "<group>"; };
@@ -584,6 +620,72 @@
 			path = Extensions;
 			sourceTree = "<group>";
 		};
+		3080A00D277DDA1400E74565 /* InputBarAccessoryView */ = {
+			isa = PBXGroup;
+			children = (
+				3080A02E277DE2DD00E74565 /* Extensions */,
+				3080A029277DE21300E74565 /* Models */,
+				3080A024277DE10E00E74565 /* Controls */,
+				3080A016277DDABF00E74565 /* KeyboardManager */,
+				3080A017277DDB6000E74565 /* Protocols */,
+				3080A01E277DE09800E74565 /* InputStackView.swift */,
+				3080A01F277DE09800E74565 /* InputTextView.swift */,
+				3080A020277DE09900E74565 /* SeparatorLine.swift */,
+				3080A00E277DDA4C00E74565 /* InputBarAccessoryView.swift */,
+			);
+			path = InputBarAccessoryView;
+			sourceTree = "<group>";
+		};
+		3080A016277DDABF00E74565 /* KeyboardManager */ = {
+			isa = PBXGroup;
+			children = (
+				3080A012277DDAB900E74565 /* KeyboardEvent.swift */,
+				3080A011277DDAB900E74565 /* KeyboardManager.swift */,
+				3080A010277DDAB900E74565 /* KeyboardNotification.swift */,
+			);
+			path = KeyboardManager;
+			sourceTree = "<group>";
+		};
+		3080A017277DDB6000E74565 /* Protocols */ = {
+			isa = PBXGroup;
+			children = (
+				3080A019277DDB8A00E74565 /* InputBarAccessoryViewDelegate.swift */,
+				3080A01A277DDB8A00E74565 /* InputItem.swift */,
+				3080A018277DDB8900E74565 /* InputPlugin.swift */,
+			);
+			path = Protocols;
+			sourceTree = "<group>";
+		};
+		3080A024277DE10E00E74565 /* Controls */ = {
+			isa = PBXGroup;
+			children = (
+				3080A025277DE12D00E74565 /* InputBarButtonItem.swift */,
+				3080A026277DE12D00E74565 /* InputBarSendButton.swift */,
+			);
+			path = Controls;
+			sourceTree = "<group>";
+		};
+		3080A029277DE21300E74565 /* Models */ = {
+			isa = PBXGroup;
+			children = (
+				3080A02B277DE26000E74565 /* HorizontalEdgePadding.swift */,
+				3080A02A277DE26000E74565 /* NSConstraintLayoutSet.swift */,
+			);
+			path = Models;
+			sourceTree = "<group>";
+		};
+		3080A02E277DE2DD00E74565 /* Extensions */ = {
+			isa = PBXGroup;
+			children = (
+				3080A031277DE30000E74565 /* NSMutableAttributedString+Extensions.swift */,
+				3080A02F277DE2FF00E74565 /* NSNotification+Extensions.swift */,
+				3080A030277DE2FF00E74565 /* String+Extensions.swift */,
+				3080A032277DE30000E74565 /* UITextView+Extensions.swift */,
+				3080A033277DE30100E74565 /* UIView+AutoLayout.swift */,
+			);
+			path = Extensions;
+			sourceTree = "<group>";
+		};
 		30E8F2112447285600CE2C90 /* DcShare */ = {
 			isa = PBXGroup;
 			children = (
@@ -603,6 +705,7 @@
 			children = (
 				3008CB7524F95B6D00E6A617 /* AudioController.swift */,
 				30FDB6F824D1C1000066C48D /* ChatViewController.swift */,
+				3080A00D277DDA1400E74565 /* InputBarAccessoryView */,
 				30FDB6B524D193DD0066C48D /* Views */,
 				303492942565AABC00A523D0 /* DraftModel.swift */,
 			);
@@ -614,7 +717,6 @@
 			children = (
 				30FDB6B624D193DD0066C48D /* Cells */,
 				30E348DE24F3F819005C93D1 /* ChatTableView.swift */,
-				303492CE2587C2DC00A523D0 /* ChatInputBar.swift */,
 				3067AA4B2666310E00525036 /* ChatInputTextView.swift */,
 				307A82CB25B8D26700748B57 /* ChatEditingBar.swift */,
 				30C2BFFD27032375005505DA /* ChatSearchAccessoryBar.swift */,
@@ -1112,7 +1214,6 @@
 				"${PODS_ROOT}/Target Support Files/Pods-deltachat-ios/Pods-deltachat-ios-frameworks.sh",
 				"${BUILT_PRODUCTS_DIR}/CocoaLumberjack/CocoaLumberjack.framework",
 				"${BUILT_PRODUCTS_DIR}/DBDebugToolkit/DBDebugToolkit.framework",
-				"${BUILT_PRODUCTS_DIR}/InputBarAccessoryView/InputBarAccessoryView.framework",
 				"${BUILT_PRODUCTS_DIR}/ReachabilitySwift/Reachability.framework",
 				"${BUILT_PRODUCTS_DIR}/SCSiriWaveformView/SCSiriWaveformView.framework",
 				"${BUILT_PRODUCTS_DIR}/SDWebImage/SDWebImage.framework",
@@ -1126,7 +1227,6 @@
 			outputPaths = (
 				"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CocoaLumberjack.framework",
 				"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/DBDebugToolkit.framework",
-				"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/InputBarAccessoryView.framework",
 				"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Reachability.framework",
 				"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SCSiriWaveformView.framework",
 				"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SDWebImage.framework",
@@ -1290,19 +1390,24 @@
 				AED423D7249F580700B6B2BB /* BlockedContactsViewController.swift in Sources */,
 				303492B32577E40700A523D0 /* DocumentPreview.swift in Sources */,
 				3008CB7424F9436C00E6A617 /* AudioPlayerView.swift in Sources */,
+				3080A01D277DDB8A00E74565 /* InputItem.swift in Sources */,
 				AED62BCE247687E6009E220D /* LocationStreamingIndicator.swift in Sources */,
 				30AAD71B2762869600DE3DC1 /* SelectableCell.swift in Sources */,
 				AE9DAF0F22C278C6004C9591 /* ChatTitleView.swift in Sources */,
 				AE4AEE3522B1030D000AA495 /* PreviewController.swift in Sources */,
 				7070FB9B2101ECBB000DC258 /* NewGroupController.swift in Sources */,
+				3080A037277DE30100E74565 /* UITextView+Extensions.swift in Sources */,
+				3080A027277DE12D00E74565 /* InputBarButtonItem.swift in Sources */,
 				AE57C084255310BB003CFE70 /* ContextMenuController.swift in Sources */,
 				304219D92440734A00516852 /* DcMsg+Extension.swift in Sources */,
-				303492CF2587C2DC00A523D0 /* ChatInputBar.swift in Sources */,
 				AE52EA19229EB53C00C586C9 /* ContactDetailHeader.swift in Sources */,
 				78E45E4421D3F14A00D4B15E /* UIImage+Extension.swift in Sources */,
+				3080A022277DE09900E74565 /* InputTextView.swift in Sources */,
 				30734326249A280B00BF9AD1 /* MediaQualityController.swift in Sources */,
+				3080A01C277DDB8A00E74565 /* InputBarAccessoryViewDelegate.swift in Sources */,
 				AE6EC5282497B9B200A400E4 /* ThumbnailCache.swift in Sources */,
 				30FDB70524D1C1000066C48D /* ChatViewController.swift in Sources */,
+				3080A013277DDABA00E74565 /* KeyboardNotification.swift in Sources */,
 				AE52EA20229EB9F000C586C9 /* EditGroupViewController.swift in Sources */,
 				AE18F294228C602A0007B1BE /* SecuritySettingsController.swift in Sources */,
 				30C2BFFE27032375005505DA /* ChatSearchAccessoryBar.swift in Sources */,
@@ -1323,6 +1428,7 @@
 				30A4149724F6EFBE00EC91EB /* InfoMessageCell.swift in Sources */,
 				302B84C6239676F0001C261F /* AvatarHelper.swift in Sources */,
 				AE77838D23E32ED20093EABD /* ContactDetailViewModel.swift in Sources */,
+				3080A02D277DE26000E74565 /* HorizontalEdgePadding.swift in Sources */,
 				30DAF71C275901610073C154 /* SettingsBackgroundSelectionController.swift in Sources */,
 				3010968926838A050032CBA0 /* VideoInviteCell.swift in Sources */,
 				303492CB257A814200A523D0 /* DraftArea.swift in Sources */,
@@ -1331,9 +1437,11 @@
 				AEE700252438E0E500D6992E /* ProgressAlertHandler.swift in Sources */,
 				30E348E524F6647D005C93D1 /* FileTextCell.swift in Sources */,
 				306C32322445CDE9001D89F3 /* DcLogger.swift in Sources */,
+				3080A036277DE30100E74565 /* NSMutableAttributedString+Extensions.swift in Sources */,
 				307A82CC25B8D26700748B57 /* ChatEditingBar.swift in Sources */,
 				303492952565AABC00A523D0 /* DraftModel.swift in Sources */,
 				78E45E3A21D3CFBC00D4B15E /* SettingsController.swift in Sources */,
+				3080A021277DE09900E74565 /* InputStackView.swift in Sources */,
 				AE8519EA2272FDCA00ED86F0 /* DeviceContactsHandler.swift in Sources */,
 				302E592426A5CF4800DD4F58 /* ConnectivityViewController.swift in Sources */,
 				78ED838321D5379000243125 /* TextFieldCell.swift in Sources */,
@@ -1346,6 +1454,7 @@
 				7A0052C81FBE6CB40048C3BF /* NewContactController.swift in Sources */,
 				30860EE926F49E64002651A6 /* DownloadOnDemandViewController.swift in Sources */,
 				AEE56D762253431E007DC082 /* AccountSetupController.swift in Sources */,
+				3080A015277DDABA00E74565 /* KeyboardEvent.swift in Sources */,
 				AE8F503524753DFE007FEE0B /* GalleryViewController.swift in Sources */,
 				B2C42570265C325C00B95377 /* MultilineLabelCell.swift in Sources */,
 				AEF53BD5248904BF00D309C1 /* GalleryTimeLabel.swift in Sources */,
@@ -1356,6 +1465,7 @@
 				30EF7308252F6A3300E2C54A /* PaddingTextView.swift in Sources */,
 				30E348E124F53772005C93D1 /* ImageTextCell.swift in Sources */,
 				3008CB7624F95B6D00E6A617 /* AudioController.swift in Sources */,
+				3080A035277DE30100E74565 /* String+Extensions.swift in Sources */,
 				302B84CE2397F6CD001C261F /* URL+Extension.swift in Sources */,
 				7A9FB1441FB061E2001FEA36 /* AppDelegate.swift in Sources */,
 				3034929F25752FC800A523D0 /* MediaPreview.swift in Sources */,
@@ -1366,6 +1476,7 @@
 				303492A5257546B400A523D0 /* DraftPreview.swift in Sources */,
 				305961D02346125100C80F33 /* NSAttributedString+Extensions.swift in Sources */,
 				21D6C941260623F500D0755A /* NotificationManager.swift in Sources */,
+				3080A023277DE09900E74565 /* SeparatorLine.swift in Sources */,
 				302B84C72396770B001C261F /* RelayHelper.swift in Sources */,
 				305961CF2346125100C80F33 /* UIColor+Extensions.swift in Sources */,
 				AEACE2E51FB32E1900DCDD78 /* Utils.swift in Sources */,
@@ -1373,12 +1484,16 @@
 				30349291256441E200A523D0 /* QuotePreview.swift in Sources */,
 				AEC67A1E241FCFE0007DDBE1 /* ChatListViewModel.swift in Sources */,
 				30FDB71F24D8170E0066C48D /* TextMessageCell.swift in Sources */,
+				3080A00F277DDA4C00E74565 /* InputBarAccessoryView.swift in Sources */,
 				AE1988A523EB2FBA00B4CD5F /* Errors.swift in Sources */,
 				302D5454268B84CB00A8B271 /* SettingsVideoChatViewController.swift in Sources */,
+				3080A014277DDABA00E74565 /* KeyboardManager.swift in Sources */,
 				AEFBE22F23FEF23D0045327A /* ProviderInfoCell.swift in Sources */,
 				AE6EC5242497663200A400E4 /* UIImageView+Extensions.swift in Sources */,
 				30F8817624DA97DA0023780E /* BackgroundContainer.swift in Sources */,
 				3067AA4C2666310E00525036 /* ChatInputTextView.swift in Sources */,
+				3080A02C277DE26000E74565 /* NSConstraintLayoutSet.swift in Sources */,
+				3080A038277DE30100E74565 /* UIView+AutoLayout.swift in Sources */,
 				30B0ACFA24AB5B99004D5E29 /* SettingsEphemeralMessageController.swift in Sources */,
 				B20462E42440A4A600367A57 /* SettingsAutodelOverviewController.swift in Sources */,
 				305962102346154D00C80F33 /* String+Extension.swift in Sources */,
@@ -1390,11 +1505,14 @@
 				305961CD2346125100C80F33 /* UIEdgeInsets+Extensions.swift in Sources */,
 				30EF7324252FF15F00E2C54A /* MessageLabel.swift in Sources */,
 				30C0D49D237C4908008E2A0E /* CertificateCheckController.swift in Sources */,
+				3080A034277DE30100E74565 /* NSNotification+Extensions.swift in Sources */,
+				3080A01B277DDB8A00E74565 /* InputPlugin.swift in Sources */,
 				304F769525DD237B0094B5E2 /* WebViewViewController.swift in Sources */,
 				7092474120B3869500AF8799 /* ContactDetailViewController.swift in Sources */,
 				30F9B9EC235F2116006E7ACF /* MessageCounter.swift in Sources */,
 				304F769925DD23D70094B5E2 /* FullMessageViewController.swift in Sources */,
 				AE0AA952247800E700D42A7F /* GalleryCell.swift in Sources */,
+				3080A028277DE12D00E74565 /* InputBarSendButton.swift in Sources */,
 				AE0AA958247834A400D42A7F /* Date+Extension.swift in Sources */,
 				307D822E241669C7006D2490 /* LocationManager.swift in Sources */,
 				AE851AD0227DF50900ED86F0 /* GroupChatDetailViewController.swift in Sources */,

+ 68 - 77
deltachat-ios/Chat/ChatViewController.swift

@@ -1,7 +1,6 @@
 import MapKit
 import QuickLook
 import UIKit
-import InputBarAccessoryView
 import AVFoundation
 import DcCore
 import SDWebImage
@@ -18,15 +17,10 @@ class ChatViewController: UITableViewController {
     var incomingMsgObserver: NSObjectProtocol?
     var chatModifiedObserver: NSObjectProtocol?
     var ephemeralTimerModifiedObserver: NSObjectProtocol?
-    // isDismissing indicates whether the ViewController is/was about to dismissed.
-    // The VC can be dismissed by pressing back '<' or by a swipe-to-dismiss gesture.
-    // The latter is cancelable and leads to viewWillAppear is called in case the gesture is cancelled
-    // We need the flag to handle that special case correctly in viewWillAppear
-    private var isDismissing = false
     private var isInitial = true
-    private var ignoreInputBarChange = false
     private var isVisibleToUser: Bool = false
     private var keepKeyboard: Bool = false
+    private var wasInputBarFirstResponder = false
 
     lazy var isGroupChat: Bool = {
         return dcContext.getChat(chatId: chatId).isGroup
@@ -78,7 +72,10 @@ class ChatViewController: UITableViewController {
     }()
 
     /// The `InputBarAccessoryView` used as the `inputAccessoryView` in the view controller.
-    open var messageInputBar = ChatInputBar()
+    lazy var messageInputBar: InputBarAccessoryView = {
+        let inputBar = InputBarAccessoryView()
+        return inputBar
+    }()
 
     lazy var draftArea: DraftArea = {
         let view = DraftArea()
@@ -251,6 +248,11 @@ class ChatViewController: UITableViewController {
     /// The `BasicAudioController` controll the AVAudioPlayer state (play, pause, stop) and update audio cell UI accordingly.
     private lazy var audioController = AudioController(dcContext: dcContext, chatId: chatId, delegate: self)
 
+    private lazy var keyboardManager: KeyboardManager = {
+        let manager = KeyboardManager()
+        return manager
+    }()
+
     var showCustomNavBar = true
     var highlightedMsg: Int?
 
@@ -279,6 +281,7 @@ class ChatViewController: UITableViewController {
     }
 
     override func loadView() {
+        super.loadView()
         self.tableView = ChatTableView(messageInputBar: messageInputBar)
         self.tableView.delegate = self
         self.tableView.dataSource = self
@@ -297,7 +300,6 @@ class ChatViewController: UITableViewController {
         tableView.rowHeight = UITableView.automaticDimension
         tableView.separatorStyle = .none
         tableView.keyboardDismissMode = .interactive
-        tableView.contentInsetAdjustmentBehavior = .never
         navigationController?.setNavigationBarHidden(false, animated: false)
 
         if #available(iOS 13.0, *) {
@@ -307,6 +309,21 @@ class ChatViewController: UITableViewController {
         navigationItem.backButtonTitle = String.localized("chat")
         definesPresentationContext = true
 
+        // Binding to the tableView will enable interactive dismissal
+        keyboardManager.bind(to: tableView)
+
+        keyboardManager.on(event: .didChangeFrame) { [weak self] _ in
+            guard let self = self else { return }
+            if self.isLastRowVisible() && !self.tableView.isDragging && !self.tableView.isDecelerating && self.highlightedMsg == nil {
+                self.scrollToBottom()
+            }
+        }.on(event: .willChangeFrame) { [weak self] _ in
+            guard let self = self else { return }
+            if self.isLastRowVisible() && !self.tableView.isDragging && !self.tableView.isDecelerating && self.highlightedMsg == nil {
+                self.scrollToBottom()
+            }
+        }
+
         if !dcContext.isConfigured() {
             // TODO: display message about nothing being configured
             return
@@ -382,55 +399,38 @@ class ChatViewController: UITableViewController {
         if showCustomNavBar {
             updateTitle(chat: dcContext.getChat(chatId: chatId))
         }
-        if !isDismissing {
-            self.tableView.becomeFirstResponder()
-            if activateSearch {
-                activateSearch = false
-                DispatchQueue.main.async { [weak self] in
-                    self?.searchController.isActive = true
-                }
-                
-            }
-            var bottomInsets = self.messageInputBar.intrinsicContentSize.height + self.messageInputBar.keyboardHeight
-            if UIApplication.shared.statusBarOrientation.isLandscape,
-               let root = UIApplication.shared.keyWindow?.rootViewController {
-                // in landscape we need to take safeAreaInsets into account, in portrait they're already part of the keyboard height
-                bottomInsets += root.view.safeAreaInsets.bottom
-            }
-            self.tableView.contentInset = UIEdgeInsets(top: self.getTopInsetHeight(),
-                                                       left: 0,
-                                                       bottom: bottomInsets,
-                                                       right: 0)
-
-            if let msgId = self.highlightedMsg, self.messageIds.firstIndex(of: msgId) != nil {
-                UIView.animate(withDuration: 0.1, delay: 0, options: .allowAnimatedContent, animations: { [weak self] in
-                    self?.scrollToMessage(msgId: msgId, animated: false)
-                }, completion: { [weak self] finished in
-                    if finished {
-                        guard let self = self else { return }
-                        self.highlightedMsg = nil
-                        self.isInitial = false
-                        self.ignoreInputBarChange = false
-                        self.messageInputBar.scrollDownButton.isHidden = self.isLastRowVisible()
-                    }
-                })
-            } else {
-                UIView.animate(withDuration: 0.1, delay: 0, options: .allowAnimatedContent, animations: { [weak self] in
-                    guard let self = self else { return }
-                    if self.isInitial {
-                        self.scrollToLastUnseenMessage()
-                    }
-                }, completion: { [weak self] finished in
-                    guard let self = self else { return }
-                    if finished {
-                        self.isInitial = false
-                        self.ignoreInputBarChange = false
-                    }
-                })
+        tableView.becomeFirstResponder()
+        if activateSearch {
+            activateSearch = false
+            DispatchQueue.main.async { [weak self] in
+                self?.searchController.isActive = true
             }
         }
-        isDismissing = false
 
+        if let msgId = self.highlightedMsg, self.messageIds.firstIndex(of: msgId) != nil {
+            UIView.animate(withDuration: 0.1, delay: 0, options: .allowAnimatedContent, animations: { [weak self] in
+                self?.scrollToMessage(msgId: msgId, animated: false)
+            }, completion: { [weak self] finished in
+                if finished {
+                    guard let self = self else { return }
+                    self.highlightedMsg = nil
+                    self.isInitial = false
+                    self.messageInputBar.scrollDownButton.isHidden = self.isLastRowVisible()
+                }
+            })
+        } else {
+            UIView.animate(withDuration: 0.1, delay: 0, options: .allowAnimatedContent, animations: { [weak self] in
+                guard let self = self else { return }
+                if self.isInitial {
+                    self.scrollToLastUnseenMessage()
+                }
+            }, completion: { [weak self] finished in
+                guard let self = self else { return }
+                if finished {
+                    self.isInitial = false
+                }
+            })
+        }
 
         if RelayHelper.sharedInstance.isForwarding() {
             askToForwardMessage()
@@ -454,6 +454,13 @@ class ChatViewController: UITableViewController {
         }
 
         handleUserVisibility(isVisible: true)
+
+        // this block ensures that if a swipe-to-dismiss gesture was cancelled, the UI recovers
+        if wasInputBarFirstResponder {
+            messageInputBar.inputTextView.becomeFirstResponder()
+        } else {
+            tableView.becomeFirstResponder()
+        }
     }
 
     override func viewWillDisappear(_ animated: Bool) {
@@ -461,16 +468,19 @@ class ChatViewController: UITableViewController {
 
         // the navigationController will be used when chatDetail is pushed, so we have to remove that gestureRecognizer
         navigationController?.navigationBar.removeGestureRecognizer(navBarTap)
-        isDismissing = true
+        wasInputBarFirstResponder = messageInputBar.inputTextView.isFirstResponder
+        if !wasInputBarFirstResponder {
+            tableView.resignFirstResponder()
+        }
     }
 
     override func viewDidDisappear(_ animated: Bool) {
         super.viewDidDisappear(animated)
-        isDismissing = false
-        ignoreInputBarChange = true
         AppStateRestorer.shared.resetLastActiveChat()
         handleUserVisibility(isVisible: false)
         audioController.stopAnyOngoingPlaying()
+        messageInputBar.inputTextView.resignFirstResponder()
+        wasInputBarFirstResponder = false
     }
 
     override func willMove(toParent parent: UIViewController?) {
@@ -1825,25 +1835,6 @@ extension ChatViewController: InputBarAccessoryViewDelegate {
         draft.text = text
         evaluateInputBar(draft: draft)
     }
-
-    func inputBar(_ inputBar: InputBarAccessoryView, didChangeIntrinsicContentTo size: CGSize) {
-        if isDismissing {
-            return
-        }
-        var bottomInsets = size.height + messageInputBar.keyboardHeight
-        if UIApplication.shared.statusBarOrientation.isLandscape,
-           let root = UIApplication.shared.keyWindow?.rootViewController {
-            // in landscape we need to take safeAreaInsets into account, in portrait they're already part of the keyboard height
-            bottomInsets += root.view.safeAreaInsets.bottom
-        }
-        self.tableView.contentInset = UIEdgeInsets(top: self.getTopInsetHeight(),
-                                                   left: 0,
-                                                   bottom: bottomInsets,
-                                                   right: 0)
-        if isLastRowVisible() && !tableView.isDragging && !tableView.isDecelerating  && highlightedMsg == nil && !ignoreInputBarChange {
-            scrollToBottom()
-        }
-    }
 }
 
 // MARK: - DraftPreviewDelegate

+ 8 - 4
Pods/InputBarAccessoryView/Sources/Controls/InputBarButtonItem.swift → deltachat-ios/Chat/InputBarAccessoryView/Controls/InputBarButtonItem.swift

@@ -2,7 +2,7 @@
 //  InputBarButtonItem.swift
 //  InputBarAccessoryView
 //
-//  Copyright © 2017-2019 Nathan Tannar.
+//  Copyright © 2017-2020 Nathan Tannar.
 //
 //  Permission is hereby granted, free of charge, to any person obtaining a copy
 //  of this software and associated documentation files (the "Software"), to deal
@@ -174,9 +174,13 @@ open class InputBarButtonItem: UIButton, InputItem {
         imageView?.contentMode = .scaleAspectFit
         setContentHuggingPriority(UILayoutPriority(rawValue: 500), for: .horizontal)
         setContentHuggingPriority(UILayoutPriority(rawValue: 500), for: .vertical)
-        setTitleColor(UIColor(red: 0, green: 122/255, blue: 1, alpha: 1), for: .normal)
-        setTitleColor(UIColor(red: 0, green: 122/255, blue: 1, alpha: 0.3), for: .highlighted)
-        setTitleColor(.lightGray, for: .disabled)
+        setTitleColor(.systemBlue, for: .normal)
+        setTitleColor(UIColor.systemBlue.withAlphaComponent(0.3), for: .highlighted)
+        if #available(iOS 13, *) {
+            setTitleColor(.systemGray2, for: .disabled)
+        } else {
+            setTitleColor(.lightGray, for: .disabled)
+        }
         adjustsImageWhenHighlighted = false
         addTarget(self, action: #selector(InputBarButtonItem.touchUpInsideAction), for: .touchUpInside)
     }

+ 1 - 1
Pods/InputBarAccessoryView/Sources/Controls/InputBarSendButton.swift → deltachat-ios/Chat/InputBarAccessoryView/Controls/InputBarSendButton.swift

@@ -2,7 +2,7 @@
 //  InputBarSendButton.swift
 //  InputBarAccessoryView
 //
-//  Copyright © 2017-2019 Nathan Tannar.
+//  Copyright © 2017-2020 Nathan Tannar.
 //
 //  Permission is hereby granted, free of charge, to any person obtaining a copy
 //  of this software and associated documentation files (the "Software"), to deal

+ 53 - 17
Pods/InputBarAccessoryView/Sources/Extensions/NSMutableAttributedString+Extensions.swift → deltachat-ios/Chat/InputBarAccessoryView/Extensions/NSMutableAttributedString+Extensions.swift

@@ -2,7 +2,7 @@
 //  NSMutableAttributedString+Extensions.swift
 //  InputBarAccessoryView
 //
-//  Copyright © 2017-2019 Nathan Tannar.
+//  Copyright © 2017-2020 Nathan Tannar.
 //
 //  Permission is hereby granted, free of charge, to any person obtaining a copy
 //  of this software and associated documentation files (the "Software"), to deal
@@ -30,10 +30,10 @@ import UIKit
 internal extension NSMutableAttributedString {
  
     @discardableResult
-    func bold(_ text: String, fontSize: CGFloat = UIFont.preferredFont(forTextStyle: .body).pointSize, textColor: UIColor = .black) -> NSMutableAttributedString {
-        let attrs: [NSAttributedString.Key:AnyObject] = [
-            NSAttributedString.Key.font : UIFont.boldSystemFont(ofSize: fontSize),
-            NSAttributedString.Key.foregroundColor : textColor
+    func bold(_ text: String, fontSize: CGFloat = UIFont.preferredFont(forTextStyle: .body).pointSize, textColor: UIColor) -> NSMutableAttributedString {
+        let attrs: [NSAttributedString.Key: AnyObject] = [
+            NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: fontSize),
+            NSAttributedString.Key.foregroundColor: textColor
         ]
         let boldString = NSMutableAttributedString(string: text, attributes: attrs)
         self.append(boldString)
@@ -41,10 +41,10 @@ internal extension NSMutableAttributedString {
     }
     
     @discardableResult
-    func medium(_ text: String, fontSize: CGFloat = UIFont.preferredFont(forTextStyle: .body).pointSize, textColor: UIColor = .black) -> NSMutableAttributedString {
-        let attrs: [NSAttributedString.Key:AnyObject] = [
-            NSAttributedString.Key.font : UIFont.systemFont(ofSize: fontSize, weight: UIFont.Weight.medium),
-            NSAttributedString.Key.foregroundColor : textColor
+    func medium(_ text: String, fontSize: CGFloat = UIFont.preferredFont(forTextStyle: .body).pointSize, textColor: UIColor) -> NSMutableAttributedString {
+        let attrs: [NSAttributedString.Key: AnyObject] = [
+            NSAttributedString.Key.font: UIFont.systemFont(ofSize: fontSize, weight: UIFont.Weight.medium),
+            NSAttributedString.Key.foregroundColor: textColor
         ]
         let mediumString = NSMutableAttributedString(string: text, attributes: attrs)
         self.append(mediumString)
@@ -52,10 +52,10 @@ internal extension NSMutableAttributedString {
     }
     
     @discardableResult
-    func italic(_ text: String, fontSize: CGFloat = UIFont.preferredFont(forTextStyle: .body).pointSize, textColor: UIColor = .black) -> NSMutableAttributedString {
-        let attrs: [NSAttributedString.Key:AnyObject] = [
-            NSAttributedString.Key.font : UIFont.italicSystemFont(ofSize: fontSize),
-            NSAttributedString.Key.foregroundColor : textColor
+    func italic(_ text: String, fontSize: CGFloat = UIFont.preferredFont(forTextStyle: .body).pointSize, textColor: UIColor) -> NSMutableAttributedString {
+        let attrs: [NSAttributedString.Key: AnyObject] = [
+            NSAttributedString.Key.font: UIFont.italicSystemFont(ofSize: fontSize),
+            NSAttributedString.Key.foregroundColor: textColor
         ]
         let italicString = NSMutableAttributedString(string: text, attributes: attrs)
         self.append(italicString)
@@ -63,16 +63,52 @@ internal extension NSMutableAttributedString {
     }
     
     @discardableResult
-    func normal(_ text: String, fontSize: CGFloat = UIFont.preferredFont(forTextStyle: .body).pointSize, textColor: UIColor = .black) -> NSMutableAttributedString {
-        let attrs:[NSAttributedString.Key:AnyObject] = [
-            NSAttributedString.Key.font : UIFont.systemFont(ofSize: fontSize),
-            NSAttributedString.Key.foregroundColor : textColor
+    func normal(_ text: String, fontSize: CGFloat = UIFont.preferredFont(forTextStyle: .body).pointSize, textColor: UIColor) -> NSMutableAttributedString {
+        let attrs: [NSAttributedString.Key: AnyObject] = [
+            NSAttributedString.Key.font: UIFont.systemFont(ofSize: fontSize),
+            NSAttributedString.Key.foregroundColor: textColor
         ]
         let normal =  NSMutableAttributedString(string: text, attributes: attrs)
         self.append(normal)
         return self
     }
 
+    @discardableResult
+    func bold(_ text: String, fontSize: CGFloat = UIFont.preferredFont(forTextStyle: .body).pointSize) -> NSMutableAttributedString {
+        if #available(iOS 13, *) {
+            return bold(text, fontSize: fontSize, textColor: .label)
+        } else {
+            return bold(text, fontSize: fontSize, textColor: .black)
+        }
+    }
+
+    @discardableResult
+    func medium(_ text: String, fontSize: CGFloat = UIFont.preferredFont(forTextStyle: .body).pointSize) -> NSMutableAttributedString {
+        if #available(iOS 13, *) {
+            return medium(text, fontSize: fontSize, textColor: .label)
+        } else {
+            return medium(text, fontSize: fontSize, textColor: .black)
+        }
+    }
+
+    @discardableResult
+    func italic(_ text: String, fontSize: CGFloat = UIFont.preferredFont(forTextStyle: .body).pointSize) -> NSMutableAttributedString {
+        if #available(iOS 13, *) {
+            return italic(text, fontSize: fontSize, textColor: .label)
+        } else {
+            return italic(text, fontSize: fontSize, textColor: .black)
+
+        }
+    }
+
+    @discardableResult
+    func normal(_ text: String, fontSize: CGFloat = UIFont.preferredFont(forTextStyle: .body).pointSize) -> NSMutableAttributedString {
+        if #available(iOS 13, *) {
+            return normal(text, fontSize: fontSize, textColor: .label)
+        } else {
+            return normal(text, fontSize: fontSize, textColor: .black)
+        }
+    }
 }
 
 internal extension NSAttributedString {

+ 1 - 2
Pods/InputBarAccessoryView/Sources/Extensions/NSNotification+Extensions.swift → deltachat-ios/Chat/InputBarAccessoryView/Extensions/NSNotification+Extensions.swift

@@ -2,7 +2,7 @@
 //  NSNotification+Extensions.swift
 //  InputBarAccessoryView
 //
-//  Copyright © 2017-2019 Nathan Tannar.
+//  Copyright © 2017-2020 Nathan Tannar.
 //
 //  Permission is hereby granted, free of charge, to any person obtaining a copy
 //  of this software and associated documentation files (the "Software"), to deal
@@ -88,4 +88,3 @@ internal extension NSNotification {
     }
     
 }
-

+ 0 - 0
Pods/InputBarAccessoryView/Sources/Extensions/String+Extensions.swift → deltachat-ios/Chat/InputBarAccessoryView/Extensions/String+Extensions.swift


+ 5 - 8
Pods/InputBarAccessoryView/Sources/Extensions/UITextView+Extensions.swift → deltachat-ios/Chat/InputBarAccessoryView/Extensions/UITextView+Extensions.swift

@@ -13,14 +13,13 @@ internal extension UITextView {
     typealias Match = (prefix: String, word: String, range: NSRange)
     
     func find(prefixes: Set<String>, with delimiterSet: CharacterSet) -> Match? {
-        guard prefixes.count > 0 else { return nil }
+        guard !prefixes.isEmpty else { return nil }
 
-        for prefix in prefixes {
-            if let match = find(prefix: prefix, with: delimiterSet) {
-                return match
-            }
+        let matches = prefixes.compactMap { find(prefix: $0, with: delimiterSet) }
+        let sorted = matches.sorted { a, b in
+            return a.range.lowerBound > b.range.lowerBound
         }
-        return nil
+        return sorted.first
     }
     
     func find(prefix: String, with delimiterSet: CharacterSet) -> Match? {
@@ -60,5 +59,3 @@ internal extension UITextView {
     }
     
 }
-
-

+ 1 - 1
Pods/InputBarAccessoryView/Sources/Extensions/UIView+AutoLayout.swift → deltachat-ios/Chat/InputBarAccessoryView/Extensions/UIView+AutoLayout.swift

@@ -2,7 +2,7 @@
 //  UIView+Autolayout.swift
 //  InputBarAccessoryView
 //
-//  Copyright © 2017-2019 Nathan Tannar.
+//  Copyright © 2017-2020 Nathan Tannar.
 //
 //  Permission is hereby granted, free of charge, to any person obtaining a copy
 //  of this software and associated documentation files (the "Software"), to deal

+ 224 - 81
Pods/InputBarAccessoryView/Sources/InputBarAccessoryView.swift → deltachat-ios/Chat/InputBarAccessoryView/InputBarAccessoryView.swift

@@ -2,7 +2,7 @@
 //  InputBarAccessoryView.swift
 //  InputBarAccessoryView
 //
-//  Copyright © 2017-2019 Nathan Tannar.
+//  Copyright © 2017-2020 Nathan Tannar.
 //
 //  Permission is hereby granted, free of charge, to any person obtaining a copy
 //  of this software and associated documentation files (the "Software"), to deal
@@ -26,6 +26,7 @@
 //
 
 import UIKit
+import DcCore
 
 /// A powerful InputAccessoryView ideal for messaging applications
 open class InputBarAccessoryView: UIView {
@@ -40,7 +41,7 @@ open class InputBarAccessoryView: UIView {
     open var backgroundView: UIView = {
         let view = UIView()
         view.translatesAutoresizingMaskIntoConstraints = false
-        view.backgroundColor = .white
+        view.backgroundColor = InputBarAccessoryView.defaultBackgroundColor
         return view
     }()
     
@@ -55,27 +56,21 @@ open class InputBarAccessoryView: UIView {
     
     /**
      A UIVisualEffectView that adds a blur effect to make the view appear transparent.
-     
-     ## Important Notes ##
-     1. The blurView is initially not added to the backgroundView to improve performance when not needed. When `isTranslucent` is set to TRUE for the first time the blurView is added and anchored to the `backgroundView`s edge anchors
     */
-    open var blurView: UIVisualEffectView = {
-        let blurEffect = UIBlurEffect(style: .light)
+    open lazy var blurView: UIVisualEffectView = {
+        var blurEffect = UIBlurEffect(style: .light)
+        if #available(iOS 13, *) {
+            blurEffect = UIBlurEffect(style: .systemMaterial)
+        }
         let view = UIVisualEffectView(effect: blurEffect)
         view.translatesAutoresizingMaskIntoConstraints = false
         return view
     }()
     
     /// Determines if the InputBarAccessoryView should have a translucent effect
-    open var isTranslucent: Bool = false {
+    open var isTranslucent: Bool = true {
         didSet {
-            if isTranslucent && blurView.superview == nil {
-                backgroundView.addSubview(blurView)
-                blurView.fillSuperview()
-            }
             blurView.isHidden = !isTranslucent
-            let color: UIColor = backgroundView.backgroundColor ?? .white
-            backgroundView.backgroundColor = isTranslucent ? color.withAlphaComponent(0.75) : color
         }
     }
 
@@ -138,10 +133,18 @@ open class InputBarAccessoryView: UIView {
         view.translatesAutoresizingMaskIntoConstraints = false
         return view
     }()
+
+    private static let defaultBackgroundColor: UIColor = {
+        if #available(iOS 13, *) {
+            return .systemBackground
+        } else {
+            return .white
+        }
+    }()
     
     /// The InputTextView a user can input a message in
-    open lazy var inputTextView: InputTextView = { [weak self] in
-        let inputTextView = InputTextView()
+    open lazy var inputTextView: ChatInputTextView = {
+        let inputTextView = ChatInputTextView()
         inputTextView.translatesAutoresizingMaskIntoConstraints = false
         inputTextView.inputBarAccessoryView = self
         return inputTextView
@@ -250,8 +253,13 @@ open class InputBarAccessoryView: UIView {
     
     /// A boolean that indicates if the maxTextViewHeight has been met. Keeping track of this
     /// improves the performance
+    /// The default value is `FALSE`
     public private(set) var isOverMaxTextViewHeight = false
     
+    /// A boolean that tracks orientation changes to calculate the correct intrinsicContentSize and
+    /// enable/disable NSLayoutContraints accordingly in calculateIntrinsicContentSize
+    private var isInPhoneLandscapeOrientation = false
+
     /// A boolean that when set as `TRUE` will always enable the `InputTextView` to be anchored to the
     /// height of `maxTextViewHeight`
     /// The default value is `FALSE`
@@ -259,11 +267,13 @@ open class InputBarAccessoryView: UIView {
     
     /// A boolean that determines if the `maxTextViewHeight` should be maintained automatically.
     /// To control the maximum height of the view yourself, set this to `false`.
+    /// The default value is `TRUE`
     open var shouldAutoUpdateMaxTextViewHeight = true
 
     /// The maximum height that the InputTextView can reach.
     /// This is set automatically when `shouldAutoUpdateMaxTextViewHeight` is true.
     /// To control the height yourself, make sure to set `shouldAutoUpdateMaxTextViewHeight` to false.
+    /// The default value is `0`
     open var maxTextViewHeight: CGFloat = 0 {
         didSet {
             textViewHeightAnchor?.constant = maxTextViewHeight
@@ -271,7 +281,13 @@ open class InputBarAccessoryView: UIView {
     }
     
     /// A boolean that determines whether the sendButton's `isEnabled` state should be managed automatically.
+    /// The default value is `TRUE`
     open var shouldManageSendButtonEnabledState = true
+
+    /// A boolean that determines if the layout required for new or typed text should
+    /// be animated.
+    /// The default value is `FALSE`
+    open var shouldAnimateTextDidChangeLayout = false
     
     /// The height that will fit the current text in the InputTextView based on its current bounds
     public var requiredInputTextViewHeight: CGFloat {
@@ -283,6 +299,7 @@ open class InputBarAccessoryView: UIView {
     }
     
     /// The fixed widthAnchor constant of the leftStackView
+    /// The default value is `0`
     public private(set) var leftStackViewWidthConstant: CGFloat = 0 {
         didSet {
             leftStackViewLayoutSet?.width?.constant = leftStackViewWidthConstant
@@ -290,6 +307,7 @@ open class InputBarAccessoryView: UIView {
     }
     
     /// The fixed widthAnchor constant of the rightStackView
+    /// The default value is `52`
     public private(set) var rightStackViewWidthConstant: CGFloat = 52 {
         didSet {
             rightStackViewLayoutSet?.width?.constant = rightStackViewWidthConstant
@@ -319,6 +337,27 @@ open class InputBarAccessoryView: UIView {
         return [leftStackViewItems, rightStackViewItems, bottomStackViewItems, topStackViewItems, nonStackViewItems].flatMap { $0 }
     }
 
+    // customization
+    /// indicates if a draft view was added to the InputBarAccessoryView
+    var hasDraft: Bool = false
+
+    /// indicates if a quote view was added to the InputBarAccessoryView
+    var hasQuote: Bool = false
+
+    /// optional callback that gets called if scroll down button was pressed
+    var onScrollDownButtonPressed: (() -> Void)?
+
+    lazy var scrollDownButton: UIButton = {
+        let button = UIButton(frame: .zero)
+        button.translatesAutoresizingMaskIntoConstraints = false
+        button.addTarget(self, action: #selector(onScrollDownPressed), for: .touchUpInside)
+        button.isHidden = true
+        return button
+    }()
+
+    private let keyboardManager: KeyboardManager = KeyboardManager()
+    open var keyboardHeight: CGFloat = 0
+
     // MARK: - Auto-Layout Constraint Sets
     
     private var middleContentViewLayoutSet: NSLayoutConstraintSet?
@@ -369,14 +408,29 @@ open class InputBarAccessoryView: UIView {
     
     /// Sets up the default properties
     open func setup() {
-
-        backgroundColor = .white
+        backgroundColor = .clear
         autoresizingMask = [.flexibleHeight]
         setupSubviews()
         setupConstraints()
         setupObservers()
         setupGestureRecognizers()
+        setupKeyboardEvents()
+        setupScrollDownButton()
+    }
+
+    private func setupKeyboardEvents() {
+        keyboardManager.on(event: .willChangeFrame, do: {  [weak self] (notification) in
+            guard let self = self else { return }
+            self.keyboardHeight = notification.endFrame.height - self.intrinsicContentSize.height
+        }).on(event: .didChangeFrame, do: {  [weak self] (notification) in
+            guard let self = self else { return }
+            self.keyboardHeight = notification.endFrame.height - self.intrinsicContentSize.height
+            if self.isInPhoneLandscapeOrientation {
+                self.orientationDidChange()
+            }
+        })
     }
+
     
     /// Adds the required notification observers
     private func setupObservers() {
@@ -407,7 +461,7 @@ open class InputBarAccessoryView: UIView {
     
     /// Adds all of the subviews
     private func setupSubviews() {
-        
+        addSubview(blurView)
         addSubview(backgroundView)
         addSubview(topStackView)
         addSubview(contentView)
@@ -419,6 +473,8 @@ open class InputBarAccessoryView: UIView {
         middleContentViewWrapper.addSubview(inputTextView)
         middleContentView = inputTextView
         setStackViewItems([sendButton], forStack: .right, animated: false)
+        backgroundView.backgroundColor = DcColors.defaultTransparentBackgroundColor
+        blurView.fillSuperview()
     }
     
     /// Sets up the initial constraints of each subview
@@ -435,35 +491,25 @@ open class InputBarAccessoryView: UIView {
         )
         
         topStackViewLayoutSet = NSLayoutConstraintSet(
-            top:    topStackView.topAnchor.constraint(equalTo: topAnchor, constant: topStackViewPadding.top),
+            top: topStackView.topAnchor.constraint(equalTo: topAnchor, constant: topStackViewPadding.top),
             bottom: topStackView.bottomAnchor.constraint(equalTo: contentView.topAnchor, constant: -padding.top),
-            left:   topStackView.leftAnchor.constraint(equalTo: leftAnchor, constant: topStackViewPadding.left + frameInsets.left),
-            right:  topStackView.rightAnchor.constraint(equalTo: rightAnchor, constant: -(topStackViewPadding.right + frameInsets.right))
+            left: topStackView.leftAnchor.constraint(equalTo: safeAreaLayoutGuide.leftAnchor, constant: topStackViewPadding.left + frameInsets.left),
+            right: topStackView.rightAnchor.constraint(equalTo: safeAreaLayoutGuide.rightAnchor, constant: -(topStackViewPadding.right + frameInsets.right))
         )
         
         contentViewLayoutSet = NSLayoutConstraintSet(
-            top:    contentView.topAnchor.constraint(equalTo: topStackView.bottomAnchor, constant: padding.top),
-            bottom: contentView.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -padding.bottom),
-            left:   contentView.leftAnchor.constraint(equalTo: leftAnchor, constant: padding.left + frameInsets.left),
-            right:  contentView.rightAnchor.constraint(equalTo: rightAnchor, constant: -(padding.right + frameInsets.right))
+            top: contentView.topAnchor.constraint(equalTo: topStackView.bottomAnchor, constant: padding.top),
+            bottom: contentView.bottomAnchor.constraint(equalTo: safeAreaLayoutGuide.bottomAnchor, constant: -padding.bottom),
+            left: contentView.leftAnchor.constraint(equalTo: safeAreaLayoutGuide.leftAnchor, constant: padding.left + frameInsets.left),
+            right: contentView.rightAnchor.constraint(equalTo: safeAreaLayoutGuide.rightAnchor, constant: -(padding.right + frameInsets.right))
         )
-        
-        if #available(iOS 11.0, *) {
-            // Switch to safeAreaLayoutGuide
-            contentViewLayoutSet?.bottom = contentView.bottomAnchor.constraint(equalTo: safeAreaLayoutGuide.bottomAnchor, constant: -padding.bottom)
-            contentViewLayoutSet?.left = contentView.leftAnchor.constraint(equalTo: safeAreaLayoutGuide.leftAnchor, constant: padding.left + frameInsets.left)
-            contentViewLayoutSet?.right = contentView.rightAnchor.constraint(equalTo: safeAreaLayoutGuide.rightAnchor, constant: -(padding.right + frameInsets.right))
-            
-            topStackViewLayoutSet?.left = topStackView.leftAnchor.constraint(equalTo: safeAreaLayoutGuide.leftAnchor, constant: topStackViewPadding.left + frameInsets.left)
-            topStackViewLayoutSet?.right = topStackView.rightAnchor.constraint(equalTo: safeAreaLayoutGuide.rightAnchor, constant: -(topStackViewPadding.right + frameInsets.right))
-        }
 
         // Constraints Within the contentView
         middleContentViewLayoutSet = NSLayoutConstraintSet(
-            top:    middleContentViewWrapper.topAnchor.constraint(equalTo: contentView.topAnchor, constant: middleContentViewPadding.top),
+            top: middleContentViewWrapper.topAnchor.constraint(equalTo: contentView.topAnchor, constant: middleContentViewPadding.top),
             bottom: middleContentViewWrapper.bottomAnchor.constraint(equalTo: bottomStackView.topAnchor, constant: -middleContentViewPadding.bottom),
-            left:   middleContentViewWrapper.leftAnchor.constraint(equalTo: leftStackView.rightAnchor, constant: middleContentViewPadding.left),
-            right:  middleContentViewWrapper.rightAnchor.constraint(equalTo: rightStackView.leftAnchor, constant: -middleContentViewPadding.right)
+            left: middleContentViewWrapper.leftAnchor.constraint(equalTo: leftStackView.rightAnchor, constant: middleContentViewPadding.left),
+            right: middleContentViewWrapper.rightAnchor.constraint(equalTo: rightStackView.leftAnchor, constant: -middleContentViewPadding.right)
         )
 
         inputTextView.fillSuperview()
@@ -471,24 +517,24 @@ open class InputBarAccessoryView: UIView {
         textViewHeightAnchor = inputTextView.heightAnchor.constraint(equalToConstant: maxTextViewHeight)
         
         leftStackViewLayoutSet = NSLayoutConstraintSet(
-            top:    leftStackView.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 0),
+            top: leftStackView.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 0),
             bottom: leftStackView.bottomAnchor.constraint(equalTo: middleContentViewWrapper.bottomAnchor, constant: 0),
-            left:   leftStackView.leftAnchor.constraint(equalTo: contentView.leftAnchor, constant: 0),
-            width:  leftStackView.widthAnchor.constraint(equalToConstant: leftStackViewWidthConstant)
+            left: leftStackView.leftAnchor.constraint(equalTo: contentView.leftAnchor, constant: 0),
+            width: leftStackView.widthAnchor.constraint(equalToConstant: leftStackViewWidthConstant)
         )
         
         rightStackViewLayoutSet = NSLayoutConstraintSet(
-            top:    rightStackView.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 0),
+            top: rightStackView.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 0),
             bottom: rightStackView.bottomAnchor.constraint(equalTo: middleContentViewWrapper.bottomAnchor, constant: 0),
-            right:  rightStackView.rightAnchor.constraint(equalTo: contentView.rightAnchor, constant: 0),
-            width:  rightStackView.widthAnchor.constraint(equalToConstant: rightStackViewWidthConstant)
+            right: rightStackView.rightAnchor.constraint(equalTo: contentView.rightAnchor, constant: 0),
+            width: rightStackView.widthAnchor.constraint(equalToConstant: rightStackViewWidthConstant)
         )
         
         bottomStackViewLayoutSet = NSLayoutConstraintSet(
-            top:    bottomStackView.topAnchor.constraint(equalTo: middleContentViewWrapper.bottomAnchor, constant: middleContentViewPadding.bottom),
+            top: bottomStackView.topAnchor.constraint(equalTo: middleContentViewWrapper.bottomAnchor, constant: middleContentViewPadding.bottom),
             bottom: bottomStackView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: 0),
-            left:   bottomStackView.leftAnchor.constraint(equalTo: contentView.leftAnchor, constant: 0),
-            right:  bottomStackView.rightAnchor.constraint(equalTo: contentView.rightAnchor, constant: 0)
+            left: bottomStackView.leftAnchor.constraint(equalTo: contentView.leftAnchor, constant: 0),
+            right: bottomStackView.rightAnchor.constraint(equalTo: contentView.rightAnchor, constant: 0)
         )
     }
     
@@ -497,17 +543,13 @@ open class InputBarAccessoryView: UIView {
     ///
     /// - Parameter window: The window to anchor to
     private func setupConstraints(to window: UIWindow?) {
-        if #available(iOS 11.0, *) {
-            if let window = window {
-                guard window.safeAreaInsets.bottom > 0 else { return }
-                windowAnchor?.isActive = false
-                windowAnchor = contentView.bottomAnchor.constraint(lessThanOrEqualToSystemSpacingBelow: window.safeAreaLayoutGuide.bottomAnchor, multiplier: 1)
-                windowAnchor?.constant = -padding.bottom
-                windowAnchor?.priority = UILayoutPriority(rawValue: 750)
-                windowAnchor?.isActive = true
-                backgroundViewLayoutSet?.bottom?.constant = window.safeAreaInsets.bottom
-            }
-        }
+        guard let window = window, window.safeAreaInsets.bottom > 0 else { return }
+        windowAnchor?.isActive = false
+        windowAnchor = contentView.bottomAnchor.constraint(lessThanOrEqualToSystemSpacingBelow: window.safeAreaLayoutGuide.bottomAnchor, multiplier: 1)
+        windowAnchor?.constant = -padding.bottom
+        windowAnchor?.priority = UILayoutPriority(rawValue: 750)
+        windowAnchor?.isActive = true
+        backgroundViewLayoutSet?.bottom?.constant = window.safeAreaInsets.bottom
     }
     
     // MARK: - Constraint Layout Updates
@@ -560,27 +602,35 @@ open class InputBarAccessoryView: UIView {
     /// - Returns: The required intrinsicContentSize
     open func calculateIntrinsicContentSize() -> CGSize {
         
+        let isPhoneInLandscape = UIApplication.shared.statusBarOrientation.isLandscape && UIDevice.current.userInterfaceIdiom == .phone
         var inputTextViewHeight = requiredInputTextViewHeight
-        if inputTextViewHeight >= maxTextViewHeight {
+        let bottomSafeAreaInsetsHeight = UIApplication.shared.keyWindow?.rootViewController?.view.safeAreaInsets.bottom ?? 0
+
+        if isPhoneInLandscape && keyboardHeight > bottomSafeAreaInsetsHeight {
+            textViewHeightAnchor?.isActive = true
+            inputTextView.isScrollEnabled = true
+            inputTextViewHeight = maxTextViewHeight
+            isOverMaxTextViewHeight = inputTextViewHeight >= maxTextViewHeight
+        } else if inputTextViewHeight >= maxTextViewHeight {
             if !isOverMaxTextViewHeight {
                 textViewHeightAnchor?.isActive = true
                 inputTextView.isScrollEnabled = true
                 isOverMaxTextViewHeight = true
             }
             inputTextViewHeight = maxTextViewHeight
-        } else {
-            if isOverMaxTextViewHeight {
-                textViewHeightAnchor?.isActive = false || shouldForceTextViewMaxHeight
-                inputTextView.isScrollEnabled = false
-                isOverMaxTextViewHeight = false
-                inputTextView.invalidateIntrinsicContentSize()
-            }
+        } else if isOverMaxTextViewHeight || isInPhoneLandscapeOrientation {
+            textViewHeightAnchor?.isActive = false || shouldForceTextViewMaxHeight
+            inputTextView.isScrollEnabled = false
+            isOverMaxTextViewHeight = false
+            inputTextView.invalidateIntrinsicContentSize()
         }
-        
+
+        isInPhoneLandscapeOrientation = isPhoneInLandscape
+
         // Calculate the required height
         let totalPadding = padding.top + padding.bottom + topStackViewPadding.top + middleContentViewPadding.top + middleContentViewPadding.bottom
-        let topStackViewHeight = topStackView.arrangedSubviews.count > 0 ? topStackView.bounds.height : 0
-        let bottomStackViewHeight = bottomStackView.arrangedSubviews.count > 0 ? bottomStackView.bounds.height : 0
+        let topStackViewHeight = !topStackView.arrangedSubviews.isEmpty ? topStackView.bounds.height : 0
+        let bottomStackViewHeight = !bottomStackView.arrangedSubviews.isEmpty ? bottomStackView.bounds.height : 0
         let verticalStackViewHeight = topStackViewHeight + bottomStackViewHeight
         let requiredHeight = inputTextViewHeight + totalPadding + verticalStackViewHeight
         return CGSize(width: UIView.noIntrinsicMetric, height: requiredHeight)
@@ -592,6 +642,10 @@ open class InputBarAccessoryView: UIView {
     }
 
     open override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
+        if !scrollDownButton.isHidden && scrollDownButton.point(inside: convert(point, to: scrollDownButton), with: event) {
+            return true
+        }
+
         guard frameInsets.left != 0 || frameInsets.right != 0 else {
             return super.point(inside: point, with: event)
         }
@@ -605,10 +659,22 @@ open class InputBarAccessoryView: UIView {
     ///
     /// - Returns: Max Height
     open func calculateMaxTextViewHeight() -> CGFloat {
-        if traitCollection.verticalSizeClass == .regular {
-            return (UIScreen.main.bounds.height / 3).rounded(.down)
+        let bottomSafeAreaInsetsHeight = UIApplication.shared.keyWindow?.rootViewController?.view.safeAreaInsets.bottom ?? 0
+        if UIApplication.shared.statusBarOrientation.isPortrait || UIDevice.current.userInterfaceIdiom == .pad || keyboardHeight == bottomSafeAreaInsetsHeight {
+            let divisor: CGFloat = 3
+            var subtract: CGFloat = 0
+            subtract += hasDraft ? 90 : 0
+            subtract += hasQuote ? 90 : 0
+            let height = (UIScreen.main.bounds.height / divisor).rounded(.down) - subtract
+            if height < 40 {
+                return 40
+            }
+            return height
+        } else {
+            // landscape phone layout with shown keyboard
+            let height = UIScreen.main.bounds.height - keyboardHeight - padding.vertical
+            return height
         }
-        return (UIScreen.main.bounds.height / 5).rounded(.down)
     }
     
     // MARK: - Layout Helper Methods
@@ -700,6 +766,13 @@ open class InputBarAccessoryView: UIView {
     /// Removes all of the arranged subviews from the InputStackView and adds the given items.
     /// Sets the inputBarAccessoryView property of the InputBarButtonItem
     ///
+    /// Note: If you call `animated = true`, the `items` property of the stack view items will not be updated until the 
+    /// views are done being animated. If you perform a check for the items after they're set, setting animated to `false`
+    /// will apply the body of the closure immediately.
+    ///
+    /// The send button is attached to `rightStackView` so remember to remove it if you're setting it to a different
+    /// stack.
+    ///
     /// - Parameters:
     ///   - items: New InputStackView arranged views
     ///   - position: The targeted InputStackView
@@ -774,8 +847,7 @@ open class InputBarAccessoryView: UIView {
         performLayout(animated) { 
             self.leftStackViewWidthConstant = newValue
             self.layoutStackViews([.left])
-            guard self.superview?.superview != nil else { return }
-            self.superview?.superview?.layoutIfNeeded()
+            self.layoutContainerViewIfNeeded()
         }
     }
     
@@ -788,8 +860,7 @@ open class InputBarAccessoryView: UIView {
         performLayout(animated) { 
             self.rightStackViewWidthConstant = newValue
             self.layoutStackViews([.right])
-            guard self.superview?.superview != nil else { return }
-            self.superview?.superview?.layoutIfNeeded()
+            self.layoutContainerViewIfNeeded()
         }
     }
     
@@ -802,9 +873,24 @@ open class InputBarAccessoryView: UIView {
         performLayout(animated) {
             self.shouldForceTextViewMaxHeight = newValue
             self.textViewHeightAnchor?.isActive = newValue
-            guard self.superview?.superview != nil else { return }
-            self.superview?.superview?.layoutIfNeeded()
+            self.layoutContainerViewIfNeeded()
+        }
+    }
+
+    /// Calls `layoutIfNeeded()` on the `UIInputSetContainerView` that holds the
+    /// `InputBarAccessoryView`, if it exists, else `layoutIfNeeded()` is called
+    /// on the `superview`.
+    /// Use this for invoking a smooth layout of a size change when used as
+    /// an `inputAccessoryView`
+    public func layoutContainerViewIfNeeded() {
+        guard
+            let UIInputSetContainerViewKind: AnyClass = NSClassFromString("UIInputSetContainerView"),
+            let container = superview?.superview,
+            container.isKind(of: UIInputSetContainerViewKind) else {
+            superview?.layoutIfNeeded()
+            return
         }
+        superview?.superview?.layoutIfNeeded()
     }
     
     // MARK: - Notifications/Hooks
@@ -812,13 +898,15 @@ open class InputBarAccessoryView: UIView {
     /// Invalidates the intrinsicContentSize
     open override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
         super.traitCollectionDidChange(previousTraitCollection)
-        if traitCollection.verticalSizeClass != previousTraitCollection?.verticalSizeClass || traitCollection.horizontalSizeClass != previousTraitCollection?.horizontalSizeClass {
+        if traitCollection.verticalSizeClass != previousTraitCollection?.verticalSizeClass ||
+            traitCollection.horizontalSizeClass != previousTraitCollection?.horizontalSizeClass {
             if shouldAutoUpdateMaxTextViewHeight {
                 maxTextViewHeight = calculateMaxTextViewHeight()
             } else {
                 invalidateIntrinsicContentSize()
             }
         }
+        scrollDownButton.layer.borderColor = DcColors.colorDisabled.cgColor
     }
     
     /// Invalidates the intrinsicContentSize
@@ -843,7 +931,7 @@ open class InputBarAccessoryView: UIView {
             var isEnabled = !trimmedText.isEmpty
             if !isEnabled {
                 // The images property is more resource intensive so only use it if needed
-                isEnabled = inputTextView.images.count > 0
+                isEnabled = !inputTextView.images.isEmpty
             }
             sendButton.isEnabled = isEnabled
         }
@@ -857,6 +945,12 @@ open class InputBarAccessoryView: UIView {
         if shouldInvalidateIntrinsicContentSize {
             // Prevent un-needed content size invalidation
             invalidateIntrinsicContentSize()
+            if shouldAnimateTextDidChangeLayout {
+                inputTextView.layoutIfNeeded()
+                UIView.animate(withDuration: 0.15) {
+                    self.layoutContainerViewIfNeeded()
+                }
+            }
         }
     }
     
@@ -900,4 +994,53 @@ open class InputBarAccessoryView: UIView {
     open func didSelectSendButton() {
         delegate?.inputBar(self, didPressSendButtonWith: inputTextView.text)
     }
+
+    // MARK: - Drafts - Customization
+    public func configure(draft: DraftModel) {
+        hasDraft = !draft.isEditing && draft.attachment != nil
+        hasQuote = !draft.isEditing && draft.quoteText != nil
+        leftStackView.isHidden = draft.isEditing
+        rightStackView.isHidden = draft.isEditing
+        maxTextViewHeight = calculateMaxTextViewHeight()
+    }
+
+    public func cancel() {
+        hasDraft = false
+        hasQuote = false
+        maxTextViewHeight = calculateMaxTextViewHeight()
+    }
+
+    @objc func onScrollDownPressed() {
+        if let callback = onScrollDownButtonPressed {
+            callback()
+        }
+    }
+
+    func setupScrollDownButton() {
+        self.addSubview(scrollDownButton)
+        NSLayoutConstraint.activate([
+            scrollDownButton.constraintAlignTopTo(self, paddingTop: -52),
+            scrollDownButton.constraintAlignTrailingToAnchor(self.safeAreaLayoutGuide.trailingAnchor, paddingTrailing: 12),
+            scrollDownButton.constraintHeightTo(40),
+            scrollDownButton.constraintWidthTo(40)
+        ])
+        scrollDownButton.backgroundColor = DcColors.defaultBackgroundColor
+        scrollDownButton.setImage(UIImage(named: "ic_scrolldown")?.sd_tintedImage(with: .systemBlue), for: .normal)
+        scrollDownButton.layer.cornerRadius = 20
+        scrollDownButton.layer.borderColor = DcColors.colorDisabled.cgColor
+        scrollDownButton.layer.borderWidth = 1
+        scrollDownButton.layer.masksToBounds = true
+        scrollDownButton.accessibilityLabel = String.localized("menu_scroll_to_bottom")
+    }
+
+    public override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
+        if !scrollDownButton.isHidden {
+            let scrollButtonViewPoint = self.scrollDownButton.convert(point, from: self)
+            if let view = scrollDownButton.hitTest(scrollButtonViewPoint, with: event) {
+                return view
+            }
+        }
+        return super.hitTest(point, with: event)
+    }
+
 }

+ 1 - 1
Pods/InputBarAccessoryView/Sources/Views/InputStackView.swift → deltachat-ios/Chat/InputBarAccessoryView/InputStackView.swift

@@ -2,7 +2,7 @@
 //  InputStackView.swift
 //  InputBarAccessoryView
 //
-//  Copyright © 2017-2019 Nathan Tannar.
+//  Copyright © 2017-2020 Nathan Tannar.
 //
 //  Permission is hereby granted, free of charge, to any person obtaining a copy
 //  of this software and associated documentation files (the "Software"), to deal

+ 32 - 24
Pods/InputBarAccessoryView/Sources/Views/InputTextView.swift → deltachat-ios/Chat/InputBarAccessoryView/InputTextView.swift

@@ -2,7 +2,7 @@
 //  InputTextView.swift
 //  InputBarAccessoryView
 //
-//  Copyright © 2017-2019 Nathan Tannar.
+//  Copyright © 2017-2020 Nathan Tannar.
 //
 //  Permission is hereby granted, free of charge, to any person obtaining a copy
 //  of this software and associated documentation files (the "Software"), to deal
@@ -68,7 +68,11 @@ open class InputTextView: UITextView {
     public let placeholderLabel: UILabel = {
         let label = UILabel()
         label.numberOfLines = 0
-        label.textColor = .lightGray
+        if #available(iOS 13, *) {
+            label.textColor = .systemGray2
+        } else {
+            label.textColor = .lightGray
+        }
         label.text = "Aa"
         label.backgroundColor = .clear
         label.translatesAutoresizingMaskIntoConstraints = false
@@ -176,10 +180,10 @@ open class InputTextView: UITextView {
 
         addSubview(placeholderLabel)
         placeholderLabelConstraintSet = NSLayoutConstraintSet(
-            top:     placeholderLabel.topAnchor.constraint(equalTo: topAnchor, constant: placeholderLabelInsets.top),
-            bottom:  placeholderLabel.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -placeholderLabelInsets.bottom),
-            left:    placeholderLabel.leftAnchor.constraint(equalTo: leftAnchor, constant: placeholderLabelInsets.left),
-            right:   placeholderLabel.rightAnchor.constraint(equalTo: rightAnchor, constant: -placeholderLabelInsets.right),
+            top: placeholderLabel.topAnchor.constraint(equalTo: topAnchor, constant: placeholderLabelInsets.top),
+            bottom: placeholderLabel.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -placeholderLabelInsets.bottom),
+            left: placeholderLabel.leftAnchor.constraint(equalTo: leftAnchor, constant: placeholderLabelInsets.left),
+            right: placeholderLabel.rightAnchor.constraint(equalTo: rightAnchor, constant: -placeholderLabelInsets.right),
             centerX: placeholderLabel.centerXAnchor.constraint(equalTo: centerXAnchor),
             centerY: placeholderLabel.centerYAnchor.constraint(equalTo: centerYAnchor)
         )
@@ -239,18 +243,15 @@ open class InputTextView: UITextView {
     
     open override func paste(_ sender: Any?) {
         
-        guard let image = UIPasteboard.general.image else {
+        guard isImagePasteEnabled, let image = UIPasteboard.general.image else {
             return super.paste(sender)
         }
-        if isImagePasteEnabled {
-            pasteImageInTextContainer(with: image)
-        } else {
-            for plugin in inputBarAccessoryView?.inputPlugins ?? [] {
-                if plugin.handleInput(of: image) {
-                    return
-                }
+        for plugin in inputBarAccessoryView?.inputPlugins ?? [] {
+            if plugin.handleInput(of: image) {
+                return
             }
         }
+        pasteImageInTextContainer(with: image)
     }
     
     /// Addes a new UIImage to the NSTextContainer as an NSTextAttachment
@@ -271,9 +272,15 @@ open class InputTextView: UITextView {
         newAttributedStingComponent.append(NSAttributedString(string: "\n"))
         
         // The attributes that should be applied to the new NSAttributedString to match the current attributes
+        let defaultTextColor: UIColor
+        if #available(iOS 13, *) {
+            defaultTextColor = .label
+        } else {
+            defaultTextColor = .black
+        }
         let attributes: [NSAttributedString.Key: Any] = [
             NSAttributedString.Key.font: font ?? UIFont.preferredFont(forTextStyle: .body),
-            NSAttributedString.Key.foregroundColor: textColor ?? .black
+            NSAttributedString.Key.foregroundColor: textColor ?? defaultTextColor
         ]
         newAttributedStingComponent.addAttributes(attributes, range: NSRange(location: 0, length: newAttributedStingComponent.length))
         
@@ -342,23 +349,22 @@ open class InputTextView: UITextView {
                 } else if let image = attachment.image(forBounds: attachment.bounds,
                                                        textContainer: nil,
                                                        characterIndex: range.location) {
-                    attachments.append((range,image))
+                    attachments.append((range, image))
                 }
             }
         }
         
         var curLocation = 0
-        if attachments.count == 0 {
+        if attachments.isEmpty {
             let text = attributedText.string.trimmingCharacters(in: .whitespacesAndNewlines)
             if !text.isEmpty {
                 components.append(text)
             }
-        }
-        else {
+        } else {
             attachments.forEach { (attachment) in
                 let (range, image) = attachment
                 if curLocation < range.location {
-                    let textRange = NSMakeRange(curLocation, range.location - curLocation)
+                    let textRange = NSRange(location: curLocation, length: range.location - curLocation)
                     let text = attributedText.attributedSubstring(from: textRange).string.trimmingCharacters(in: .whitespacesAndNewlines)
                     if !text.isEmpty {
                         components.append(text)
@@ -368,8 +374,11 @@ open class InputTextView: UITextView {
                 curLocation = range.location + range.length
                 components.append(image)
             }
-            if curLocation < length - 1  {
-                let text = attributedText.attributedSubstring(from: NSMakeRange(curLocation, length - curLocation)).string.trimmingCharacters(in: .whitespacesAndNewlines)
+            if curLocation < length - 1 {
+                let text = attributedText.attributedSubstring(from: NSRange(location: curLocation,
+                                                                            length: length - curLocation))
+                    .string
+                    .trimmingCharacters(in: .whitespacesAndNewlines)
                 if !text.isEmpty {
                     components.append(text)
                 }
@@ -383,7 +392,7 @@ open class InputTextView: UITextView {
     @objc
     private func redrawTextAttachments() {
         
-        guard images.count > 0 else { return }
+        guard !images.isEmpty else { return }
         let range = NSRange(location: 0, length: attributedText.length)
         attributedText.enumerateAttribute(.attachment, in: range, options: [], using: { value, _, _ -> Void in
             if let attachment = value as? NSTextAttachment, let image = attachment.image {
@@ -398,4 +407,3 @@ open class InputTextView: UITextView {
     }
     
 }
-

+ 1 - 1
Pods/InputBarAccessoryView/Sources/KeyboardManager/KeyboardEvent.swift → deltachat-ios/Chat/InputBarAccessoryView/KeyboardManager/KeyboardEvent.swift

@@ -2,7 +2,7 @@
 //  KeyboardEvent.swift
 //  InputBarAccessoryView
 //
-//  Copyright © 2017-2019 Nathan Tannar.
+//  Copyright © 2017-2020 Nathan Tannar.
 //
 //  Permission is hereby granted, free of charge, to any person obtaining a copy
 //  of this software and associated documentation files (the "Software"), to deal

+ 7 - 4
Pods/InputBarAccessoryView/Sources/KeyboardManager/KeyboardManager.swift → deltachat-ios/Chat/InputBarAccessoryView/KeyboardManager/KeyboardManager.swift

@@ -2,7 +2,7 @@
 //  KeyboardManager.swift
 //  InputBarAccessoryView
 //
-//  Copyright © 2017-2019 Nathan Tannar.
+//  Copyright © 2017-2020 Nathan Tannar.
 //
 //  Permission is hereby granted, free of charge, to any person obtaining a copy
 //  of this software and associated documentation files (the "Software"), to deal
@@ -31,7 +31,7 @@ import UIKit
 open class KeyboardManager: NSObject, UIGestureRecognizerDelegate {
     
     /// A callback that passes a `KeyboardNotification` as an input
-    public typealias EventCallback = (KeyboardNotification)->Void
+    public typealias EventCallback = (KeyboardNotification) -> Void
     
     // MARK: - Properties [Public]
     
@@ -258,8 +258,11 @@ open class KeyboardManager: NSObject, UIGestureRecognizerDelegate {
     
     // MARK: - Helper Methods
     
-    private func animateAlongside(_ notification: KeyboardNotification, animations: @escaping ()->Void) {
-        UIView.animate(withDuration: notification.timeInterval, delay: 0, options: [notification.animationOptions, .allowAnimatedContent, .beginFromCurrentState], animations: animations, completion: nil)
+    private func animateAlongside(_ notification: KeyboardNotification, animations: @escaping () -> Void) {
+        UIView.animate(withDuration: notification.timeInterval,
+                       delay: 0,
+                       options: [notification.animationOptions, .allowAnimatedContent, .beginFromCurrentState],
+                       animations: animations, completion: nil)
     }
     
     // MARK: - UIGestureRecognizerDelegate

+ 1 - 1
Pods/InputBarAccessoryView/Sources/KeyboardManager/KeyboardNotification.swift → deltachat-ios/Chat/InputBarAccessoryView/KeyboardManager/KeyboardNotification.swift

@@ -2,7 +2,7 @@
 //  KeyboardNotification.swift
 //  InputBarAccessoryView
 //
-//  Copyright © 2017-2019 Nathan Tannar.
+//  Copyright © 2017-2020 Nathan Tannar.
 //
 //  Permission is hereby granted, free of charge, to any person obtaining a copy
 //  of this software and associated documentation files (the "Software"), to deal

+ 6 - 1
Pods/InputBarAccessoryView/Sources/Models/HorizontalEdgeInsets.swift.swift → deltachat-ios/Chat/InputBarAccessoryView/Models/HorizontalEdgePadding.swift

@@ -12,5 +12,10 @@ public struct HorizontalEdgePadding {
     public let left: CGFloat
     public let right: CGFloat
 
-    static let zero = HorizontalEdgePadding(left: 0, right: 0)
+    public static let zero = HorizontalEdgePadding(left: 0, right: 0)
+
+    public init(left: CGFloat, right: CGFloat) {
+        self.left = left
+        self.right = right
+    }
 }

+ 1 - 1
Pods/InputBarAccessoryView/Sources/Models/NSConstraintLayoutSet.swift → deltachat-ios/Chat/InputBarAccessoryView/Models/NSConstraintLayoutSet.swift

@@ -2,7 +2,7 @@
 //  NSConstraintLayoutSet.swift
 //  InputBarAccessoryView
 //
-//  Copyright © 2017-2019 Nathan Tannar.
+//  Copyright © 2017-2020 Nathan Tannar.
 //
 //  Permission is hereby granted, free of charge, to any person obtaining a copy
 //  of this software and associated documentation files (the "Software"), to deal

+ 1 - 1
Pods/InputBarAccessoryView/Sources/Protocols/InputBarAccessoryViewDelegate.swift → deltachat-ios/Chat/InputBarAccessoryView/Protocols/InputBarAccessoryViewDelegate.swift

@@ -2,7 +2,7 @@
 //  InputBarAccessoryViewDelegate.swift
 //  InputBarAccessoryView
 //
-//  Copyright © 2017-2019 Nathan Tannar.
+//  Copyright © 2017-2020 Nathan Tannar.
 //
 //  Permission is hereby granted, free of charge, to any person obtaining a copy
 //  of this software and associated documentation files (the "Software"), to deal

+ 2 - 2
Pods/InputBarAccessoryView/Sources/Protocols/InputItem.swift → deltachat-ios/Chat/InputBarAccessoryView/Protocols/InputItem.swift

@@ -2,7 +2,7 @@
 //  InputItem.swift
 //  InputBarAccessoryView
 //
-//  Copyright © 2017-2019 Nathan Tannar.
+//  Copyright © 2017-2020 Nathan Tannar.
 //
 //  Permission is hereby granted, free of charge, to any person obtaining a copy
 //  of this software and associated documentation files (the "Software"), to deal
@@ -22,7 +22,7 @@
 //  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 //  SOFTWARE.
 //
-//  Copyright © 2017-2019 Nathan Tannar. All rights reserved.
+//  Copyright © 2017-2020 Nathan Tannar. All rights reserved.
 //
 
 import UIKit

+ 2 - 2
Pods/InputBarAccessoryView/Sources/Protocols/InputPlugin.swift → deltachat-ios/Chat/InputBarAccessoryView/Protocols/InputPlugin.swift

@@ -2,7 +2,7 @@
 //  InputPlugin.swift
 //  InputBarAccessoryView
 //
-//  Copyright © 2017-2019 Nathan Tannar.
+//  Copyright © 2017-2020 Nathan Tannar.
 //
 //  Permission is hereby granted, free of charge, to any person obtaining a copy
 //  of this software and associated documentation files (the "Software"), to deal
@@ -22,7 +22,7 @@
 //  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 //  SOFTWARE.
 //
-//  Copyright © 2017-2019 Nathan Tannar. All rights reserved.
+//  Copyright © 2017-2020 Nathan Tannar. All rights reserved.
 //
 
 import UIKit

+ 8 - 4
Pods/InputBarAccessoryView/Sources/Views/SeparatorLine.swift → deltachat-ios/Chat/InputBarAccessoryView/SeparatorLine.swift

@@ -2,7 +2,7 @@
 //  SeparatorLine.swift
 //  InputBarAccessoryView
 //
-//  Copyright © 2017-2019 Nathan Tannar.
+//  Copyright © 2017-2020 Nathan Tannar.
 //
 //  Permission is hereby granted, free of charge, to any person obtaining a copy
 //  of this software and associated documentation files (the "Software"), to deal
@@ -31,7 +31,7 @@ import UIKit
  A UIView thats intrinsicContentSize is overrided so an exact height can be specified
  
  ## Important Notes ##
- 1. Default height is 1.0
+ 1. Default height is 1 pixel
  2. Default backgroundColor is UIColor.lightGray
  3. Intended to be used in an `InputStackView`
  */
@@ -40,7 +40,7 @@ open class SeparatorLine: UIView {
     // MARK: - Properties
     
     /// The height of the line
-    open var height: CGFloat = 1.0 {
+  open var height: CGFloat = 1.0 / UIScreen.main.scale {
         didSet {
             constraints.filter { $0.identifier == "height" }.forEach { $0.constant = height } // Assumes constraint was given an identifier
             invalidateIntrinsicContentSize()
@@ -65,7 +65,11 @@ open class SeparatorLine: UIView {
     
     /// Sets up the default properties
     open func setup() {
-        backgroundColor = .lightGray
+        if #available(iOS 13, *) {
+            backgroundColor = .systemGray2
+        } else {
+            backgroundColor = .lightGray
+        }
         translatesAutoresizingMaskIntoConstraints = false
         setContentHuggingPriority(.defaultHigh, for: .vertical)
     }

+ 0 - 1
deltachat-ios/Chat/Views/ChatContactRequestBar.swift

@@ -1,5 +1,4 @@
 import UIKit
-import InputBarAccessoryView
 import DcCore
 
 public protocol ChatContactRequestDelegate: class {

+ 0 - 1
deltachat-ios/Chat/Views/ChatEditingBar.swift

@@ -1,5 +1,4 @@
 import UIKit
-import InputBarAccessoryView
 import DcCore
 
 public protocol ChatEditingDelegate: class {

+ 0 - 171
deltachat-ios/Chat/Views/ChatInputBar.swift

@@ -1,171 +0,0 @@
-import UIKit
-import InputBarAccessoryView
-import DcCore
-
-
-public class ChatInputBar: InputBarAccessoryView {
-
-    var hasDraft: Bool = false
-    var hasQuote: Bool = false
-    var keyboardHeight: CGFloat = 0
-    
-    var onScrollDownButtonPressed: (() -> Void)?
-    
-    lazy var scrollDownButton: UIButton = {
-        let button = UIButton(frame: .zero)
-        button.translatesAutoresizingMaskIntoConstraints = false
-        button.addTarget(self, action: #selector(onScrollDownPressed), for: .touchUpInside)
-        button.isHidden = true
-        return button
-    }()
-
-    public convenience init() {
-        self.init(frame: .zero)
-    }
-
-    public override init(frame: CGRect) {
-        super.init(frame: frame)
-        setupKeyboardObserver()
-    }
-
-    required public init?(coder aDecoder: NSCoder) {
-        super.init(coder: aDecoder)
-        setupKeyboardObserver()
-    }
-
-    override open func setup() {
-        replaceInputBar()
-        setupScrollDownButton()
-        super.setup()
-        backgroundColor = .clear
-        backgroundView.backgroundColor = DcColors.defaultTransparentBackgroundColor
-        insertSubview(blurView, at: 0)
-        blurView.fillSuperview()
-    }
-    
-    @objc func onScrollDownPressed() {
-        if let callback = onScrollDownButtonPressed {
-            callback()
-        }
-    }
-
-    func replaceInputBar() {
-        inputTextView = ChatInputTextView()
-        inputTextView.translatesAutoresizingMaskIntoConstraints = false
-        inputTextView.inputBarAccessoryView = self
-    }
-
-    func setupKeyboardObserver() {
-        NotificationCenter.default.addObserver(
-            self,
-            selector: #selector(keyboardChanged),
-            name: UIResponder.keyboardWillChangeFrameNotification,
-            object: nil
-        )
-    }
-
-    deinit {
-        NotificationCenter.default.removeObserver(self)
-    }
-    
-    override open func calculateMaxTextViewHeight() -> CGFloat {
-        if traitCollection.verticalSizeClass == .regular || UIDevice.current.userInterfaceIdiom == .pad {
-            let divisor: CGFloat = 3
-            var subtract: CGFloat = 0
-            subtract += hasDraft ? 90 : 0
-            subtract += hasQuote ? 90 : 0
-            let height = (UIScreen.main.bounds.height / divisor).rounded(.down) - subtract
-            if height < 40 {
-                return 40
-            }
-            return height
-        } else {
-            // landscape phone layout
-            let height = UIScreen.main.bounds.height - keyboardHeight - 12
-            return height
-        }
-    }
-
-    public func configure(draft: DraftModel) {
-        hasDraft = !draft.isEditing && draft.attachment != nil
-        hasQuote = !draft.isEditing && draft.quoteText != nil
-        leftStackView.isHidden = draft.isEditing
-        rightStackView.isHidden = draft.isEditing
-        maxTextViewHeight = calculateMaxTextViewHeight()
-    }
-
-    public func cancel() {
-        hasDraft = false
-        hasQuote = false
-        maxTextViewHeight = calculateMaxTextViewHeight()
-    }
-
-    @objc func keyboardChanged(_ notification: Notification) {
-        if let keyboardFrame: NSValue = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue {
-            let keyboardRectangle = keyboardFrame.cgRectValue
-            if (keyboardRectangle.height - intrinsicContentSize.height) == keyboardHeight {
-                return
-            }
-            invalidateIntrinsicContentSize()
-            keyboardHeight = keyboardRectangle.height - intrinsicContentSize.height
-            updateTextViewHeight()
-            delegate?.inputBar(self, didChangeIntrinsicContentTo: intrinsicContentSize)
-        }
-    }
-
-    public override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
-        super.traitCollectionDidChange(previousTraitCollection)
-        if (self.traitCollection.verticalSizeClass != previousTraitCollection?.verticalSizeClass)
-                || (self.traitCollection.horizontalSizeClass != previousTraitCollection?.horizontalSizeClass) {
-            invalidateIntrinsicContentSize()
-            updateTextViewHeight()
-            delegate?.inputBar(self, didChangeIntrinsicContentTo: intrinsicContentSize)
-        }
-        scrollDownButton.layer.borderColor = DcColors.colorDisabled.cgColor
-    }
-
-    private func updateTextViewHeight() {
-        maxTextViewHeight = calculateMaxTextViewHeight()
-        if keyboardHeight > 0,
-           UIApplication.shared.statusBarOrientation.isLandscape,
-           UIDevice.current.userInterfaceIdiom == .phone {
-            setShouldForceMaxTextViewHeight(to: true, animated: false)
-        } else if shouldForceTextViewMaxHeight {
-            setShouldForceMaxTextViewHeight(to: false, animated: false)
-        }
-    }
-    
-    func setupScrollDownButton() {
-        self.addSubview(scrollDownButton)
-        NSLayoutConstraint.activate([
-            scrollDownButton.constraintAlignTopTo(self, paddingTop: -52),
-            scrollDownButton.constraintAlignTrailingToAnchor(self.safeAreaLayoutGuide.trailingAnchor, paddingTrailing: 12),
-            scrollDownButton.constraintHeightTo(40),
-            scrollDownButton.constraintWidthTo(40)
-        ])
-        scrollDownButton.backgroundColor = DcColors.defaultBackgroundColor
-        scrollDownButton.setImage(UIImage(named: "ic_scrolldown")?.sd_tintedImage(with: .systemBlue), for: .normal)
-        scrollDownButton.layer.cornerRadius = 20
-        scrollDownButton.layer.borderColor = DcColors.colorDisabled.cgColor
-        scrollDownButton.layer.borderWidth = 1
-        scrollDownButton.layer.masksToBounds = true
-        scrollDownButton.accessibilityLabel = String.localized("menu_scroll_to_bottom")
-    }
-    
-    public override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
-        if !scrollDownButton.isHidden {
-            let scrollButtonViewPoint = self.scrollDownButton.convert(point, from: self)
-            if let view = scrollDownButton.hitTest(scrollButtonViewPoint, with: event) {
-                return view
-            }
-        }
-        return super.hitTest(point, with: event)
-    }
-    
-    public override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
-        if !scrollDownButton.isHidden && scrollDownButton.point(inside: convert(point, to: scrollDownButton), with: event) {
-            return true
-        }
-        return super.point(inside: point, with: event)
-    }
-}

+ 1 - 1
deltachat-ios/Chat/Views/ChatInputTextView.swift

@@ -1,5 +1,5 @@
 import Foundation
-import InputBarAccessoryView
+import UIKit
 
 public class ChatInputTextView: InputTextView {
 

+ 0 - 1
deltachat-ios/Chat/Views/ChatSearchAccessoryBar.swift

@@ -1,5 +1,4 @@
 import UIKit
-import InputBarAccessoryView
 import DcCore
 
 public protocol ChatSearchDelegate: class {

+ 1 - 1
deltachat-ios/Chat/Views/ChatTableView.swift

@@ -1,5 +1,4 @@
 import UIKit
-import InputBarAccessoryView
 
 class ChatTableView: UITableView {
 
@@ -16,6 +15,7 @@ class ChatTableView: UITableView {
     public init(messageInputBar: InputBarAccessoryView) {
         self.messageInputBar = messageInputBar
         super.init(frame: .zero, style: .plain)
+        
     }
 
     required init?(coder: NSCoder) {

+ 2 - 3
deltachat-ios/Chat/Views/DraftArea.swift

@@ -1,6 +1,5 @@
 import UIKit
 import DcCore
-import InputBarAccessoryView
 
 public class DraftArea: UIView, InputItem {
     public var inputBarAccessoryView: InputBarAccessoryView?
@@ -68,7 +67,7 @@ public class DraftArea: UIView, InputItem {
     }
 
     public func configure(draft: DraftModel) {
-        guard let  chatInputBar = inputBarAccessoryView as? ChatInputBar else {
+        guard let  chatInputBar = inputBarAccessoryView else {
             safe_fatalError("Expecting inputBarAccessoryView of type ChatInputBar")
             return
         }
@@ -88,7 +87,7 @@ public class DraftArea: UIView, InputItem {
         quotePreview.cancel()
         mediaPreview.cancel()
         documentPreview.cancel()
-        if let chatInputBar = inputBarAccessoryView as? ChatInputBar {
+        if let chatInputBar = inputBarAccessoryView {
             chatInputBar.cancel()
         }
     }

+ 0 - 1
deltachat-ios/Chat/Views/QuotePreview.swift

@@ -1,5 +1,4 @@
 import UIKit
-import InputBarAccessoryView
 import DcCore
 
 public class QuotePreview: DraftPreview {

Vissa filer visades inte eftersom för många filer har ändrats