Explorar o código

Merge pull request #327 from deltachat/custom_textMediaCells

Custom text media cells
björn petersen %!s(int64=5) %!d(string=hai) anos
pai
achega
f429f436a9
Modificáronse 100 ficheiros con 1053 adicións e 969 borrados
  1. 1 0
      .swiftlint.yml
  2. 0 1
      Podfile
  3. BIN=BIN
      Pods/MessageKit/Assets/MessageKitAssets.bundle/Images/bubble_full.png
  4. BIN=BIN
      Pods/MessageKit/Assets/MessageKitAssets.bundle/Images/bubble_full@2x.png
  5. BIN=BIN
      Pods/MessageKit/Assets/MessageKitAssets.bundle/Images/bubble_full@3x.png
  6. BIN=BIN
      Pods/MessageKit/Assets/MessageKitAssets.bundle/Images/bubble_full_tail_v1.png
  7. BIN=BIN
      Pods/MessageKit/Assets/MessageKitAssets.bundle/Images/bubble_full_tail_v1@2x.png
  8. BIN=BIN
      Pods/MessageKit/Assets/MessageKitAssets.bundle/Images/bubble_full_tail_v1@3x.png
  9. BIN=BIN
      Pods/MessageKit/Assets/MessageKitAssets.bundle/Images/bubble_full_tail_v2.png
  10. BIN=BIN
      Pods/MessageKit/Assets/MessageKitAssets.bundle/Images/bubble_full_tail_v2@2x.png
  11. BIN=BIN
      Pods/MessageKit/Assets/MessageKitAssets.bundle/Images/bubble_full_tail_v2@3x.png
  12. BIN=BIN
      Pods/MessageKit/Assets/MessageKitAssets.bundle/Images/bubble_outlined.png
  13. BIN=BIN
      Pods/MessageKit/Assets/MessageKitAssets.bundle/Images/bubble_outlined@2x.png
  14. BIN=BIN
      Pods/MessageKit/Assets/MessageKitAssets.bundle/Images/bubble_outlined@3x.png
  15. BIN=BIN
      Pods/MessageKit/Assets/MessageKitAssets.bundle/Images/bubble_outlined_tail_v1.png
  16. BIN=BIN
      Pods/MessageKit/Assets/MessageKitAssets.bundle/Images/bubble_outlined_tail_v1@2x.png
  17. BIN=BIN
      Pods/MessageKit/Assets/MessageKitAssets.bundle/Images/bubble_outlined_tail_v1@3x.png
  18. BIN=BIN
      Pods/MessageKit/Assets/MessageKitAssets.bundle/Images/bubble_outlined_tail_v2.png
  19. BIN=BIN
      Pods/MessageKit/Assets/MessageKitAssets.bundle/Images/bubble_outlined_tail_v2@2x.png
  20. BIN=BIN
      Pods/MessageKit/Assets/MessageKitAssets.bundle/Images/bubble_outlined_tail_v2@3x.png
  21. BIN=BIN
      Pods/MessageKit/Assets/MessageKitAssets.bundle/Images/disclouser.png
  22. BIN=BIN
      Pods/MessageKit/Assets/MessageKitAssets.bundle/Images/disclouser@2x.png
  23. BIN=BIN
      Pods/MessageKit/Assets/MessageKitAssets.bundle/Images/disclouser@3x.png
  24. BIN=BIN
      Pods/MessageKit/Assets/MessageKitAssets.bundle/Images/pause.png
  25. BIN=BIN
      Pods/MessageKit/Assets/MessageKitAssets.bundle/Images/pause@2x.png
  26. BIN=BIN
      Pods/MessageKit/Assets/MessageKitAssets.bundle/Images/pause@3x.png
  27. BIN=BIN
      Pods/MessageKit/Assets/MessageKitAssets.bundle/Images/play.png
  28. BIN=BIN
      Pods/MessageKit/Assets/MessageKitAssets.bundle/Images/play@2x.png
  29. BIN=BIN
      Pods/MessageKit/Assets/MessageKitAssets.bundle/Images/play@3x.png
  30. 0 325
      Pods/Pods.xcodeproj/project.pbxproj
  31. 0 26
      Pods/Target Support Files/MessageKit/MessageKit-Info.plist
  32. 0 5
      Pods/Target Support Files/MessageKit/MessageKit-dummy.m
  33. 0 12
      Pods/Target Support Files/MessageKit/MessageKit-prefix.pch
  34. 0 16
      Pods/Target Support Files/MessageKit/MessageKit-umbrella.h
  35. 0 6
      Pods/Target Support Files/MessageKit/MessageKit.modulemap
  36. 0 11
      Pods/Target Support Files/MessageKit/MessageKit.xcconfig
  37. 0 24
      Pods/Target Support Files/MessageKit/ResourceBundle-MessageKitAssets-MessageKit-Info.plist
  38. 0 2
      Pods/Target Support Files/Pods-deltachat-ios/Pods-deltachat-ios-frameworks.sh
  39. 4 4
      Pods/Target Support Files/Pods-deltachat-ios/Pods-deltachat-ios.debug.xcconfig
  40. 4 4
      Pods/Target Support Files/Pods-deltachat-ios/Pods-deltachat-ios.release.xcconfig
  41. 3 3
      Pods/Target Support Files/Pods-deltachat-iosTests/Pods-deltachat-iosTests.debug.xcconfig
  42. 3 3
      Pods/Target Support Files/Pods-deltachat-iosTests/Pods-deltachat-iosTests.release.xcconfig
  43. 352 6
      deltachat-ios.xcodeproj/project.pbxproj
  44. 6 2
      deltachat-ios/Controller/ChatViewController.swift
  45. 0 1
      deltachat-ios/Controller/MailboxViewController.swift
  46. 5 2
      deltachat-ios/DC/Wrapper.swift
  47. 0 0
      deltachat-ios/Extensions/Bundle+Extensions.swift
  48. 1 0
      deltachat-ios/Extensions/CGRect+Extensions.swift
  49. 51 0
      deltachat-ios/Extensions/DcContact+Extension.swift
  50. 58 0
      deltachat-ios/Extensions/Extensions.swift
  51. 7 0
      deltachat-ios/Extensions/NSAttributedString+Extensions.swift
  52. 76 0
      deltachat-ios/Extensions/String+Extension.swift
  53. 36 0
      deltachat-ios/Extensions/UIColor+Extensions.swift
  54. 1 0
      deltachat-ios/Extensions/UIEdgeInsets+Extensions.swift
  55. 111 0
      deltachat-ios/Extensions/UIImage+Extension.swift
  56. 118 15
      deltachat-ios/Extensions/UIView+Extensions.swift
  57. 0 273
      deltachat-ios/Helper/Extensions.swift
  58. 0 49
      deltachat-ios/Helper/UIImage+Extension.swift
  59. 0 101
      deltachat-ios/Helper/UIView+Extension.swift
  60. 13 7
      deltachat-ios/MessageKit/Controllers/MessagesViewController+Keyboard.swift
  61. 16 6
      deltachat-ios/MessageKit/Controllers/MessagesViewController+Menu.swift
  62. 13 4
      deltachat-ios/MessageKit/Controllers/MessagesViewController.swift
  63. 1 0
      deltachat-ios/MessageKit/Layout/AudioMessageSizeCalculator.swift
  64. 0 0
      deltachat-ios/MessageKit/Layout/CellSizeCalculator.swift
  65. 11 10
      deltachat-ios/MessageKit/Layout/ContactMessageSizeCalculator.swift
  66. 1 0
      deltachat-ios/MessageKit/Layout/LocationMessageSizeCalculator.swift
  67. 1 0
      deltachat-ios/MessageKit/Layout/MediaMessageSizeCalculator.swift
  68. 1 0
      deltachat-ios/MessageKit/Layout/MessageSizeCalculator.swift
  69. 25 18
      deltachat-ios/MessageKit/Layout/MessagesCollectionViewFlowLayout.swift
  70. 3 3
      deltachat-ios/MessageKit/Layout/MessagesCollectionViewLayoutAttributes.swift
  71. 101 0
      deltachat-ios/MessageKit/Layout/TextMediaMessageSizeCalculator.swift
  72. 1 0
      deltachat-ios/MessageKit/Layout/TextMessageSizeCalculator.swift
  73. 0 0
      deltachat-ios/MessageKit/Layout/TypingIndicatorCellSizeCalculator.swift
  74. 0 0
      deltachat-ios/MessageKit/Models/AccessoryPosition.swift
  75. 1 0
      deltachat-ios/MessageKit/Models/Avatar.swift
  76. 0 0
      deltachat-ios/MessageKit/Models/AvatarPosition.swift
  77. 0 0
      deltachat-ios/MessageKit/Models/DetectorType.swift
  78. 2 1
      deltachat-ios/MessageKit/Models/HorizontalEdgeInsets.swift
  79. 0 0
      deltachat-ios/MessageKit/Models/LabelAlignment.swift
  80. 0 0
      deltachat-ios/MessageKit/Models/LocationMessageSnapshotOptions.swift
  81. 4 1
      deltachat-ios/MessageKit/Models/MessageKind.swift
  82. 0 0
      deltachat-ios/MessageKit/Models/MessageKitDateFormatter.swift
  83. 0 0
      deltachat-ios/MessageKit/Models/MessageKitError.swift
  84. 0 0
      deltachat-ios/MessageKit/Models/MessageStyle.swift
  85. 0 0
      deltachat-ios/MessageKit/Models/NSConstraintLayoutSet.swift
  86. 0 0
      deltachat-ios/MessageKit/Models/Sender.swift
  87. 1 0
      deltachat-ios/MessageKit/Protocols/AudioItem.swift
  88. 0 0
      deltachat-ios/MessageKit/Protocols/ContactItem.swift
  89. 1 0
      deltachat-ios/MessageKit/Protocols/LocationItem.swift
  90. 3 0
      deltachat-ios/MessageKit/Protocols/MediaItem.swift
  91. 0 0
      deltachat-ios/MessageKit/Protocols/MessageCellDelegate.swift
  92. 0 0
      deltachat-ios/MessageKit/Protocols/MessageLabelDelegate.swift
  93. 0 0
      deltachat-ios/MessageKit/Protocols/MessageType.swift
  94. 5 5
      deltachat-ios/MessageKit/Protocols/MessagesDataSource.swift
  95. 4 3
      deltachat-ios/MessageKit/Protocols/MessagesDisplayDelegate.swift
  96. 3 2
      deltachat-ios/MessageKit/Protocols/MessagesLayoutDelegate.swift
  97. 0 0
      deltachat-ios/MessageKit/Protocols/SenderType.swift
  98. 0 0
      deltachat-ios/MessageKit/Supporting/MessageInputBar.swift
  99. 1 0
      deltachat-ios/MessageKit/Supporting/MessageKit+Availability.swift
  100. 4 18
      deltachat-ios/MessageKit/Supporting/MessageKit.h

+ 1 - 0
.swiftlint.yml

@@ -6,6 +6,7 @@ disabled_rules:
 - trailing_comma
 - large_tuple
 - todo
+- trailing_whitespace
 
 excluded:
 - Carthage

+ 0 - 1
Podfile

@@ -16,7 +16,6 @@ target 'deltachat-ios' do
   pod 'JGProgressHUD'
   pod 'SwiftyBeaver'
   pod 'DBDebugToolkit'
-  pod 'MessageKit'
 
   target 'deltachat-iosTests' do
     inherit! :search_paths

BIN=BIN
Pods/MessageKit/Assets/MessageKitAssets.bundle/Images/bubble_full.png


BIN=BIN
Pods/MessageKit/Assets/MessageKitAssets.bundle/Images/bubble_full@2x.png


BIN=BIN
Pods/MessageKit/Assets/MessageKitAssets.bundle/Images/bubble_full@3x.png


BIN=BIN
Pods/MessageKit/Assets/MessageKitAssets.bundle/Images/bubble_full_tail_v1.png


BIN=BIN
Pods/MessageKit/Assets/MessageKitAssets.bundle/Images/bubble_full_tail_v1@2x.png


BIN=BIN
Pods/MessageKit/Assets/MessageKitAssets.bundle/Images/bubble_full_tail_v1@3x.png


BIN=BIN
Pods/MessageKit/Assets/MessageKitAssets.bundle/Images/bubble_full_tail_v2.png


BIN=BIN
Pods/MessageKit/Assets/MessageKitAssets.bundle/Images/bubble_full_tail_v2@2x.png


BIN=BIN
Pods/MessageKit/Assets/MessageKitAssets.bundle/Images/bubble_full_tail_v2@3x.png


BIN=BIN
Pods/MessageKit/Assets/MessageKitAssets.bundle/Images/bubble_outlined.png


BIN=BIN
Pods/MessageKit/Assets/MessageKitAssets.bundle/Images/bubble_outlined@2x.png


BIN=BIN
Pods/MessageKit/Assets/MessageKitAssets.bundle/Images/bubble_outlined@3x.png


BIN=BIN
Pods/MessageKit/Assets/MessageKitAssets.bundle/Images/bubble_outlined_tail_v1.png


BIN=BIN
Pods/MessageKit/Assets/MessageKitAssets.bundle/Images/bubble_outlined_tail_v1@2x.png


BIN=BIN
Pods/MessageKit/Assets/MessageKitAssets.bundle/Images/bubble_outlined_tail_v1@3x.png


BIN=BIN
Pods/MessageKit/Assets/MessageKitAssets.bundle/Images/bubble_outlined_tail_v2.png


BIN=BIN
Pods/MessageKit/Assets/MessageKitAssets.bundle/Images/bubble_outlined_tail_v2@2x.png


BIN=BIN
Pods/MessageKit/Assets/MessageKitAssets.bundle/Images/bubble_outlined_tail_v2@3x.png


BIN=BIN
Pods/MessageKit/Assets/MessageKitAssets.bundle/Images/disclouser.png


BIN=BIN
Pods/MessageKit/Assets/MessageKitAssets.bundle/Images/disclouser@2x.png


BIN=BIN
Pods/MessageKit/Assets/MessageKitAssets.bundle/Images/disclouser@3x.png


BIN=BIN
Pods/MessageKit/Assets/MessageKitAssets.bundle/Images/pause.png


BIN=BIN
Pods/MessageKit/Assets/MessageKitAssets.bundle/Images/pause@2x.png


BIN=BIN
Pods/MessageKit/Assets/MessageKitAssets.bundle/Images/pause@3x.png


BIN=BIN
Pods/MessageKit/Assets/MessageKitAssets.bundle/Images/play.png


BIN=BIN
Pods/MessageKit/Assets/MessageKitAssets.bundle/Images/play@2x.png


BIN=BIN
Pods/MessageKit/Assets/MessageKitAssets.bundle/Images/play@3x.png


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 325
Pods/Pods.xcodeproj/project.pbxproj


+ 0 - 26
Pods/Target Support Files/MessageKit/MessageKit-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>3.0.0</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/MessageKit/MessageKit-dummy.m

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

+ 0 - 12
Pods/Target Support Files/MessageKit/MessageKit-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/MessageKit/MessageKit-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 MessageKitVersionNumber;
-FOUNDATION_EXPORT const unsigned char MessageKitVersionString[];
-

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

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

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

@@ -1,11 +0,0 @@
-CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/MessageKit
-FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/InputBarAccessoryView"
-GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
-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}/MessageKit
-PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
-SKIP_INSTALL = YES
-SWIFT_VERSION = 4.2

+ 0 - 24
Pods/Target Support Files/MessageKit/ResourceBundle-MessageKitAssets-MessageKit-Info.plist

@@ -1,24 +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>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>BNDL</string>
-  <key>CFBundleShortVersionString</key>
-  <string>3.0.0</string>
-  <key>CFBundleSignature</key>
-  <string>????</string>
-  <key>CFBundleVersion</key>
-  <string>1</string>
-  <key>NSPrincipalClass</key>
-  <string></string>
-</dict>
-</plist>

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

@@ -157,7 +157,6 @@ if [[ "$CONFIGURATION" == "Debug" ]]; then
   install_framework "${BUILT_PRODUCTS_DIR}/DBDebugToolkit/DBDebugToolkit.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/InputBarAccessoryView/InputBarAccessoryView.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/JGProgressHUD/JGProgressHUD.framework"
-  install_framework "${BUILT_PRODUCTS_DIR}/MessageKit/MessageKit.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/QuickTableViewController/QuickTableViewController.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/ReachabilitySwift/Reachability.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/SwiftyBeaver/SwiftyBeaver.framework"
@@ -168,7 +167,6 @@ if [[ "$CONFIGURATION" == "Release" ]]; then
   install_framework "${BUILT_PRODUCTS_DIR}/DBDebugToolkit/DBDebugToolkit.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/InputBarAccessoryView/InputBarAccessoryView.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/JGProgressHUD/JGProgressHUD.framework"
-  install_framework "${BUILT_PRODUCTS_DIR}/MessageKit/MessageKit.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/QuickTableViewController/QuickTableViewController.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/ReachabilitySwift/Reachability.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/SwiftyBeaver/SwiftyBeaver.framework"

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

@@ -1,10 +1,10 @@
 ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES
-FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/ALCameraViewController" "${PODS_CONFIGURATION_BUILD_DIR}/DBDebugToolkit" "${PODS_CONFIGURATION_BUILD_DIR}/InputBarAccessoryView" "${PODS_CONFIGURATION_BUILD_DIR}/JGProgressHUD" "${PODS_CONFIGURATION_BUILD_DIR}/MessageKit" "${PODS_CONFIGURATION_BUILD_DIR}/QuickTableViewController" "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyBeaver" "${PODS_CONFIGURATION_BUILD_DIR}/UICircularProgressRing"
+FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/ALCameraViewController" "${PODS_CONFIGURATION_BUILD_DIR}/DBDebugToolkit" "${PODS_CONFIGURATION_BUILD_DIR}/InputBarAccessoryView" "${PODS_CONFIGURATION_BUILD_DIR}/JGProgressHUD" "${PODS_CONFIGURATION_BUILD_DIR}/QuickTableViewController" "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyBeaver" "${PODS_CONFIGURATION_BUILD_DIR}/UICircularProgressRing"
 GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
-HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/ALCameraViewController/ALCameraViewController.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/DBDebugToolkit/DBDebugToolkit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/InputBarAccessoryView/InputBarAccessoryView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/JGProgressHUD/JGProgressHUD.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/MessageKit/MessageKit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/QuickTableViewController/QuickTableViewController.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift/Reachability.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyBeaver/SwiftyBeaver.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/UICircularProgressRing/UICircularProgressRing.framework/Headers"
+HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/ALCameraViewController/ALCameraViewController.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/DBDebugToolkit/DBDebugToolkit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/InputBarAccessoryView/InputBarAccessoryView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/JGProgressHUD/JGProgressHUD.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/QuickTableViewController/QuickTableViewController.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift/Reachability.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyBeaver/SwiftyBeaver.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/UICircularProgressRing/UICircularProgressRing.framework/Headers"
 LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks'
-OTHER_CFLAGS = $(inherited) -isystem "${PODS_CONFIGURATION_BUILD_DIR}/ALCameraViewController/ALCameraViewController.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}/JGProgressHUD/JGProgressHUD.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/MessageKit/MessageKit.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/QuickTableViewController/QuickTableViewController.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift/Reachability.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyBeaver/SwiftyBeaver.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/UICircularProgressRing/UICircularProgressRing.framework/Headers" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/ALCameraViewController" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/DBDebugToolkit" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/InputBarAccessoryView" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/JGProgressHUD" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/MessageKit" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/QuickTableViewController" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyBeaver" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/UICircularProgressRing"
-OTHER_LDFLAGS = $(inherited) -framework "ALCameraViewController" -framework "CoreTelephony" -framework "DBDebugToolkit" -framework "Foundation" -framework "InputBarAccessoryView" -framework "JGProgressHUD" -framework "MessageKit" -framework "QuartzCore" -framework "QuickTableViewController" -framework "Reachability" -framework "SwiftyBeaver" -framework "SystemConfiguration" -framework "UICircularProgressRing" -framework "UIKit"
+OTHER_CFLAGS = $(inherited) -isystem "${PODS_CONFIGURATION_BUILD_DIR}/ALCameraViewController/ALCameraViewController.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}/JGProgressHUD/JGProgressHUD.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/QuickTableViewController/QuickTableViewController.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift/Reachability.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyBeaver/SwiftyBeaver.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/UICircularProgressRing/UICircularProgressRing.framework/Headers" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/ALCameraViewController" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/DBDebugToolkit" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/InputBarAccessoryView" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/JGProgressHUD" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/QuickTableViewController" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyBeaver" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/UICircularProgressRing"
+OTHER_LDFLAGS = $(inherited) -framework "ALCameraViewController" -framework "CoreTelephony" -framework "DBDebugToolkit" -framework "Foundation" -framework "InputBarAccessoryView" -framework "JGProgressHUD" -framework "QuartzCore" -framework "QuickTableViewController" -framework "Reachability" -framework "SwiftyBeaver" -framework "SystemConfiguration" -framework "UICircularProgressRing" -framework "UIKit"
 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,10 +1,10 @@
 ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES
-FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/ALCameraViewController" "${PODS_CONFIGURATION_BUILD_DIR}/DBDebugToolkit" "${PODS_CONFIGURATION_BUILD_DIR}/InputBarAccessoryView" "${PODS_CONFIGURATION_BUILD_DIR}/JGProgressHUD" "${PODS_CONFIGURATION_BUILD_DIR}/MessageKit" "${PODS_CONFIGURATION_BUILD_DIR}/QuickTableViewController" "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyBeaver" "${PODS_CONFIGURATION_BUILD_DIR}/UICircularProgressRing"
+FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/ALCameraViewController" "${PODS_CONFIGURATION_BUILD_DIR}/DBDebugToolkit" "${PODS_CONFIGURATION_BUILD_DIR}/InputBarAccessoryView" "${PODS_CONFIGURATION_BUILD_DIR}/JGProgressHUD" "${PODS_CONFIGURATION_BUILD_DIR}/QuickTableViewController" "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyBeaver" "${PODS_CONFIGURATION_BUILD_DIR}/UICircularProgressRing"
 GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
-HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/ALCameraViewController/ALCameraViewController.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/DBDebugToolkit/DBDebugToolkit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/InputBarAccessoryView/InputBarAccessoryView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/JGProgressHUD/JGProgressHUD.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/MessageKit/MessageKit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/QuickTableViewController/QuickTableViewController.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift/Reachability.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyBeaver/SwiftyBeaver.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/UICircularProgressRing/UICircularProgressRing.framework/Headers"
+HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/ALCameraViewController/ALCameraViewController.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/DBDebugToolkit/DBDebugToolkit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/InputBarAccessoryView/InputBarAccessoryView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/JGProgressHUD/JGProgressHUD.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/QuickTableViewController/QuickTableViewController.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift/Reachability.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyBeaver/SwiftyBeaver.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/UICircularProgressRing/UICircularProgressRing.framework/Headers"
 LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks'
-OTHER_CFLAGS = $(inherited) -isystem "${PODS_CONFIGURATION_BUILD_DIR}/ALCameraViewController/ALCameraViewController.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}/JGProgressHUD/JGProgressHUD.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/MessageKit/MessageKit.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/QuickTableViewController/QuickTableViewController.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift/Reachability.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyBeaver/SwiftyBeaver.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/UICircularProgressRing/UICircularProgressRing.framework/Headers" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/ALCameraViewController" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/DBDebugToolkit" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/InputBarAccessoryView" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/JGProgressHUD" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/MessageKit" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/QuickTableViewController" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyBeaver" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/UICircularProgressRing"
-OTHER_LDFLAGS = $(inherited) -framework "ALCameraViewController" -framework "CoreTelephony" -framework "DBDebugToolkit" -framework "Foundation" -framework "InputBarAccessoryView" -framework "JGProgressHUD" -framework "MessageKit" -framework "QuartzCore" -framework "QuickTableViewController" -framework "Reachability" -framework "SwiftyBeaver" -framework "SystemConfiguration" -framework "UICircularProgressRing" -framework "UIKit"
+OTHER_CFLAGS = $(inherited) -isystem "${PODS_CONFIGURATION_BUILD_DIR}/ALCameraViewController/ALCameraViewController.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}/JGProgressHUD/JGProgressHUD.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/QuickTableViewController/QuickTableViewController.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift/Reachability.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyBeaver/SwiftyBeaver.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/UICircularProgressRing/UICircularProgressRing.framework/Headers" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/ALCameraViewController" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/DBDebugToolkit" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/InputBarAccessoryView" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/JGProgressHUD" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/QuickTableViewController" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyBeaver" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/UICircularProgressRing"
+OTHER_LDFLAGS = $(inherited) -framework "ALCameraViewController" -framework "CoreTelephony" -framework "DBDebugToolkit" -framework "Foundation" -framework "InputBarAccessoryView" -framework "JGProgressHUD" -framework "QuartzCore" -framework "QuickTableViewController" -framework "Reachability" -framework "SwiftyBeaver" -framework "SystemConfiguration" -framework "UICircularProgressRing" -framework "UIKit"
 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 @@
-FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/ALCameraViewController" "${PODS_CONFIGURATION_BUILD_DIR}/DBDebugToolkit" "${PODS_CONFIGURATION_BUILD_DIR}/InputBarAccessoryView" "${PODS_CONFIGURATION_BUILD_DIR}/JGProgressHUD" "${PODS_CONFIGURATION_BUILD_DIR}/MessageKit" "${PODS_CONFIGURATION_BUILD_DIR}/QuickTableViewController" "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyBeaver" "${PODS_CONFIGURATION_BUILD_DIR}/UICircularProgressRing"
+FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/ALCameraViewController" "${PODS_CONFIGURATION_BUILD_DIR}/DBDebugToolkit" "${PODS_CONFIGURATION_BUILD_DIR}/InputBarAccessoryView" "${PODS_CONFIGURATION_BUILD_DIR}/JGProgressHUD" "${PODS_CONFIGURATION_BUILD_DIR}/QuickTableViewController" "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyBeaver" "${PODS_CONFIGURATION_BUILD_DIR}/UICircularProgressRing"
 GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
-HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/ALCameraViewController/ALCameraViewController.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/DBDebugToolkit/DBDebugToolkit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/InputBarAccessoryView/InputBarAccessoryView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/JGProgressHUD/JGProgressHUD.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/MessageKit/MessageKit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/QuickTableViewController/QuickTableViewController.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift/Reachability.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyBeaver/SwiftyBeaver.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/UICircularProgressRing/UICircularProgressRing.framework/Headers"
+HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/ALCameraViewController/ALCameraViewController.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/DBDebugToolkit/DBDebugToolkit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/InputBarAccessoryView/InputBarAccessoryView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/JGProgressHUD/JGProgressHUD.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/QuickTableViewController/QuickTableViewController.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift/Reachability.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyBeaver/SwiftyBeaver.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/UICircularProgressRing/UICircularProgressRing.framework/Headers"
 LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks'
-OTHER_LDFLAGS = $(inherited) -framework "ALCameraViewController" -framework "CoreTelephony" -framework "DBDebugToolkit" -framework "Foundation" -framework "InputBarAccessoryView" -framework "JGProgressHUD" -framework "MessageKit" -framework "QuartzCore" -framework "QuickTableViewController" -framework "Reachability" -framework "SwiftyBeaver" -framework "SystemConfiguration" -framework "UICircularProgressRing" -framework "UIKit"
+OTHER_LDFLAGS = $(inherited) -framework "ALCameraViewController" -framework "CoreTelephony" -framework "DBDebugToolkit" -framework "Foundation" -framework "InputBarAccessoryView" -framework "JGProgressHUD" -framework "QuartzCore" -framework "QuickTableViewController" -framework "Reachability" -framework "SwiftyBeaver" -framework "SystemConfiguration" -framework "UICircularProgressRing" -framework "UIKit"
 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 @@
-FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/ALCameraViewController" "${PODS_CONFIGURATION_BUILD_DIR}/DBDebugToolkit" "${PODS_CONFIGURATION_BUILD_DIR}/InputBarAccessoryView" "${PODS_CONFIGURATION_BUILD_DIR}/JGProgressHUD" "${PODS_CONFIGURATION_BUILD_DIR}/MessageKit" "${PODS_CONFIGURATION_BUILD_DIR}/QuickTableViewController" "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyBeaver" "${PODS_CONFIGURATION_BUILD_DIR}/UICircularProgressRing"
+FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/ALCameraViewController" "${PODS_CONFIGURATION_BUILD_DIR}/DBDebugToolkit" "${PODS_CONFIGURATION_BUILD_DIR}/InputBarAccessoryView" "${PODS_CONFIGURATION_BUILD_DIR}/JGProgressHUD" "${PODS_CONFIGURATION_BUILD_DIR}/QuickTableViewController" "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyBeaver" "${PODS_CONFIGURATION_BUILD_DIR}/UICircularProgressRing"
 GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
-HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/ALCameraViewController/ALCameraViewController.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/DBDebugToolkit/DBDebugToolkit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/InputBarAccessoryView/InputBarAccessoryView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/JGProgressHUD/JGProgressHUD.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/MessageKit/MessageKit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/QuickTableViewController/QuickTableViewController.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift/Reachability.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyBeaver/SwiftyBeaver.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/UICircularProgressRing/UICircularProgressRing.framework/Headers"
+HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/ALCameraViewController/ALCameraViewController.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/DBDebugToolkit/DBDebugToolkit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/InputBarAccessoryView/InputBarAccessoryView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/JGProgressHUD/JGProgressHUD.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/QuickTableViewController/QuickTableViewController.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift/Reachability.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyBeaver/SwiftyBeaver.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/UICircularProgressRing/UICircularProgressRing.framework/Headers"
 LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks'
-OTHER_LDFLAGS = $(inherited) -framework "ALCameraViewController" -framework "CoreTelephony" -framework "DBDebugToolkit" -framework "Foundation" -framework "InputBarAccessoryView" -framework "JGProgressHUD" -framework "MessageKit" -framework "QuartzCore" -framework "QuickTableViewController" -framework "Reachability" -framework "SwiftyBeaver" -framework "SystemConfiguration" -framework "UICircularProgressRing" -framework "UIKit"
+OTHER_LDFLAGS = $(inherited) -framework "ALCameraViewController" -framework "CoreTelephony" -framework "DBDebugToolkit" -framework "Foundation" -framework "InputBarAccessoryView" -framework "JGProgressHUD" -framework "QuartzCore" -framework "QuickTableViewController" -framework "Reachability" -framework "SwiftyBeaver" -framework "SystemConfiguration" -framework "UICircularProgressRing" -framework "UIKit"
 PODS_BUILD_DIR = ${BUILD_DIR}
 PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
 PODS_PODFILE_DIR_PATH = ${SRCROOT}/.

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

@@ -7,12 +7,78 @@
 	objects = {
 
 /* Begin PBXBuildFile section */
+		300C509D234B551900F8AE22 /* TextMediaMessageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 300C509C234B551900F8AE22 /* TextMediaMessageCell.swift */; };
+		300C50A1234BDAB800F8AE22 /* TextMediaMessageSizeCalculator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 300C50A0234BDAB800F8AE22 /* TextMediaMessageSizeCalculator.swift */; };
 		30149D9322F21129003C12B5 /* QrViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30149D9222F21129003C12B5 /* QrViewController.swift */; };
 		3022E6BE22E8768800763272 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 3022E6C022E8768800763272 /* InfoPlist.strings */; };
+		305961CC2346125100C80F33 /* UIView+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305961822346125000C80F33 /* UIView+Extensions.swift */; };
+		305961CD2346125100C80F33 /* UIEdgeInsets+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305961832346125000C80F33 /* UIEdgeInsets+Extensions.swift */; };
+		305961CF2346125100C80F33 /* UIColor+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305961852346125000C80F33 /* UIColor+Extensions.swift */; };
+		305961D02346125100C80F33 /* NSAttributedString+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305961862346125000C80F33 /* NSAttributedString+Extensions.swift */; };
+		305961D12346125100C80F33 /* Bundle+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305961872346125000C80F33 /* Bundle+Extensions.swift */; };
+		305961D22346125100C80F33 /* CGRect+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305961882346125000C80F33 /* CGRect+Extensions.swift */; };
+		305961D32346125100C80F33 /* MessagesViewController+Keyboard.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3059618A2346125000C80F33 /* MessagesViewController+Keyboard.swift */; };
+		305961D42346125100C80F33 /* MessagesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3059618B2346125000C80F33 /* MessagesViewController.swift */; };
+		305961D52346125100C80F33 /* MessagesViewController+Menu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3059618C2346125000C80F33 /* MessagesViewController+Menu.swift */; };
+		305961D62346125100C80F33 /* MessageInputBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3059618E2346125000C80F33 /* MessageInputBar.swift */; };
+		305961D72346125100C80F33 /* MessageKit+Availability.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305961902346125000C80F33 /* MessageKit+Availability.swift */; };
+		305961D92346125100C80F33 /* ContactItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305961932346125000C80F33 /* ContactItem.swift */; };
+		305961DA2346125100C80F33 /* MediaItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305961942346125000C80F33 /* MediaItem.swift */; };
+		305961DB2346125100C80F33 /* AudioItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305961952346125000C80F33 /* AudioItem.swift */; };
+		305961DC2346125100C80F33 /* MessagesLayoutDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305961962346125000C80F33 /* MessagesLayoutDelegate.swift */; };
+		305961DD2346125100C80F33 /* SenderType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305961972346125000C80F33 /* SenderType.swift */; };
+		305961DE2346125100C80F33 /* MessageType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305961982346125000C80F33 /* MessageType.swift */; };
+		305961DF2346125100C80F33 /* MessageCellDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305961992346125000C80F33 /* MessageCellDelegate.swift */; };
+		305961E02346125100C80F33 /* MessageLabelDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3059619A2346125000C80F33 /* MessageLabelDelegate.swift */; };
+		305961E12346125100C80F33 /* LocationItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3059619B2346125000C80F33 /* LocationItem.swift */; };
+		305961E22346125100C80F33 /* MessagesDisplayDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3059619C2346125000C80F33 /* MessagesDisplayDelegate.swift */; };
+		305961E32346125100C80F33 /* MessagesDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3059619D2346125000C80F33 /* MessagesDataSource.swift */; };
+		305961E42346125100C80F33 /* MessageKitDateFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3059619F2346125100C80F33 /* MessageKitDateFormatter.swift */; };
+		305961E52346125100C80F33 /* LabelAlignment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305961A02346125100C80F33 /* LabelAlignment.swift */; };
+		305961E62346125100C80F33 /* LocationMessageSnapshotOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305961A12346125100C80F33 /* LocationMessageSnapshotOptions.swift */; };
+		305961E72346125100C80F33 /* AccessoryPosition.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305961A22346125100C80F33 /* AccessoryPosition.swift */; };
+		305961E82346125100C80F33 /* Sender.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305961A32346125100C80F33 /* Sender.swift */; };
+		305961E92346125100C80F33 /* MessageKind.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305961A42346125100C80F33 /* MessageKind.swift */; };
+		305961EA2346125100C80F33 /* MessageStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305961A52346125100C80F33 /* MessageStyle.swift */; };
+		305961EB2346125100C80F33 /* MessageKitError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305961A62346125100C80F33 /* MessageKitError.swift */; };
+		305961EC2346125100C80F33 /* Avatar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305961A72346125100C80F33 /* Avatar.swift */; };
+		305961ED2346125100C80F33 /* DetectorType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305961A82346125100C80F33 /* DetectorType.swift */; };
+		305961EE2346125100C80F33 /* AvatarPosition.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305961A92346125100C80F33 /* AvatarPosition.swift */; };
+		305961EF2346125100C80F33 /* HorizontalEdgeInsets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305961AA2346125100C80F33 /* HorizontalEdgeInsets.swift */; };
+		305961F02346125100C80F33 /* NSConstraintLayoutSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305961AB2346125100C80F33 /* NSConstraintLayoutSet.swift */; };
+		305961F12346125100C80F33 /* ContactMessageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305961AE2346125100C80F33 /* ContactMessageCell.swift */; };
+		305961F22346125100C80F33 /* LocationMessageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305961AF2346125100C80F33 /* LocationMessageCell.swift */; };
+		305961F32346125100C80F33 /* MediaMessageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305961B02346125100C80F33 /* MediaMessageCell.swift */; };
+		305961F42346125100C80F33 /* TextMessageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305961B12346125100C80F33 /* TextMessageCell.swift */; };
+		305961F52346125100C80F33 /* TypingIndicatorCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305961B22346125100C80F33 /* TypingIndicatorCell.swift */; };
+		305961F62346125100C80F33 /* MessageContentCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305961B32346125100C80F33 /* MessageContentCell.swift */; };
+		305961F72346125100C80F33 /* MessageCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305961B42346125100C80F33 /* MessageCollectionViewCell.swift */; };
+		305961F82346125100C80F33 /* AudioMessageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305961B52346125100C80F33 /* AudioMessageCell.swift */; };
+		305961F92346125100C80F33 /* MessageLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305961B62346125100C80F33 /* MessageLabel.swift */; };
+		305961FA2346125100C80F33 /* MessageReusableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305961B82346125100C80F33 /* MessageReusableView.swift */; };
+		305961FB2346125100C80F33 /* TypingIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305961B92346125100C80F33 /* TypingIndicator.swift */; };
+		305961FC2346125100C80F33 /* MessageContainerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305961BA2346125100C80F33 /* MessageContainerView.swift */; };
+		305961FD2346125100C80F33 /* TypingBubble.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305961BB2346125100C80F33 /* TypingBubble.swift */; };
+		305961FE2346125100C80F33 /* InsetLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305961BC2346125100C80F33 /* InsetLabel.swift */; };
+		305961FF2346125100C80F33 /* AvatarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305961BD2346125100C80F33 /* AvatarView.swift */; };
+		305962002346125100C80F33 /* MessagesCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305961BE2346125100C80F33 /* MessagesCollectionView.swift */; };
+		305962012346125100C80F33 /* PlayButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305961BF2346125100C80F33 /* PlayButtonView.swift */; };
+		305962022346125100C80F33 /* BubbleCircle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305961C02346125100C80F33 /* BubbleCircle.swift */; };
+		305962032346125100C80F33 /* CellSizeCalculator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305961C22346125100C80F33 /* CellSizeCalculator.swift */; };
+		305962042346125100C80F33 /* MessagesCollectionViewLayoutAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305961C32346125100C80F33 /* MessagesCollectionViewLayoutAttributes.swift */; };
+		305962052346125100C80F33 /* ContactMessageSizeCalculator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305961C42346125100C80F33 /* ContactMessageSizeCalculator.swift */; };
+		305962062346125100C80F33 /* TypingIndicatorCellSizeCalculator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305961C52346125100C80F33 /* TypingIndicatorCellSizeCalculator.swift */; };
+		305962072346125100C80F33 /* MessagesCollectionViewFlowLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305961C62346125100C80F33 /* MessagesCollectionViewFlowLayout.swift */; };
+		305962082346125100C80F33 /* MediaMessageSizeCalculator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305961C72346125100C80F33 /* MediaMessageSizeCalculator.swift */; };
+		305962092346125100C80F33 /* AudioMessageSizeCalculator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305961C82346125100C80F33 /* AudioMessageSizeCalculator.swift */; };
+		3059620A2346125100C80F33 /* TextMessageSizeCalculator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305961C92346125100C80F33 /* TextMessageSizeCalculator.swift */; };
+		3059620B2346125100C80F33 /* LocationMessageSizeCalculator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305961CA2346125100C80F33 /* LocationMessageSizeCalculator.swift */; };
+		3059620C2346125100C80F33 /* MessageSizeCalculator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305961CB2346125100C80F33 /* MessageSizeCalculator.swift */; };
+		3059620E234614E700C80F33 /* DcContact+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3059620D234614E700C80F33 /* DcContact+Extension.swift */; };
+		305962102346154D00C80F33 /* String+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3059620F2346154D00C80F33 /* String+Extension.swift */; };
 		3060119C22DDE24000C1CE6F /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 3060119E22DDE24000C1CE6F /* Localizable.strings */; };
 		306011B622E5E7FB00C1CE6F /* Localizable.stringsdict in Resources */ = {isa = PBXBuildFile; fileRef = 306011B422E5E7FB00C1CE6F /* Localizable.stringsdict */; };
 		30A4D9AE2332672700544344 /* QrInviteViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30A4D9AD2332672600544344 /* QrInviteViewController.swift */; };
-		30BD261622F8812700F399DF /* UIView+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30BD261522F8812700F399DF /* UIView+Extension.swift */; };
 		6795F63A82E94FF7CD2CEC0F /* Pods_deltachat_iosTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2F7009234DB9408201A6CDCB /* Pods_deltachat_iosTests.framework */; };
 		7070FB9B2101ECBB000DC258 /* GroupNameController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7070FB9A2101ECBB000DC258 /* GroupNameController.swift */; };
 		7092474120B3869500AF8799 /* ContactDetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7092474020B3869500AF8799 /* ContactDetailViewController.swift */; };
@@ -85,6 +151,8 @@
 /* Begin PBXFileReference section */
 		21EE28844E7A690D73BF5285 /* Pods-deltachat-iosTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-deltachat-iosTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-deltachat-iosTests/Pods-deltachat-iosTests.debug.xcconfig"; sourceTree = "<group>"; };
 		2F7009234DB9408201A6CDCB /* Pods_deltachat_iosTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_deltachat_iosTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+		300C509C234B551900F8AE22 /* TextMediaMessageCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TextMediaMessageCell.swift; sourceTree = "<group>"; };
+		300C50A0234BDAB800F8AE22 /* TextMediaMessageSizeCalculator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TextMediaMessageSizeCalculator.swift; sourceTree = "<group>"; };
 		30149D9222F21129003C12B5 /* QrViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QrViewController.swift; sourceTree = "<group>"; };
 		3022E6BF22E8768800763272 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
 		3022E6C122E8768C00763272 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/InfoPlist.strings; sourceTree = "<group>"; };
@@ -106,6 +174,72 @@
 		3022E6D122E8769E00763272 /* lt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lt; path = lt.lproj/InfoPlist.strings; sourceTree = "<group>"; };
 		3022E6D222E8769F00763272 /* zh-Hant-TW */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant-TW"; path = "zh-Hant-TW.lproj/InfoPlist.strings"; sourceTree = "<group>"; };
 		3022E6D322E876A100763272 /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = uk.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		305961822346125000C80F33 /* UIView+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIView+Extensions.swift"; sourceTree = "<group>"; };
+		305961832346125000C80F33 /* UIEdgeInsets+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIEdgeInsets+Extensions.swift"; sourceTree = "<group>"; };
+		305961852346125000C80F33 /* UIColor+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIColor+Extensions.swift"; sourceTree = "<group>"; };
+		305961862346125000C80F33 /* NSAttributedString+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSAttributedString+Extensions.swift"; sourceTree = "<group>"; };
+		305961872346125000C80F33 /* Bundle+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Bundle+Extensions.swift"; sourceTree = "<group>"; };
+		305961882346125000C80F33 /* CGRect+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "CGRect+Extensions.swift"; sourceTree = "<group>"; };
+		3059618A2346125000C80F33 /* MessagesViewController+Keyboard.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "MessagesViewController+Keyboard.swift"; sourceTree = "<group>"; };
+		3059618B2346125000C80F33 /* MessagesViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MessagesViewController.swift; sourceTree = "<group>"; };
+		3059618C2346125000C80F33 /* MessagesViewController+Menu.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "MessagesViewController+Menu.swift"; sourceTree = "<group>"; };
+		3059618E2346125000C80F33 /* MessageInputBar.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MessageInputBar.swift; sourceTree = "<group>"; };
+		3059618F2346125000C80F33 /* MessageKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MessageKit.h; sourceTree = "<group>"; };
+		305961902346125000C80F33 /* MessageKit+Availability.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "MessageKit+Availability.swift"; sourceTree = "<group>"; };
+		305961932346125000C80F33 /* ContactItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContactItem.swift; sourceTree = "<group>"; };
+		305961942346125000C80F33 /* MediaItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MediaItem.swift; sourceTree = "<group>"; };
+		305961952346125000C80F33 /* AudioItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AudioItem.swift; sourceTree = "<group>"; };
+		305961962346125000C80F33 /* MessagesLayoutDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MessagesLayoutDelegate.swift; sourceTree = "<group>"; };
+		305961972346125000C80F33 /* SenderType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SenderType.swift; sourceTree = "<group>"; };
+		305961982346125000C80F33 /* MessageType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MessageType.swift; sourceTree = "<group>"; };
+		305961992346125000C80F33 /* MessageCellDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MessageCellDelegate.swift; sourceTree = "<group>"; };
+		3059619A2346125000C80F33 /* MessageLabelDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MessageLabelDelegate.swift; sourceTree = "<group>"; };
+		3059619B2346125000C80F33 /* LocationItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LocationItem.swift; sourceTree = "<group>"; };
+		3059619C2346125000C80F33 /* MessagesDisplayDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MessagesDisplayDelegate.swift; sourceTree = "<group>"; };
+		3059619D2346125000C80F33 /* MessagesDataSource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MessagesDataSource.swift; sourceTree = "<group>"; };
+		3059619F2346125100C80F33 /* MessageKitDateFormatter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MessageKitDateFormatter.swift; sourceTree = "<group>"; };
+		305961A02346125100C80F33 /* LabelAlignment.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LabelAlignment.swift; sourceTree = "<group>"; };
+		305961A12346125100C80F33 /* LocationMessageSnapshotOptions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LocationMessageSnapshotOptions.swift; sourceTree = "<group>"; };
+		305961A22346125100C80F33 /* AccessoryPosition.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccessoryPosition.swift; sourceTree = "<group>"; };
+		305961A32346125100C80F33 /* Sender.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Sender.swift; sourceTree = "<group>"; };
+		305961A42346125100C80F33 /* MessageKind.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MessageKind.swift; sourceTree = "<group>"; };
+		305961A52346125100C80F33 /* MessageStyle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MessageStyle.swift; sourceTree = "<group>"; };
+		305961A62346125100C80F33 /* MessageKitError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MessageKitError.swift; sourceTree = "<group>"; };
+		305961A72346125100C80F33 /* Avatar.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Avatar.swift; sourceTree = "<group>"; };
+		305961A82346125100C80F33 /* DetectorType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DetectorType.swift; sourceTree = "<group>"; };
+		305961A92346125100C80F33 /* AvatarPosition.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AvatarPosition.swift; sourceTree = "<group>"; };
+		305961AA2346125100C80F33 /* HorizontalEdgeInsets.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HorizontalEdgeInsets.swift; sourceTree = "<group>"; };
+		305961AB2346125100C80F33 /* NSConstraintLayoutSet.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NSConstraintLayoutSet.swift; sourceTree = "<group>"; };
+		305961AE2346125100C80F33 /* ContactMessageCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContactMessageCell.swift; sourceTree = "<group>"; };
+		305961AF2346125100C80F33 /* LocationMessageCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LocationMessageCell.swift; sourceTree = "<group>"; };
+		305961B02346125100C80F33 /* MediaMessageCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MediaMessageCell.swift; sourceTree = "<group>"; };
+		305961B12346125100C80F33 /* TextMessageCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TextMessageCell.swift; sourceTree = "<group>"; };
+		305961B22346125100C80F33 /* TypingIndicatorCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TypingIndicatorCell.swift; sourceTree = "<group>"; };
+		305961B32346125100C80F33 /* MessageContentCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MessageContentCell.swift; sourceTree = "<group>"; };
+		305961B42346125100C80F33 /* MessageCollectionViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MessageCollectionViewCell.swift; sourceTree = "<group>"; };
+		305961B52346125100C80F33 /* AudioMessageCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AudioMessageCell.swift; sourceTree = "<group>"; };
+		305961B62346125100C80F33 /* MessageLabel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MessageLabel.swift; sourceTree = "<group>"; };
+		305961B82346125100C80F33 /* MessageReusableView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MessageReusableView.swift; sourceTree = "<group>"; };
+		305961B92346125100C80F33 /* TypingIndicator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TypingIndicator.swift; sourceTree = "<group>"; };
+		305961BA2346125100C80F33 /* MessageContainerView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MessageContainerView.swift; sourceTree = "<group>"; };
+		305961BB2346125100C80F33 /* TypingBubble.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TypingBubble.swift; sourceTree = "<group>"; };
+		305961BC2346125100C80F33 /* InsetLabel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InsetLabel.swift; sourceTree = "<group>"; };
+		305961BD2346125100C80F33 /* AvatarView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AvatarView.swift; sourceTree = "<group>"; };
+		305961BE2346125100C80F33 /* MessagesCollectionView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MessagesCollectionView.swift; sourceTree = "<group>"; };
+		305961BF2346125100C80F33 /* PlayButtonView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PlayButtonView.swift; sourceTree = "<group>"; };
+		305961C02346125100C80F33 /* BubbleCircle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BubbleCircle.swift; sourceTree = "<group>"; };
+		305961C22346125100C80F33 /* CellSizeCalculator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CellSizeCalculator.swift; sourceTree = "<group>"; };
+		305961C32346125100C80F33 /* MessagesCollectionViewLayoutAttributes.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MessagesCollectionViewLayoutAttributes.swift; sourceTree = "<group>"; };
+		305961C42346125100C80F33 /* ContactMessageSizeCalculator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContactMessageSizeCalculator.swift; sourceTree = "<group>"; };
+		305961C52346125100C80F33 /* TypingIndicatorCellSizeCalculator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TypingIndicatorCellSizeCalculator.swift; sourceTree = "<group>"; };
+		305961C62346125100C80F33 /* MessagesCollectionViewFlowLayout.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MessagesCollectionViewFlowLayout.swift; sourceTree = "<group>"; };
+		305961C72346125100C80F33 /* MediaMessageSizeCalculator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MediaMessageSizeCalculator.swift; sourceTree = "<group>"; };
+		305961C82346125100C80F33 /* AudioMessageSizeCalculator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AudioMessageSizeCalculator.swift; sourceTree = "<group>"; };
+		305961C92346125100C80F33 /* TextMessageSizeCalculator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TextMessageSizeCalculator.swift; sourceTree = "<group>"; };
+		305961CA2346125100C80F33 /* LocationMessageSizeCalculator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LocationMessageSizeCalculator.swift; sourceTree = "<group>"; };
+		305961CB2346125100C80F33 /* MessageSizeCalculator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MessageSizeCalculator.swift; sourceTree = "<group>"; };
+		3059620D234614E700C80F33 /* DcContact+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DcContact+Extension.swift"; sourceTree = "<group>"; };
+		3059620F2346154D00C80F33 /* String+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+Extension.swift"; sourceTree = "<group>"; };
 		3060119D22DDE24000C1CE6F /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; };
 		3060119F22DDE24500C1CE6F /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Localizable.strings; sourceTree = "<group>"; };
 		306011A022DDE24700C1CE6F /* sq */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sq; path = sq.lproj/Localizable.strings; sourceTree = "<group>"; };
@@ -147,7 +281,6 @@
 		306011C822E5E83100C1CE6F /* zh-Hant-TW */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = "zh-Hant-TW"; path = "zh-Hant-TW.lproj/Localizable.stringsdict"; sourceTree = "<group>"; };
 		306011C922E5E83500C1CE6F /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = uk; path = uk.lproj/Localizable.stringsdict; sourceTree = "<group>"; };
 		30A4D9AD2332672600544344 /* QrInviteViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QrInviteViewController.swift; sourceTree = "<group>"; };
-		30BD261522F8812700F399DF /* UIView+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+Extension.swift"; sourceTree = "<group>"; usesTabs = 0; };
 		6241BE1534A653E79AD5D01D /* Pods_deltachat_ios.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_deltachat_ios.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		7070FB9A2101ECBB000DC258 /* GroupNameController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroupNameController.swift; sourceTree = "<group>"; };
 		7092474020B3869500AF8799 /* ContactDetailViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContactDetailViewController.swift; sourceTree = "<group>"; };
@@ -244,6 +377,154 @@
 /* End PBXFrameworksBuildPhase section */
 
 /* Begin PBXGroup section */
+		3059617E234610A800C80F33 /* MessageKit */ = {
+			isa = PBXGroup;
+			children = (
+				305961892346125000C80F33 /* Controllers */,
+				305961C12346125100C80F33 /* Layout */,
+				3059619E2346125100C80F33 /* Models */,
+				305961922346125000C80F33 /* Protocols */,
+				3059618D2346125000C80F33 /* Supporting */,
+				305961AC2346125100C80F33 /* Views */,
+			);
+			path = MessageKit;
+			sourceTree = "<group>";
+		};
+		305961812346125000C80F33 /* Extensions */ = {
+			isa = PBXGroup;
+			children = (
+				AEE56D7F225504DB007DC082 /* Extensions.swift */,
+				305961822346125000C80F33 /* UIView+Extensions.swift */,
+				78E45E4321D3F14A00D4B15E /* UIImage+Extension.swift */,
+				305961832346125000C80F33 /* UIEdgeInsets+Extensions.swift */,
+				305961852346125000C80F33 /* UIColor+Extensions.swift */,
+				305961862346125000C80F33 /* NSAttributedString+Extensions.swift */,
+				305961872346125000C80F33 /* Bundle+Extensions.swift */,
+				305961882346125000C80F33 /* CGRect+Extensions.swift */,
+				3059620D234614E700C80F33 /* DcContact+Extension.swift */,
+				3059620F2346154D00C80F33 /* String+Extension.swift */,
+			);
+			path = Extensions;
+			sourceTree = "<group>";
+		};
+		305961892346125000C80F33 /* Controllers */ = {
+			isa = PBXGroup;
+			children = (
+				3059618A2346125000C80F33 /* MessagesViewController+Keyboard.swift */,
+				3059618B2346125000C80F33 /* MessagesViewController.swift */,
+				3059618C2346125000C80F33 /* MessagesViewController+Menu.swift */,
+			);
+			path = Controllers;
+			sourceTree = "<group>";
+		};
+		3059618D2346125000C80F33 /* Supporting */ = {
+			isa = PBXGroup;
+			children = (
+				3059618E2346125000C80F33 /* MessageInputBar.swift */,
+				3059618F2346125000C80F33 /* MessageKit.h */,
+				305961902346125000C80F33 /* MessageKit+Availability.swift */,
+			);
+			path = Supporting;
+			sourceTree = "<group>";
+		};
+		305961922346125000C80F33 /* Protocols */ = {
+			isa = PBXGroup;
+			children = (
+				305961932346125000C80F33 /* ContactItem.swift */,
+				305961942346125000C80F33 /* MediaItem.swift */,
+				305961952346125000C80F33 /* AudioItem.swift */,
+				305961962346125000C80F33 /* MessagesLayoutDelegate.swift */,
+				305961972346125000C80F33 /* SenderType.swift */,
+				305961982346125000C80F33 /* MessageType.swift */,
+				305961992346125000C80F33 /* MessageCellDelegate.swift */,
+				3059619A2346125000C80F33 /* MessageLabelDelegate.swift */,
+				3059619B2346125000C80F33 /* LocationItem.swift */,
+				3059619C2346125000C80F33 /* MessagesDisplayDelegate.swift */,
+				3059619D2346125000C80F33 /* MessagesDataSource.swift */,
+			);
+			path = Protocols;
+			sourceTree = "<group>";
+		};
+		3059619E2346125100C80F33 /* Models */ = {
+			isa = PBXGroup;
+			children = (
+				3059619F2346125100C80F33 /* MessageKitDateFormatter.swift */,
+				305961A02346125100C80F33 /* LabelAlignment.swift */,
+				305961A12346125100C80F33 /* LocationMessageSnapshotOptions.swift */,
+				305961A22346125100C80F33 /* AccessoryPosition.swift */,
+				305961A32346125100C80F33 /* Sender.swift */,
+				305961A42346125100C80F33 /* MessageKind.swift */,
+				305961A52346125100C80F33 /* MessageStyle.swift */,
+				305961A62346125100C80F33 /* MessageKitError.swift */,
+				305961A72346125100C80F33 /* Avatar.swift */,
+				305961A82346125100C80F33 /* DetectorType.swift */,
+				305961A92346125100C80F33 /* AvatarPosition.swift */,
+				305961AA2346125100C80F33 /* HorizontalEdgeInsets.swift */,
+				305961AB2346125100C80F33 /* NSConstraintLayoutSet.swift */,
+			);
+			path = Models;
+			sourceTree = "<group>";
+		};
+		305961AC2346125100C80F33 /* Views */ = {
+			isa = PBXGroup;
+			children = (
+				305961AD2346125100C80F33 /* Cells */,
+				305961B62346125100C80F33 /* MessageLabel.swift */,
+				305961B72346125100C80F33 /* HeadersFooters */,
+				305961B92346125100C80F33 /* TypingIndicator.swift */,
+				305961BA2346125100C80F33 /* MessageContainerView.swift */,
+				305961BB2346125100C80F33 /* TypingBubble.swift */,
+				305961BC2346125100C80F33 /* InsetLabel.swift */,
+				305961BD2346125100C80F33 /* AvatarView.swift */,
+				305961BE2346125100C80F33 /* MessagesCollectionView.swift */,
+				305961BF2346125100C80F33 /* PlayButtonView.swift */,
+				305961C02346125100C80F33 /* BubbleCircle.swift */,
+			);
+			path = Views;
+			sourceTree = "<group>";
+		};
+		305961AD2346125100C80F33 /* Cells */ = {
+			isa = PBXGroup;
+			children = (
+				300C509C234B551900F8AE22 /* TextMediaMessageCell.swift */,
+				305961AE2346125100C80F33 /* ContactMessageCell.swift */,
+				305961AF2346125100C80F33 /* LocationMessageCell.swift */,
+				305961B02346125100C80F33 /* MediaMessageCell.swift */,
+				305961B12346125100C80F33 /* TextMessageCell.swift */,
+				305961B22346125100C80F33 /* TypingIndicatorCell.swift */,
+				305961B32346125100C80F33 /* MessageContentCell.swift */,
+				305961B42346125100C80F33 /* MessageCollectionViewCell.swift */,
+				305961B52346125100C80F33 /* AudioMessageCell.swift */,
+			);
+			path = Cells;
+			sourceTree = "<group>";
+		};
+		305961B72346125100C80F33 /* HeadersFooters */ = {
+			isa = PBXGroup;
+			children = (
+				305961B82346125100C80F33 /* MessageReusableView.swift */,
+			);
+			path = HeadersFooters;
+			sourceTree = "<group>";
+		};
+		305961C12346125100C80F33 /* Layout */ = {
+			isa = PBXGroup;
+			children = (
+				305961C22346125100C80F33 /* CellSizeCalculator.swift */,
+				305961C32346125100C80F33 /* MessagesCollectionViewLayoutAttributes.swift */,
+				305961C42346125100C80F33 /* ContactMessageSizeCalculator.swift */,
+				305961C52346125100C80F33 /* TypingIndicatorCellSizeCalculator.swift */,
+				305961C62346125100C80F33 /* MessagesCollectionViewFlowLayout.swift */,
+				305961C72346125100C80F33 /* MediaMessageSizeCalculator.swift */,
+				300C50A0234BDAB800F8AE22 /* TextMediaMessageSizeCalculator.swift */,
+				305961C82346125100C80F33 /* AudioMessageSizeCalculator.swift */,
+				305961C92346125100C80F33 /* TextMessageSizeCalculator.swift */,
+				305961CA2346125100C80F33 /* LocationMessageSizeCalculator.swift */,
+				305961CB2346125100C80F33 /* MessageSizeCalculator.swift */,
+			);
+			path = Layout;
+			sourceTree = "<group>";
+		};
 		7A9FB1371FB061E2001FEA36 = {
 			isa = PBXGroup;
 			children = (
@@ -275,6 +556,8 @@
 		7A9FB1421FB061E2001FEA36 /* deltachat-ios */ = {
 			isa = PBXGroup;
 			children = (
+				305961812346125000C80F33 /* Extensions */,
+				3059617E234610A800C80F33 /* MessageKit */,
 				7A9FB1431FB061E2001FEA36 /* AppDelegate.swift */,
 				AE851ACA227C79CF00ED86F0 /* DC */,
 				AE851AC3227C695900ED86F0 /* View */,
@@ -391,12 +674,9 @@
 			isa = PBXGroup;
 			children = (
 				AEACE2E21FB32B5C00DCDD78 /* Constants.swift */,
-				78E45E4321D3F14A00D4B15E /* UIImage+Extension.swift */,
 				AEACE2E41FB32E1900DCDD78 /* Utils.swift */,
-				AEE56D7F225504DB007DC082 /* Extensions.swift */,
 				AE38B3192267328200EC37A1 /* Colors.swift */,
 				AE851AC4227C755A00ED86F0 /* Protocols.swift */,
-				30BD261522F8812700F399DF /* UIView+Extension.swift */,
 			);
 			path = Helper;
 			sourceTree = "<group>";
@@ -717,29 +997,56 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				305961DC2346125100C80F33 /* MessagesLayoutDelegate.swift in Sources */,
+				3059620A2346125100C80F33 /* TextMessageSizeCalculator.swift in Sources */,
 				78ED839421D5AF8A00243125 /* QrCodeView.swift in Sources */,
+				305961F02346125100C80F33 /* NSConstraintLayoutSet.swift in Sources */,
+				3059620E234614E700C80F33 /* DcContact+Extension.swift in Sources */,
+				305961F72346125100C80F33 /* MessageCollectionViewCell.swift in Sources */,
 				AE851AC9227C77CF00ED86F0 /* Media.swift in Sources */,
 				AEACE2DF1FB3246400DCDD78 /* Message.swift in Sources */,
 				AE9DAF0F22C278C6004C9591 /* ChatTitleView.swift in Sources */,
 				AE4AEE3522B1030D000AA495 /* PreviewController.swift in Sources */,
 				7070FB9B2101ECBB000DC258 /* GroupNameController.swift in Sources */,
+				305961EA2346125100C80F33 /* MessageStyle.swift in Sources */,
+				305961F92346125100C80F33 /* MessageLabel.swift in Sources */,
+				305961FA2346125100C80F33 /* MessageReusableView.swift in Sources */,
 				AE52EA19229EB53C00C586C9 /* ContactDetailHeader.swift in Sources */,
 				78E45E4421D3F14A00D4B15E /* UIImage+Extension.swift in Sources */,
+				305962082346125100C80F33 /* MediaMessageSizeCalculator.swift in Sources */,
 				AE52EA20229EB9F000C586C9 /* EditGroupViewController.swift in Sources */,
 				70B08FCD21073B910097D3EA /* NewGroupMemberChoiceController.swift in Sources */,
 				78E45E3E21D3D28C00D4B15E /* DcNavigationController.swift in Sources */,
 				AE18F294228C602A0007B1BE /* SecuritySettingsController.swift in Sources */,
 				78ED838D21D577D000243125 /* events.swift in Sources */,
+				305961FD2346125100C80F33 /* TypingBubble.swift in Sources */,
+				305961D72346125100C80F33 /* MessageKit+Availability.swift in Sources */,
+				305961FE2346125100C80F33 /* InsetLabel.swift in Sources */,
 				B21005DB23383664004C70C5 /* SettingsClassicViewController.swift in Sources */,
+				305961F62346125100C80F33 /* MessageContentCell.swift in Sources */,
+				305961E42346125100C80F33 /* MessageKitDateFormatter.swift in Sources */,
+				305961D32346125100C80F33 /* MessagesViewController+Keyboard.swift in Sources */,
+				305961EF2346125100C80F33 /* HorizontalEdgeInsets.swift in Sources */,
 				30A4D9AE2332672700544344 /* QrInviteViewController.swift in Sources */,
+				305961D62346125100C80F33 /* MessageInputBar.swift in Sources */,
+				305961ED2346125100C80F33 /* DetectorType.swift in Sources */,
+				305962062346125100C80F33 /* TypingIndicatorCellSizeCalculator.swift in Sources */,
 				AE851AC7227C776400ED86F0 /* Location.swift in Sources */,
 				7AE0A5491FC42F65005ECB4B /* NewChatViewController.swift in Sources */,
+				305961E52346125100C80F33 /* LabelAlignment.swift in Sources */,
+				305961E82346125100C80F33 /* Sender.swift in Sources */,
+				305961EE2346125100C80F33 /* AvatarPosition.swift in Sources */,
 				AE25F09022807AD800CDEA66 /* GroupNameCell.swift in Sources */,
+				305961E62346125100C80F33 /* LocationMessageSnapshotOptions.swift in Sources */,
 				AEE6EC3F2282C59C00EDC689 /* GroupMembersViewController.swift in Sources */,
 				78E45E3A21D3CFBC00D4B15E /* SettingsController.swift in Sources */,
 				AE8519EA2272FDCA00ED86F0 /* DeviceContactsHandler.swift in Sources */,
+				3059620B2346125100C80F33 /* LocationMessageSizeCalculator.swift in Sources */,
+				305962072346125100C80F33 /* MessagesCollectionViewFlowLayout.swift in Sources */,
 				78ED838321D5379000243125 /* TextFieldCell.swift in Sources */,
 				78E45E3C21D3D03700D4B15E /* TextFieldTableViewCell.swift in Sources */,
+				305961D52346125100C80F33 /* MessagesViewController+Menu.swift in Sources */,
+				305961F22346125100C80F33 /* LocationMessageCell.swift in Sources */,
 				AE0D26FD1FB1FE88002FAFCE /* ChatListController.swift in Sources */,
 				30149D9322F21129003C12B5 /* QrViewController.swift in Sources */,
 				AEE56D80225504DB007DC082 /* Extensions.swift in Sources */,
@@ -748,28 +1055,67 @@
 				AEACE2DD1FB323CA00DCDD78 /* ChatViewController.swift in Sources */,
 				AEE6EC412282DF5700EDC689 /* MailboxViewController.swift in Sources */,
 				AEE6EC482283045D00EDC689 /* EditSettingsController.swift in Sources */,
+				305961DF2346125100C80F33 /* MessageCellDelegate.swift in Sources */,
+				305961CC2346125100C80F33 /* UIView+Extensions.swift in Sources */,
 				7A9FB1441FB061E2001FEA36 /* AppDelegate.swift in Sources */,
+				305961F52346125100C80F33 /* TypingIndicatorCell.swift in Sources */,
 				AEE56D7D2253ADB4007DC082 /* HudHandler.swift in Sources */,
+				305961FF2346125100C80F33 /* AvatarView.swift in Sources */,
+				3059620C2346125100C80F33 /* MessageSizeCalculator.swift in Sources */,
+				305962042346125100C80F33 /* MessagesCollectionViewLayoutAttributes.swift in Sources */,
+				305961D02346125100C80F33 /* NSAttributedString+Extensions.swift in Sources */,
+				305961CF2346125100C80F33 /* UIColor+Extensions.swift in Sources */,
 				AEACE2E51FB32E1900DCDD78 /* Utils.swift in Sources */,
+				300C509D234B551900F8AE22 /* TextMediaMessageCell.swift in Sources */,
+				305961E92346125100C80F33 /* MessageKind.swift in Sources */,
+				305962022346125100C80F33 /* BubbleCircle.swift in Sources */,
+				305961DD2346125100C80F33 /* SenderType.swift in Sources */,
+				305961E32346125100C80F33 /* MessagesDataSource.swift in Sources */,
+				305961E22346125100C80F33 /* MessagesDisplayDelegate.swift in Sources */,
+				305962092346125100C80F33 /* AudioMessageSizeCalculator.swift in Sources */,
+				305961DB2346125100C80F33 /* AudioItem.swift in Sources */,
+				305962012346125100C80F33 /* PlayButtonView.swift in Sources */,
 				789E879D21D6DF86003ED1C5 /* ProgressHud.swift in Sources */,
+				305961F32346125100C80F33 /* MediaMessageCell.swift in Sources */,
+				305962102346154D00C80F33 /* String+Extension.swift in Sources */,
 				78E45E4C21D404AE00D4B15E /* CustomMessageCell.swift in Sources */,
 				AE38B31A2267328200EC37A1 /* Colors.swift in Sources */,
 				789E879621D6CB58003ED1C5 /* QrCodeReaderController.swift in Sources */,
+				305961D22346125100C80F33 /* CGRect+Extensions.swift in Sources */,
+				305961E12346125100C80F33 /* LocationItem.swift in Sources */,
+				305961E72346125100C80F33 /* AccessoryPosition.swift in Sources */,
 				7A451DBE1FB4AD0700177250 /* Wrapper.swift in Sources */,
+				305961DE2346125100C80F33 /* MessageType.swift in Sources */,
 				AE851ACE227CA54400ED86F0 /* InitialsBadge.swift in Sources */,
+				305961DA2346125100C80F33 /* MediaItem.swift in Sources */,
+				305961EB2346125100C80F33 /* MessageKitError.swift in Sources */,
 				70B8882E2091B8550074812E /* ContactCell.swift in Sources */,
+				305961F82346125100C80F33 /* AudioMessageCell.swift in Sources */,
 				7A451D941FB1B1DB00177250 /* wrapper.c in Sources */,
-				30BD261622F8812700F399DF /* UIView+Extension.swift in Sources */,
+				305961EC2346125100C80F33 /* Avatar.swift in Sources */,
+				305961CD2346125100C80F33 /* UIEdgeInsets+Extensions.swift in Sources */,
+				305962032346125100C80F33 /* CellSizeCalculator.swift in Sources */,
+				305961E02346125100C80F33 /* MessageLabelDelegate.swift in Sources */,
+				305961D92346125100C80F33 /* ContactItem.swift in Sources */,
+				305961FB2346125100C80F33 /* TypingIndicator.swift in Sources */,
 				7092474120B3869500AF8799 /* ContactDetailViewController.swift in Sources */,
+				300C50A1234BDAB800F8AE22 /* TextMediaMessageSizeCalculator.swift in Sources */,
 				AE18F292228C17BC0007B1BE /* PortSettingsController.swift in Sources */,
+				305961F12346125100C80F33 /* ContactMessageCell.swift in Sources */,
 				AE851AD0227DF50900ED86F0 /* GroupChatDetailViewController.swift in Sources */,
+				305961D12346125100C80F33 /* Bundle+Extensions.swift in Sources */,
+				305962002346125100C80F33 /* MessagesCollectionView.swift in Sources */,
 				7A451DB01FB1F84900177250 /* AppCoordinator.swift in Sources */,
 				AE38B31822672DFC00EC37A1 /* ActionCell.swift in Sources */,
 				AE9DAF0D22C1215D004C9591 /* EditContactController.swift in Sources */,
+				305961FC2346125100C80F33 /* MessageContainerView.swift in Sources */,
+				305961D42346125100C80F33 /* MessagesViewController.swift in Sources */,
 				785BE16821E247F1003BE98C /* MessageInfoViewController.swift in Sources */,
 				AE851AC5227C755A00ED86F0 /* Protocols.swift in Sources */,
 				AE728F15229D5C390047565B /* PhotoPickerAlertAction.swift in Sources */,
+				305961F42346125100C80F33 /* TextMessageCell.swift in Sources */,
 				AEACE2E31FB32B5C00DCDD78 /* Constants.swift in Sources */,
+				305962052346125100C80F33 /* ContactMessageSizeCalculator.swift in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};

+ 6 - 2
deltachat-ios/Controller/ChatViewController.swift

@@ -1,5 +1,4 @@
 import MapKit
-import MessageKit
 import QuickLook
 import UIKit
 import InputBarAccessoryView
@@ -391,6 +390,10 @@ class ChatViewController: MessagesViewController {
             let cell = messagesCollectionView.dequeueReusableCell(MediaMessageCell.self, for: indexPath)
             cell.configure(with: message, at: indexPath, and: messagesCollectionView)
             return cell
+        case .photoText:
+            let cell = messagesCollectionView.dequeueReusableCell(TextMediaMessageCell.self, for: indexPath)
+            cell.configure(with: message, at: indexPath, and: messagesCollectionView)
+            return cell
         case .location:
             let cell = messagesCollectionView.dequeueReusableCell(LocationMessageCell.self, for: indexPath)
             cell.configure(with: message, at: indexPath, and: messagesCollectionView)
@@ -464,7 +467,7 @@ extension ChatViewController: MessagesDataSource {
     }
 
     func currentSender() -> SenderType {
-        let currentSender = Sender(id: "1", displayName: "Alice")
+        let currentSender = Sender(senderId: "1", displayName: "Alice")
         return currentSender
     }
 
@@ -744,6 +747,7 @@ extension ChatViewController: MessagesDisplayDelegate {
 
 // MARK: - MessagesLayoutDelegate
 extension ChatViewController: MessagesLayoutDelegate {
+
     func cellTopLabelHeight(for _: MessageType, at indexPath: IndexPath, in _: MessagesCollectionView) -> CGFloat {
         if isTimeLabelVisible(at: indexPath) {
             return 18

+ 0 - 1
deltachat-ios/Controller/MailboxViewController.swift

@@ -1,5 +1,4 @@
 import UIKit
-import MessageKit
 
 class MailboxViewController: ChatViewController {
 

+ 5 - 2
deltachat-ios/DC/Wrapper.swift

@@ -1,5 +1,4 @@
 import Foundation
-import MessageKit
 import UIKit
 
 class DcContext {
@@ -474,7 +473,11 @@ class DcMsg: MessageType {
 
         switch self.viewtype! {
         case .image:
-            return MessageKind.photo(Media(image: image))
+            if text.isEmpty {
+                return MessageKind.photo(Media(image: image))
+            }
+            let attributedString = NSAttributedString(string: text, attributes: [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 16.0)])
+            return MessageKind.photoText(Media(image: image, text: attributedString))
         case .video:
             return MessageKind.video(Media(url: fileURL))
         default:

+ 0 - 0
Pods/MessageKit/Sources/Extensions/Bundle+Extensions.swift → deltachat-ios/Extensions/Bundle+Extensions.swift


+ 1 - 0
Pods/MessageKit/Sources/Extensions/CGRect+Extensions.swift → deltachat-ios/Extensions/CGRect+Extensions.swift

@@ -23,6 +23,7 @@
  */
 
 import Foundation
+import UIKit
 
 internal extension CGRect {
     

+ 51 - 0
deltachat-ios/Extensions/DcContact+Extension.swift

@@ -0,0 +1,51 @@
+import Foundation
+
+extension DcContact {
+    func contains(searchText text: String) -> [ContactHighlights] {
+        var nameIndexes = [Int]()
+        var emailIndexes = [Int]()
+
+        let contactString = name + email
+        let subsequenceIndexes = contactString.contains(subSequence: text)
+
+        if !subsequenceIndexes.isEmpty {
+            for index in subsequenceIndexes {
+                if index < name.count {
+                    nameIndexes.append(index)
+                } else {
+                    let emailIndex = index - name.count
+                    emailIndexes.append(emailIndex)
+                }
+            }
+            return [ContactHighlights(contactDetail: .NAME, indexes: nameIndexes), ContactHighlights(contactDetail: .EMAIL, indexes: emailIndexes)]
+        } else {
+            return []
+        }
+    }
+
+    func containsExact(searchText text: String) -> [ContactHighlights] {
+        var contactHighlights = [ContactHighlights]()
+
+        let nameString = name + ""
+        let emailString = email + ""
+        if let nameRange = nameString.range(of: text, options: .caseInsensitive) {
+            let index: Int = nameString.distance(from: nameString.startIndex, to: nameRange.lowerBound)
+            var nameIndexes = [Int]()
+            for i in index..<(index + text.count) {
+                nameIndexes.append(i)
+            }
+            contactHighlights.append(ContactHighlights(contactDetail: .NAME, indexes: nameIndexes))
+        }
+
+        if let emailRange = emailString.range(of: text, options: .caseInsensitive) {
+            let index: Int = emailString.distance(from: emailString.startIndex, to: emailRange.lowerBound)
+            var emailIndexes = [Int]()
+            for i in index..<(index + text.count) {
+                emailIndexes.append(i)
+            }
+            contactHighlights.append(ContactHighlights(contactDetail: .EMAIL, indexes: emailIndexes))
+        }
+
+        return contactHighlights
+    }
+}

+ 58 - 0
deltachat-ios/Extensions/Extensions.swift

@@ -0,0 +1,58 @@
+import UIKit
+import Foundation
+
+extension URL {
+    public var queryParameters: [String: String]? {
+        guard
+            let components = URLComponents(url: self, resolvingAgainstBaseURL: true),
+            let queryItems = components.queryItems else { return nil }
+        return queryItems.reduce(into: [String: String]()) { result, item in
+            result[item.name] = item.value
+        }
+    }
+}
+
+extension Dictionary {
+    func percentEscaped() -> String {
+        return map { key, value in
+            let escapedKey = "\(key)".addingPercentEncoding(withAllowedCharacters: .urlQueryValueAllowed) ?? ""
+            let escapedValue = "\(value)".addingPercentEncoding(withAllowedCharacters: .urlQueryValueAllowed) ?? ""
+            return escapedKey + "=" + escapedValue
+        }
+        .joined(separator: "&")
+    }
+}
+
+extension CharacterSet {
+    static let urlQueryValueAllowed: CharacterSet = {
+        let generalDelimitersToEncode = ":#[]@" // does not include "?" or "/" due to RFC 3986 - Section 3.4
+        let subDelimitersToEncode = "!$&'()*+,;="
+
+        var allowed = CharacterSet.urlQueryAllowed
+        allowed.remove(charactersIn: "\(generalDelimitersToEncode)\(subDelimitersToEncode)")
+        return allowed
+    }()
+}
+
+extension URLSession {
+    func synchronousDataTask(request: URLRequest) -> (Data?, URLResponse?, Error?) {
+        var data: Data?
+        var response: URLResponse?
+        var error: Error?
+
+        let semaphore = DispatchSemaphore(value: 0)
+
+        let task = dataTask(with: request) {
+            data = $0
+            response = $1
+            error = $2
+
+            semaphore.signal()
+        }
+        task.resume()
+
+        _ = semaphore.wait(timeout: .distantFuture)
+
+        return (data, response, error)
+    }
+}

+ 7 - 0
Pods/MessageKit/Sources/Extensions/NSAttributedString+Extensions.swift → deltachat-ios/Extensions/NSAttributedString+Extensions.swift

@@ -23,6 +23,7 @@
  */
 
 import Foundation
+import UIKit
 
 internal extension NSAttributedString {
 
@@ -33,4 +34,10 @@ internal extension NSAttributedString {
         return rect.width
         
     }
+
+    func height(withConstrainedWidth width: CGFloat) -> CGFloat {
+        let constraintBox = CGSize(width: width, height: .greatestFiniteMagnitude)
+        let rect = self.boundingRect(with: constraintBox, options: [.usesLineFragmentOrigin, .usesFontLeading], context: nil)
+        return rect.height
+    }
 }

+ 76 - 0
deltachat-ios/Extensions/String+Extension.swift

@@ -0,0 +1,76 @@
+import Foundation
+import UIKit
+
+extension String {
+
+    func substring(_ from: Int, _ to: Int) -> String {
+        let idx1 = index(startIndex, offsetBy: from)
+        let idx2 = index(startIndex, offsetBy: to)
+        return String(self[idx1..<idx2])
+    }
+
+    func containsCharacters() -> Bool {
+        return !trimmingCharacters(in: [" "]).isEmpty
+    }
+
+    // O(n) - returns indexes of subsequences -> can be used to highlight subsequence within string
+    func contains(subSequence: String) -> [Int] {
+        if subSequence.count > count {
+            return []
+        }
+
+        let str = lowercased()
+        let sub = subSequence.lowercased()
+
+        var j = 0
+
+        var foundIndexes: [Int] = []
+
+        for (index, char) in str.enumerated() {
+            if j == sub.count {
+                break
+            }
+
+            if char == sub.subScript(j) {
+                foundIndexes.append(index)
+                j += 1
+            }
+        }
+        return foundIndexes.count == sub.count ? foundIndexes : []
+    }
+
+    func subScript(_ i: Int) -> Character {
+        return self[index(startIndex, offsetBy: i)]
+    }
+
+    func boldAt(indexes: [Int], fontSize: CGFloat) -> NSAttributedString {
+        let attributedText = NSMutableAttributedString(string: self)
+
+        for index in indexes {
+            if index < 0 || count <= index {
+                break
+            }
+            attributedText.addAttribute(.font, value: UIFont.boldSystemFont(ofSize: fontSize), range: NSRange(location: index, length: 1))
+        }
+        return attributedText
+    }
+
+    static func localized(_ stringID: String) -> String {
+        let value = NSLocalizedString(stringID, comment: "")
+        if value != stringID || NSLocale.preferredLanguages.first == "en" {
+            return value
+        }
+
+        guard
+            let path = Bundle.main.path(forResource: "en", ofType: "lproj"),
+            let bundle = Bundle(path: path)
+        else { return value }
+        return NSLocalizedString(stringID, bundle: bundle, comment: "")
+    }
+
+    static func localized(stringID: String, count: Int) -> String {
+        let formatString: String = localized(stringID)
+        let resultString: String = String.localizedStringWithFormat(formatString, count)
+        return resultString
+    }
+}

+ 36 - 0
Pods/MessageKit/Sources/Extensions/UIColor+Extensions.swift → deltachat-ios/Extensions/UIColor+Extensions.swift

@@ -23,6 +23,7 @@
  */
 
 import Foundation
+import UIKit
 
 // swiftlint:disable explicit_acl
 
@@ -38,4 +39,39 @@ internal extension UIColor {
 
     static let sendButtonBlue = UIColor(red: 15/255, green: 135/255, blue: 255/255, alpha: 1.0)
 
+    convenience init(alpha: Int, red: Int, green: Int, blue: Int) {
+        assert(red >= 0 && red <= 255, "Invalid red component")
+        assert(green >= 0 && green <= 255, "Invalid green component")
+        assert(blue >= 0 && blue <= 255, "Invalid blue component")
+
+        self.init(red: CGFloat(red) / 255, green: CGFloat(green) / 255, blue: CGFloat(blue) / 255, alpha: CGFloat(alpha) / 255)
+    }
+
+    convenience init(netHex: Int) {
+        var alpha = (netHex >> 24) & 0xFF
+        if alpha == 0 {
+            alpha = 255
+        }
+
+        self.init(alpha: alpha, red: (netHex >> 16) & 0xFF, green: (netHex >> 8) & 0xFF, blue: netHex & 0xFF)
+    }
+
+    // see: https://stackoverflow.com/a/33397427
+    convenience init(hexString: String) {
+        let hex = hexString.trimmingCharacters(in: CharacterSet.alphanumerics.inverted)
+        var int = UInt32()
+        Scanner(string: hex).scanHexInt32(&int)
+        let a, r, g, b: UInt32
+        switch hex.count {
+        case 3: // RGB (12-bit)
+            (a, r, g, b) = (255, (int >> 8) * 17, (int >> 4 & 0xF) * 17, (int & 0xF) * 17)
+        case 6: // RGB (24-bit)
+            (a, r, g, b) = (255, int >> 16, int >> 8 & 0xFF, int & 0xFF)
+        case 8: // ARGB (32-bit)
+            (a, r, g, b) = (int >> 24, int >> 16 & 0xFF, int >> 8 & 0xFF, int & 0xFF)
+        default:
+            (a, r, g, b) = (255, 0, 0, 0)
+        }
+        self.init(red: CGFloat(r) / 255, green: CGFloat(g) / 255, blue: CGFloat(b) / 255, alpha: CGFloat(a) / 255)
+    }
 }

+ 1 - 0
Pods/MessageKit/Sources/Extensions/UIEdgeInsets+Extensions.swift → deltachat-ios/Extensions/UIEdgeInsets+Extensions.swift

@@ -23,6 +23,7 @@
  */
 
 import Foundation
+import UIKit
 
 // swiftlint:disable explicit_acl
 

+ 111 - 0
deltachat-ios/Extensions/UIImage+Extension.swift

@@ -0,0 +1,111 @@
+import UIKit
+
+extension UIImage {
+    func imageResize(sizeChange: CGSize) -> UIImage {
+        let hasAlpha = true
+        let scale: CGFloat = 0.0 // Use scale factor of main screen
+
+        UIGraphicsBeginImageContextWithOptions(sizeChange, !hasAlpha, scale)
+        draw(in: CGRect(origin: CGPoint.zero, size: sizeChange))
+
+        let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
+        return scaledImage!
+    }
+
+    public convenience init?(color: UIColor, size: CGSize = CGSize(width: 1, height: 1)) {
+        let rect = CGRect(origin: .zero, size: size)
+        UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0)
+        color.setFill()
+        UIRectFill(rect)
+        let image = UIGraphicsGetImageFromCurrentImageContext()
+        UIGraphicsEndImageContext()
+
+        guard let cgImage = image?.cgImage else { return nil }
+        self.init(cgImage: cgImage)
+    }
+
+    func resizeImage(targetSize: CGSize) -> UIImage? {
+        let size = self.size
+
+        let widthRatio  = targetSize.width  / size.width
+        let heightRatio = targetSize.height / size.height
+
+        var newSize: CGSize
+        if widthRatio > heightRatio {
+            newSize = CGSize(width: size.width * heightRatio, height: size.height * heightRatio)
+        } else {
+            newSize = CGSize(width: size.width * widthRatio, height: size.height *      widthRatio)
+        }
+
+        let rect = CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height)
+
+        UIGraphicsBeginImageContextWithOptions(newSize, false, 1.0)
+        draw(in: rect)
+        let newImage = UIGraphicsGetImageFromCurrentImageContext()
+        UIGraphicsEndImageContext()
+
+        return newImage
+    }
+
+    func dcCompress(toMax target: Float = 1280) -> UIImage? {
+        return resize(toMax: target)
+    }
+
+    func imageSizeInPixel() -> CGSize {
+        let heightInPoints = size.height
+        let heightInPixels = heightInPoints * scale
+        let widthInPoints = size.width
+        let widthInPixels = widthInPoints * scale
+        return CGSize(width: widthInPixels, height: heightInPixels)
+    }
+
+    // source: https://stackoverflow.com/questions/29137488/how-do-i-resize-the-uiimage-to-reduce-upload-image-size // slightly changed
+    func resize(toMax: Float) -> UIImage? {
+        var actualHeight = Float(size.height)
+        var actualWidth = Float(size.width)
+        let maxHeight: Float = toMax
+        let maxWidth: Float = toMax
+        var imgRatio: Float = actualWidth / actualHeight
+        let maxRatio: Float = maxWidth / maxHeight
+        let compressionQuality: Float = 0.5
+        //50 percent compression
+        if actualHeight > maxHeight || actualWidth > maxWidth {
+            if imgRatio < maxRatio {
+                //adjust width according to maxHeight
+                imgRatio = maxHeight / actualHeight
+                actualWidth = imgRatio * actualWidth
+                actualHeight = maxHeight
+            } else if imgRatio > maxRatio {
+                //adjust height according to maxWidth
+                imgRatio = maxWidth / actualWidth
+                actualHeight = imgRatio * actualHeight
+                actualWidth = maxWidth
+            } else {
+                actualHeight = maxHeight
+                actualWidth = maxWidth
+            }
+        }
+
+        let rect = CGRect(x: 0.0, y: 0.0, width: CGFloat(actualWidth), height: CGFloat(actualHeight))
+        UIGraphicsBeginImageContext(rect.size)
+        draw(in: rect)
+        let img = UIGraphicsGetImageFromCurrentImageContext()
+        let imageData = img?.jpegData(compressionQuality: CGFloat(compressionQuality))
+        UIGraphicsEndImageContext()
+        return UIImage(data: imageData!)
+    }
+
+    public class func messageKitImageWith(type: ImageType) -> UIImage? {
+        let assetBundle = Bundle.messageKitAssetBundle()
+        let imagePath = assetBundle.path(forResource: type.rawValue, ofType: "png", inDirectory: "Images")
+        let image = UIImage(contentsOfFile: imagePath ?? "")
+        return image
+    }
+
+}
+
+public enum ImageType: String {
+    case play
+    case pause
+    case disclouser
+}

+ 118 - 15
Pods/MessageKit/Sources/Extensions/UIView+Extensions.swift → deltachat-ios/Extensions/UIView+Extensions.swift

@@ -27,7 +27,112 @@ import UIKit
 // swiftlint:disable explicit_acl
 
 internal extension UIView {
-    
+
+    func makeBorder(color: UIColor = UIColor.red) {
+        self.layer.borderColor = color.cgColor
+        self.layer.borderWidth = 2
+        print("hello")
+    }
+
+    func constraintAlignTopTo(_ view: UIView) -> NSLayoutConstraint {
+        return constraintAlignTopTo(view, paddingTop: 0.0)
+    }
+
+    func constraintAlignTopTo(_ view: UIView, paddingTop: CGFloat = 0.0) -> NSLayoutConstraint {
+        return NSLayoutConstraint(
+            item: self,
+            attribute: .top,
+            relatedBy: .equal,
+            toItem: view,
+            attribute: .top,
+            multiplier: 1.0,
+            constant: paddingTop)
+    }
+
+    func constraintAlignBottomTo(_ view: UIView, paddingBottom: CGFloat = 0.0) -> NSLayoutConstraint {
+        return NSLayoutConstraint(
+            item: self,
+            attribute: .bottom,
+            relatedBy: .equal,
+            toItem: view,
+            attribute: .bottom,
+            multiplier: 1.0,
+            constant: -paddingBottom)
+    }
+
+    func constraintAlignLeadingTo(_ view: UIView, paddingLeading: CGFloat = 0.0) -> NSLayoutConstraint {
+        return NSLayoutConstraint(
+            item: self,
+            attribute: .leading,
+            relatedBy: .equal,
+            toItem: view,
+            attribute: .leading,
+            multiplier: 1.0,
+            constant: paddingLeading)
+    }
+
+    func constraintAlignTrailingTo(_ view: UIView, paddingTrailing: CGFloat = 0.0) -> NSLayoutConstraint {
+        return NSLayoutConstraint(
+            item: self,
+            attribute: .trailing,
+            relatedBy: .equal,
+            toItem: view,
+            attribute: .trailing,
+            multiplier: 1.0,
+            constant: -paddingTrailing)
+    }
+
+    func constraintToBottomOf(_ view: UIView, paddingTop: CGFloat = 0.0) -> NSLayoutConstraint {
+        return NSLayoutConstraint(
+            item: self,
+            attribute: .top,
+            relatedBy: .equal,
+            toItem: view,
+            attribute: .bottom,
+            multiplier: 1.0,
+            constant: paddingTop)
+    }
+
+    func constraintToTrailingOf(_ view: UIView, paddingLeading: CGFloat = 0.0) -> NSLayoutConstraint {
+        return NSLayoutConstraint(
+            item: self,
+            attribute: .leading,
+            relatedBy: .equal,
+            toItem: view,
+            attribute: .trailing,
+            multiplier: 1.0,
+            constant: paddingLeading)
+    }
+
+
+    func constraintCenterXTo(_ view: UIView, paddingX: CGFloat = 0.0) -> NSLayoutConstraint {
+        return NSLayoutConstraint(item: self,
+                                  attribute: .centerX,
+                                  relatedBy: .equal,
+                                  toItem: view,
+                                  attribute: .centerX,
+                                  multiplier: 1.0,
+                                  constant: paddingX)
+    }
+
+    func constraintCenterYTo(_ view: UIView, paddingY: CGFloat = 0.0) -> NSLayoutConstraint {
+        return NSLayoutConstraint(item: self,
+                                  attribute: .centerY,
+                                  relatedBy: .equal,
+                                  toItem: view,
+                                  attribute: .centerY,
+                                  multiplier: 1.0,
+                                  constant: paddingY)
+    }
+
+    func constraintHeightTo(_ height: CGFloat) -> NSLayoutConstraint {
+        return heightAnchor.constraint(equalToConstant: height)
+    }
+
+    func constraintWitdthTo(_ width: CGFloat) -> NSLayoutConstraint {
+       return  widthAnchor.constraint(equalToConstant: width)
+    }
+
     func fillSuperview() {
         guard let superview = self.superview else {
             return
@@ -38,8 +143,7 @@ internal extension UIView {
     	    leftAnchor.constraint(equalTo: superview.leftAnchor),
     	    rightAnchor.constraint(equalTo: superview.rightAnchor),
     	    topAnchor.constraint(equalTo: superview.topAnchor),
-    	    bottomAnchor.constraint(equalTo: superview.bottomAnchor)
-    	    ]
+    	    bottomAnchor.constraint(equalTo: superview.bottomAnchor)]
 	    NSLayoutConstraint.activate(constraints)
     }
 
@@ -54,7 +158,7 @@ internal extension UIView {
         ]
         NSLayoutConstraint.activate(constraints)
     }
-    
+
     func constraint(equalTo size: CGSize) {
         guard superview != nil else { return }
         translatesAutoresizingMaskIntoConstraints = false
@@ -63,37 +167,36 @@ internal extension UIView {
             heightAnchor.constraint(equalToConstant: size.height)
         ]
         NSLayoutConstraint.activate(constraints)
-        
+
     }
 
     @discardableResult
-    internal func addConstraints(_ top: NSLayoutYAxisAnchor? = nil, left: NSLayoutXAxisAnchor? = nil, bottom: NSLayoutYAxisAnchor? = nil, right: NSLayoutXAxisAnchor? = nil, centerY: NSLayoutYAxisAnchor? = nil, centerX: NSLayoutXAxisAnchor? = nil, topConstant: CGFloat = 0, leftConstant: CGFloat = 0, bottomConstant: CGFloat = 0, rightConstant: CGFloat = 0, centerYConstant: CGFloat = 0, centerXConstant: CGFloat = 0, widthConstant: CGFloat = 0, heightConstant: CGFloat = 0) -> [NSLayoutConstraint] {
-        
+    func addConstraints(_ top: NSLayoutYAxisAnchor? = nil, left: NSLayoutXAxisAnchor? = nil, bottom: NSLayoutYAxisAnchor? = nil, right: NSLayoutXAxisAnchor? = nil, centerY: NSLayoutYAxisAnchor? = nil, centerX: NSLayoutXAxisAnchor? = nil, topConstant: CGFloat = 0, leftConstant: CGFloat = 0, bottomConstant: CGFloat = 0, rightConstant: CGFloat = 0, centerYConstant: CGFloat = 0, centerXConstant: CGFloat = 0, widthConstant: CGFloat = 0, heightConstant: CGFloat = 0) -> [NSLayoutConstraint] {
+
         if self.superview == nil {
             return []
         }
         translatesAutoresizingMaskIntoConstraints = false
-        
+
         var constraints = [NSLayoutConstraint]()
-        
+
         if let top = top {
             let constraint = topAnchor.constraint(equalTo: top, constant: topConstant)
             constraint.identifier = "top"
             constraints.append(constraint)
         }
-        
         if let left = left {
             let constraint = leftAnchor.constraint(equalTo: left, constant: leftConstant)
             constraint.identifier = "left"
             constraints.append(constraint)
         }
-        
+
         if let bottom = bottom {
             let constraint = bottomAnchor.constraint(equalTo: bottom, constant: -bottomConstant)
             constraint.identifier = "bottom"
             constraints.append(constraint)
         }
-        
+
         if let right = right {
             let constraint = rightAnchor.constraint(equalTo: right, constant: -rightConstant)
             constraint.identifier = "right"
@@ -111,19 +214,19 @@ internal extension UIView {
             constraint.identifier = "centerX"
             constraints.append(constraint)
         }
-        
+
         if widthConstant > 0 {
             let constraint = widthAnchor.constraint(equalToConstant: widthConstant)
             constraint.identifier = "width"
             constraints.append(constraint)
         }
-        
+
         if heightConstant > 0 {
             let constraint = heightAnchor.constraint(equalToConstant: heightConstant)
             constraint.identifier = "height"
             constraints.append(constraint)
         }
-        
+
         NSLayoutConstraint.activate(constraints)
         return constraints
     }

+ 0 - 273
deltachat-ios/Helper/Extensions.swift

@@ -1,273 +0,0 @@
-import UIKit
-
-extension String {
-
-    func substring(_ from: Int, _ to: Int) -> String {
-        let idx1 = index(startIndex, offsetBy: from)
-        let idx2 = index(startIndex, offsetBy: to)
-        return String(self[idx1..<idx2])
-    }
-
-    func containsCharacters() -> Bool {
-        return !trimmingCharacters(in: [" "]).isEmpty
-    }
-
-    // O(n) - returns indexes of subsequences -> can be used to highlight subsequence within string
-    func contains(subSequence: String) -> [Int] {
-        if subSequence.count > count {
-            return []
-        }
-
-        let str = lowercased()
-        let sub = subSequence.lowercased()
-
-        var j = 0
-
-        var foundIndexes: [Int] = []
-
-        for (index, char) in str.enumerated() {
-            if j == sub.count {
-                break
-            }
-
-            if char == sub.subScript(j) {
-                foundIndexes.append(index)
-                j += 1
-            }
-        }
-        return foundIndexes.count == sub.count ? foundIndexes : []
-    }
-
-    func subScript(_ i: Int) -> Character {
-        return self[index(startIndex, offsetBy: i)]
-    }
-
-    func boldAt(indexes: [Int], fontSize: CGFloat) -> NSAttributedString {
-        let attributedText = NSMutableAttributedString(string: self)
-
-        for index in indexes {
-            if index < 0 || count <= index {
-                break
-            }
-            attributedText.addAttribute(.font, value: UIFont.boldSystemFont(ofSize: fontSize), range: NSRange(location: index, length: 1))
-        }
-        return attributedText
-    }
-
-    static func localized(_ stringID: String) -> String {
-        let value = NSLocalizedString(stringID, comment: "")
-        if value != stringID || NSLocale.preferredLanguages.first == "en" {
-            return value
-        }
-
-        guard
-            let path = Bundle.main.path(forResource: "en", ofType: "lproj"),
-            let bundle = Bundle(path: path)
-        else { return value }
-        return NSLocalizedString(stringID, bundle: bundle, comment: "")
-    }
-
-    static func localized(stringID: String, count: Int) -> String {
-        let formatString: String = localized(stringID)
-        let resultString: String = String.localizedStringWithFormat(formatString, count)
-        return resultString
-    }
-}
-
-extension URL {
-    public var queryParameters: [String: String]? {
-        guard
-            let components = URLComponents(url: self, resolvingAgainstBaseURL: true),
-            let queryItems = components.queryItems else { return nil }
-        return queryItems.reduce(into: [String: String]()) { result, item in
-            result[item.name] = item.value
-        }
-    }
-}
-
-extension Dictionary {
-    func percentEscaped() -> String {
-        return map { key, value in
-            let escapedKey = "\(key)".addingPercentEncoding(withAllowedCharacters: .urlQueryValueAllowed) ?? ""
-            let escapedValue = "\(value)".addingPercentEncoding(withAllowedCharacters: .urlQueryValueAllowed) ?? ""
-            return escapedKey + "=" + escapedValue
-        }
-        .joined(separator: "&")
-    }
-}
-
-extension CharacterSet {
-    static let urlQueryValueAllowed: CharacterSet = {
-        let generalDelimitersToEncode = ":#[]@" // does not include "?" or "/" due to RFC 3986 - Section 3.4
-        let subDelimitersToEncode = "!$&'()*+,;="
-
-        var allowed = CharacterSet.urlQueryAllowed
-        allowed.remove(charactersIn: "\(generalDelimitersToEncode)\(subDelimitersToEncode)")
-        return allowed
-    }()
-}
-
-extension URLSession {
-    func synchronousDataTask(request: URLRequest) -> (Data?, URLResponse?, Error?) {
-        var data: Data?
-        var response: URLResponse?
-        var error: Error?
-
-        let semaphore = DispatchSemaphore(value: 0)
-
-        let task = dataTask(with: request) {
-            data = $0
-            response = $1
-            error = $2
-
-            semaphore.signal()
-        }
-        task.resume()
-
-        _ = semaphore.wait(timeout: .distantFuture)
-
-        return (data, response, error)
-    }
-}
-
-extension DcContact {
-    func contains(searchText text: String) -> [ContactHighlights] {
-        var nameIndexes = [Int]()
-        var emailIndexes = [Int]()
-
-        let contactString = name + email
-        let subsequenceIndexes = contactString.contains(subSequence: text)
-
-        if !subsequenceIndexes.isEmpty {
-            for index in subsequenceIndexes {
-                if index < name.count {
-                    nameIndexes.append(index)
-                } else {
-                    let emailIndex = index - name.count
-                    emailIndexes.append(emailIndex)
-                }
-            }
-            return [ContactHighlights(contactDetail: .NAME, indexes: nameIndexes), ContactHighlights(contactDetail: .EMAIL, indexes: emailIndexes)]
-        } else {
-            return []
-        }
-    }
-
-    func containsExact(searchText text: String) -> [ContactHighlights] {
-        var contactHighlights = [ContactHighlights]()
-
-        let nameString = name + ""
-        let emailString = email + ""
-        if let nameRange = nameString.range(of: text, options: .caseInsensitive) {
-            let index: Int = nameString.distance(from: nameString.startIndex, to: nameRange.lowerBound)
-            var nameIndexes = [Int]()
-            for i in index..<(index + text.count) {
-                nameIndexes.append(i)
-            }
-            contactHighlights.append(ContactHighlights(contactDetail: .NAME, indexes: nameIndexes))
-        }
-
-        if let emailRange = emailString.range(of: text, options: .caseInsensitive) {
-            let index: Int = emailString.distance(from: emailString.startIndex, to: emailRange.lowerBound)
-            var emailIndexes = [Int]()
-            for i in index..<(index + text.count) {
-                emailIndexes.append(i)
-            }
-            contactHighlights.append(ContactHighlights(contactDetail: .EMAIL, indexes: emailIndexes))
-        }
-
-        return contactHighlights
-    }
-}
-
-extension UIImage {
-
-    func dcCompress(toMax target: Float = 1280) -> UIImage? {
-        return resize(toMax: target)
-    }
-
-    func imageSizeInPixel() -> CGSize {
-        let heightInPoints = size.height
-        let heightInPixels = heightInPoints * scale
-        let widthInPoints = size.width
-        let widthInPixels = widthInPoints * scale
-        return CGSize(width: widthInPixels, height: heightInPixels)
-    }
-
-    // source: https://stackoverflow.com/questions/29137488/how-do-i-resize-the-uiimage-to-reduce-upload-image-size // slightly changed
-    func resize(toMax: Float) -> UIImage? {
-        var actualHeight = Float(size.height)
-        var actualWidth = Float(size.width)
-        let maxHeight: Float = toMax
-        let maxWidth: Float = toMax
-        var imgRatio: Float = actualWidth / actualHeight
-        let maxRatio: Float = maxWidth / maxHeight
-        let compressionQuality: Float = 0.5
-        //50 percent compression
-        if actualHeight > maxHeight || actualWidth > maxWidth {
-            if imgRatio < maxRatio {
-                //adjust width according to maxHeight
-                imgRatio = maxHeight / actualHeight
-                actualWidth = imgRatio * actualWidth
-                actualHeight = maxHeight
-            } else if imgRatio > maxRatio {
-                //adjust height according to maxWidth
-                imgRatio = maxWidth / actualWidth
-                actualHeight = imgRatio * actualHeight
-                actualWidth = maxWidth
-            } else {
-                actualHeight = maxHeight
-                actualWidth = maxWidth
-            }
-        }
-
-        let rect = CGRect(x: 0.0, y: 0.0, width: CGFloat(actualWidth), height: CGFloat(actualHeight))
-        UIGraphicsBeginImageContext(rect.size)
-        draw(in: rect)
-        let img = UIGraphicsGetImageFromCurrentImageContext()
-        let imageData = img?.jpegData(compressionQuality: CGFloat(compressionQuality))
-        UIGraphicsEndImageContext()
-        return UIImage(data: imageData!)
-    }
-}
-
-
-extension UIColor {
-    convenience init(alpha: Int, red: Int, green: Int, blue: Int) {
-        assert(red >= 0 && red <= 255, "Invalid red component")
-        assert(green >= 0 && green <= 255, "Invalid green component")
-        assert(blue >= 0 && blue <= 255, "Invalid blue component")
-
-        self.init(red: CGFloat(red) / 255, green: CGFloat(green) / 255, blue: CGFloat(blue) / 255, alpha: CGFloat(alpha) / 255)
-    }
-
-    convenience init(netHex: Int) {
-        var alpha = (netHex >> 24) & 0xFF
-        if alpha == 0 {
-            alpha = 255
-        }
-
-        self.init(alpha: alpha, red: (netHex >> 16) & 0xFF, green: (netHex >> 8) & 0xFF, blue: netHex & 0xFF)
-    }
-
-    // see: https://stackoverflow.com/a/33397427
-    convenience init(hexString: String) {
-        let hex = hexString.trimmingCharacters(in: CharacterSet.alphanumerics.inverted)
-        var int = UInt32()
-        Scanner(string: hex).scanHexInt32(&int)
-        let a, r, g, b: UInt32
-        switch hex.count {
-        case 3: // RGB (12-bit)
-            (a, r, g, b) = (255, (int >> 8) * 17, (int >> 4 & 0xF) * 17, (int & 0xF) * 17)
-        case 6: // RGB (24-bit)
-            (a, r, g, b) = (255, int >> 16, int >> 8 & 0xFF, int & 0xFF)
-        case 8: // ARGB (32-bit)
-            (a, r, g, b) = (int >> 24, int >> 16 & 0xFF, int >> 8 & 0xFF, int & 0xFF)
-        default:
-            (a, r, g, b) = (255, 0, 0, 0)
-        }
-        self.init(red: CGFloat(r) / 255, green: CGFloat(g) / 255, blue: CGFloat(b) / 255, alpha: CGFloat(a) / 255)
-    }
-
-
-}

+ 0 - 49
deltachat-ios/Helper/UIImage+Extension.swift

@@ -1,49 +0,0 @@
-import UIKit
-
-extension UIImage {
-    func imageResize(sizeChange: CGSize) -> UIImage {
-        let hasAlpha = true
-        let scale: CGFloat = 0.0 // Use scale factor of main screen
-
-        UIGraphicsBeginImageContextWithOptions(sizeChange, !hasAlpha, scale)
-        draw(in: CGRect(origin: CGPoint.zero, size: sizeChange))
-
-        let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
-        return scaledImage!
-    }
-
-    public convenience init?(color: UIColor, size: CGSize = CGSize(width: 1, height: 1)) {
-        let rect = CGRect(origin: .zero, size: size)
-        UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0)
-        color.setFill()
-        UIRectFill(rect)
-        let image = UIGraphicsGetImageFromCurrentImageContext()
-        UIGraphicsEndImageContext()
-
-        guard let cgImage = image?.cgImage else { return nil }
-        self.init(cgImage: cgImage)
-    }
-
-    func resizeImage(targetSize: CGSize) -> UIImage? {
-        let size = self.size
-
-        let widthRatio  = targetSize.width  / size.width
-        let heightRatio = targetSize.height / size.height
-
-        var newSize: CGSize
-        if widthRatio > heightRatio {
-            newSize = CGSize(width: size.width * heightRatio, height: size.height * heightRatio)
-        } else {
-            newSize = CGSize(width: size.width * widthRatio, height: size.height *      widthRatio)
-        }
-
-        let rect = CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height)
-
-        UIGraphicsBeginImageContextWithOptions(newSize, false, 1.0)
-        draw(in: rect)
-        let newImage = UIGraphicsGetImageFromCurrentImageContext()
-        UIGraphicsEndImageContext()
-
-        return newImage
-    }
-}

+ 0 - 101
deltachat-ios/Helper/UIView+Extension.swift

@@ -1,101 +0,0 @@
-import UIKit
-
-extension UIView {
-    func makeBorder(color: UIColor = UIColor.red) {
-        self.layer.borderColor = color.cgColor
-        self.layer.borderWidth = 2
-        print("hello")
-    }
-
-    func constraintAlignTopTo(_ view: UIView) -> NSLayoutConstraint {
-        return constraintAlignTopTo(view, paddingTop: 0.0)
-    }
-
-    func constraintAlignTopTo(_ view: UIView, paddingTop: CGFloat = 0.0) -> NSLayoutConstraint {
-        return NSLayoutConstraint(
-            item: self,
-            attribute: .top,
-            relatedBy: .equal,
-            toItem: view,
-            attribute: .top,
-            multiplier: 1.0,
-            constant: paddingTop)
-    }
-
-    func constraintAlignBottomTo(_ view: UIView, paddingBottom: CGFloat = 0.0) -> NSLayoutConstraint {
-        return NSLayoutConstraint(
-            item: self,
-            attribute: .bottom,
-            relatedBy: .equal,
-            toItem: view,
-            attribute: .bottom,
-            multiplier: 1.0,
-            constant: -paddingBottom)
-    }
-
-    func constraintAlignLeadingTo(_ view: UIView, paddingLeading: CGFloat = 0.0) -> NSLayoutConstraint {
-        return NSLayoutConstraint(
-            item: self,
-            attribute: .leading,
-            relatedBy: .equal,
-            toItem: view,
-            attribute: .leading,
-            multiplier: 1.0,
-            constant: paddingLeading)
-    }
-
-    func constraintAlignTrailingTo(_ view: UIView, paddingTrailing: CGFloat = 0.0) -> NSLayoutConstraint {
-        return NSLayoutConstraint(
-            item: self,
-            attribute: .trailing,
-            relatedBy: .equal,
-            toItem: view,
-            attribute: .trailing,
-            multiplier: 1.0,
-            constant: -paddingTrailing)
-    }
-
-    func constraintToBottomOf(_ view: UIView, paddingTop: CGFloat = 0.0) -> NSLayoutConstraint {
-        return NSLayoutConstraint(
-            item: self,
-            attribute: .top,
-            relatedBy: .equal,
-            toItem: view,
-            attribute: .bottom,
-            multiplier: 1.0,
-            constant: paddingTop)
-    }
-
-    func constraintToTrailingOf(_ view: UIView, paddingLeading: CGFloat = 0.0) -> NSLayoutConstraint {
-        return NSLayoutConstraint(
-            item: self,
-            attribute: .leading,
-            relatedBy: .equal,
-            toItem: view,
-            attribute: .trailing,
-            multiplier: 1.0,
-            constant: paddingLeading)
-    }
-
-
-    func constraintCenterXTo(_ view: UIView, paddingX: CGFloat = 0.0) -> NSLayoutConstraint {
-        return NSLayoutConstraint(item: self,
-                                  attribute: .centerX,
-                                  relatedBy: .equal,
-                                  toItem: view,
-                                  attribute: .centerX,
-                                  multiplier: 1.0,
-                                  constant: paddingX)
-    }
-
-    func constraintCenterYTo(_ view: UIView, paddingY: CGFloat = 0.0) -> NSLayoutConstraint {
-        return NSLayoutConstraint(item: self,
-                                  attribute: .centerY,
-                                  relatedBy: .equal,
-                                  toItem: view,
-                                  attribute: .centerY,
-                                  multiplier: 1.0,
-                                  constant: paddingY)
-    }
-
-}

+ 13 - 7
Pods/MessageKit/Sources/Controllers/MessagesViewController+Keyboard.swift → deltachat-ios/MessageKit/Controllers/MessagesViewController+Keyboard.swift

@@ -29,13 +29,19 @@ internal extension MessagesViewController {
 
     // MARK: - Register / Unregister Observers
 
-    internal func addKeyboardObservers() {
-        NotificationCenter.default.addObserver(self, selector: #selector(MessagesViewController.handleKeyboardDidChangeState(_:)), name: UIResponder.keyboardWillChangeFrameNotification, object: nil)
-        NotificationCenter.default.addObserver(self, selector: #selector(MessagesViewController.handleTextViewDidBeginEditing(_:)), name: UITextView.textDidBeginEditingNotification, object: nil)
-        NotificationCenter.default.addObserver(self, selector: #selector(MessagesViewController.adjustScrollViewTopInset), name: UIDevice.orientationDidChangeNotification, object: nil)
+    func addKeyboardObservers() {
+        NotificationCenter.default.addObserver(self,
+                                               selector: #selector(MessagesViewController.handleKeyboardDidChangeState(_:)),
+                                               name: UIResponder.keyboardWillChangeFrameNotification, object: nil)
+        NotificationCenter.default.addObserver(self,
+                                               selector: #selector(MessagesViewController.handleTextViewDidBeginEditing(_:)),
+                                               name: UITextView.textDidBeginEditingNotification, object: nil)
+        NotificationCenter.default.addObserver(self,
+                                               selector: #selector(MessagesViewController.adjustScrollViewTopInset),
+                                               name: UIDevice.orientationDidChangeNotification, object: nil)
     }
 
-    internal func removeKeyboardObservers() {
+    func removeKeyboardObservers() {
         NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillChangeFrameNotification, object: nil)
         NotificationCenter.default.removeObserver(self, name: UITextView.textDidBeginEditingNotification, object: nil)
         NotificationCenter.default.removeObserver(self, name: UIDevice.orientationDidChangeNotification, object: nil)
@@ -95,7 +101,7 @@ internal extension MessagesViewController {
     // MARK: - Inset Computation
 
     @objc
-    internal func adjustScrollViewTopInset() {
+    func adjustScrollViewTopInset() {
         if #available(iOS 11.0, *) {
             // No need to add to the top contentInset
         } else {
@@ -121,7 +127,7 @@ internal extension MessagesViewController {
         }
     }
 
-    internal func requiredInitialScrollViewBottomInset() -> CGFloat {
+    func requiredInitialScrollViewBottomInset() -> CGFloat {
         guard let inputAccessoryView = inputAccessoryView else { return 0 }
         return max(0, inputAccessoryView.frame.height + additionalBottomInset - automaticallyAddedBottomInset)
     }

+ 16 - 6
Pods/MessageKit/Sources/Controllers/MessagesViewController+Menu.swift → deltachat-ios/MessageKit/Controllers/MessagesViewController+Menu.swift

@@ -23,16 +23,19 @@
  */
 
 import Foundation
+import UIKit
 
 internal extension MessagesViewController {
 
     // MARK: - Register / Unregister Observers
 
-    internal func addMenuControllerObservers() {
-        NotificationCenter.default.addObserver(self, selector: #selector(MessagesViewController.menuControllerWillShow(_:)), name: UIMenuController.willShowMenuNotification, object: nil)
+    func addMenuControllerObservers() {
+        NotificationCenter.default.addObserver(self,
+                                               selector: #selector(MessagesViewController.menuControllerWillShow(_:)),
+                                               name: UIMenuController.willShowMenuNotification, object: nil)
     }
 
-    internal func removeMenuControllerObservers() {
+    func removeMenuControllerObservers() {
         NotificationCenter.default.removeObserver(self, name: UIMenuController.willShowMenuNotification, object: nil)
     }
 
@@ -70,14 +73,21 @@ internal extension MessagesViewController {
 
         let menuHeight = currentMenuController.menuFrame.height
 
-        let selectedCellMessageBubblePlusMenuFrame = CGRect(selectedCellMessageBubbleFrame.origin.x, selectedCellMessageBubbleFrame.origin.y - menuHeight, selectedCellMessageBubbleFrame.size.width, selectedCellMessageBubbleFrame.size.height + 2 * menuHeight)
+        let selectedCellMessageBubblePlusMenuFrame =
+            CGRect(selectedCellMessageBubbleFrame.origin.x,
+                   selectedCellMessageBubbleFrame.origin.y - menuHeight,
+                   selectedCellMessageBubbleFrame.size.width,
+                   selectedCellMessageBubbleFrame.size.height + 2 * menuHeight)
 
         var targetRect: CGRect = selectedCellMessageBubbleFrame
         currentMenuController.arrowDirection = .default
 
         /// Message bubble intersects with navigationBar and keyboard
-        if selectedCellMessageBubblePlusMenuFrame.intersects(topNavigationBarFrame) && selectedCellMessageBubblePlusMenuFrame.intersects(messageInputBarFrame) {
-            let centerY = (selectedCellMessageBubblePlusMenuFrame.intersection(messageInputBarFrame).minY + selectedCellMessageBubblePlusMenuFrame.intersection(topNavigationBarFrame).maxY) / 2
+        if selectedCellMessageBubblePlusMenuFrame.intersects(topNavigationBarFrame) &&
+            selectedCellMessageBubblePlusMenuFrame.intersects(messageInputBarFrame) {
+
+            let centerY = (selectedCellMessageBubblePlusMenuFrame.intersection(messageInputBarFrame).minY +
+                selectedCellMessageBubblePlusMenuFrame.intersection(topNavigationBarFrame).maxY) / 2
             targetRect = CGRect(selectedCellMessageBubblePlusMenuFrame.midX, centerY, 1, 1)
         } /// Message bubble only intersects with navigationBar
         else if selectedCellMessageBubblePlusMenuFrame.intersects(topNavigationBarFrame) {

+ 13 - 4
Pods/MessageKit/Sources/Controllers/MessagesViewController.swift → deltachat-ios/MessageKit/Controllers/MessagesViewController.swift

@@ -145,7 +145,9 @@ UICollectionViewDelegateFlowLayout, UICollectionViewDataSource {
 
     private func setupDefaults() {
         extendedLayoutIncludesOpaqueBars = true
-        automaticallyAdjustsScrollViewInsets = false
+        if #available(iOS 11.0, *) {} else {
+            automaticallyAdjustsScrollViewInsets = false
+        }
         view.backgroundColor = .white
         messagesCollectionView.keyboardDismissMode = .interactive
         messagesCollectionView.alwaysBounceVertical = true
@@ -162,7 +164,7 @@ UICollectionViewDelegateFlowLayout, UICollectionViewDataSource {
 
     private func setupConstraints() {
         messagesCollectionView.translatesAutoresizingMaskIntoConstraints = false
-        
+
         let top = messagesCollectionView.topAnchor.constraint(equalTo: view.topAnchor, constant: topLayoutGuide.length)
         let bottom = messagesCollectionView.bottomAnchor.constraint(equalTo: view.bottomAnchor)
         if #available(iOS 11.0, *) {
@@ -282,6 +284,10 @@ UICollectionViewDelegateFlowLayout, UICollectionViewDataSource {
             let cell = messagesCollectionView.dequeueReusableCell(MediaMessageCell.self, for: indexPath)
             cell.configure(with: message, at: indexPath, and: messagesCollectionView)
             return cell
+        case .photoText:
+            let cell = messagesCollectionView.dequeueReusableCell(TextMediaMessageCell.self, for: indexPath)
+            cell.configure(with: message, at: indexPath, and: messagesCollectionView)
+            return cell
         case .location:
             let cell = messagesCollectionView.dequeueReusableCell(LocationMessageCell.self, for: indexPath)
             cell.configure(with: message, at: indexPath, and: messagesCollectionView)
@@ -368,7 +374,7 @@ UICollectionViewDelegateFlowLayout, UICollectionViewDataSource {
         let message = messagesDataSource.messageForItem(at: indexPath, in: messagesCollectionView)
 
         switch message.kind {
-        case .text, .attributedText, .emoji, .photo:
+        case .text, .attributedText, .emoji, .photo, .photoText:
             selectedIndexPathForMenu = indexPath
             return true
         default:
@@ -397,6 +403,9 @@ UICollectionViewDelegateFlowLayout, UICollectionViewDataSource {
             pasteBoard.string = attributedText.string
         case .photo(let mediaItem):
             pasteBoard.image = mediaItem.image ?? mediaItem.placeholderImage
+        case .photoText(let mediaItem):
+            pasteBoard.image = mediaItem.image ?? mediaItem.placeholderImage
+            pasteBoard.string = mediaItem.text?.string
         default:
             break
         }
@@ -408,7 +417,7 @@ UICollectionViewDelegateFlowLayout, UICollectionViewDataSource {
         NotificationCenter.default.addObserver(
             self, selector: #selector(clearMemoryCache), name: UIApplication.didReceiveMemoryWarningNotification, object: nil)
     }
-    
+
     private func removeObservers() {
         NotificationCenter.default.removeObserver(self, name: UIApplication.didReceiveMemoryWarningNotification, object: nil)
     }

+ 1 - 0
Pods/MessageKit/Sources/Layout/AudioMessageSizeCalculator.swift → deltachat-ios/MessageKit/Layout/AudioMessageSizeCalculator.swift

@@ -23,6 +23,7 @@
  */
 
 import Foundation
+import UIKit
 
 open class AudioMessageSizeCalculator: MessageSizeCalculator {
 

+ 0 - 0
Pods/MessageKit/Sources/Layout/CellSizeCalculator.swift → deltachat-ios/MessageKit/Layout/CellSizeCalculator.swift


+ 11 - 10
Pods/MessageKit/Sources/Layout/ContactMessageSizeCalculator.swift → deltachat-ios/MessageKit/Layout/ContactMessageSizeCalculator.swift

@@ -23,47 +23,48 @@
  */
 
 import Foundation
+import UIKit
 
 open class ContactMessageSizeCalculator: MessageSizeCalculator {
-    
+
     public var incomingMessageNameLabelInsets = UIEdgeInsets(top: 7, left: 46, bottom: 7, right: 30)
     public var outgoingMessageNameLabelInsets = UIEdgeInsets(top: 7, left: 41, bottom: 7, right: 35)
     public var contactLabelFont = UIFont.preferredFont(forTextStyle: .body)
-    
+
     internal func contactLabelInsets(for message: MessageType) -> UIEdgeInsets {
         let dataSource = messagesLayout.messagesDataSource
         let isFromCurrentSender = dataSource.isFromCurrentSender(message: message)
         return isFromCurrentSender ? outgoingMessageNameLabelInsets : incomingMessageNameLabelInsets
     }
-    
+
     open override func messageContainerMaxWidth(for message: MessageType) -> CGFloat {
         let maxWidth = super.messageContainerMaxWidth(for: message)
         let textInsets = contactLabelInsets(for: message)
         return maxWidth - textInsets.horizontal
     }
-    
+
     open override func messageContainerSize(for message: MessageType) -> CGSize {
         let maxWidth = messageContainerMaxWidth(for: message)
-        
+
         var messageContainerSize: CGSize
         let attributedText: NSAttributedString
-        
+
         switch message.kind {
         case .contact(let item):
             attributedText = NSAttributedString(string: item.displayName, attributes: [.font: contactLabelFont])
         default:
             fatalError("messageContainerSize received unhandled MessageDataType: \(message.kind)")
         }
-        
+
         messageContainerSize = labelSize(for: attributedText, considering: maxWidth)
-        
+
         let messageInsets = contactLabelInsets(for: message)
         messageContainerSize.width += messageInsets.horizontal
         messageContainerSize.height += messageInsets.vertical
-        
+
         return messageContainerSize
     }
-    
+
     open override func configure(attributes: UICollectionViewLayoutAttributes) {
         super.configure(attributes: attributes)
         guard let attributes = attributes as? MessagesCollectionViewLayoutAttributes else { return }

+ 1 - 0
Pods/MessageKit/Sources/Layout/LocationMessageSizeCalculator.swift → deltachat-ios/MessageKit/Layout/LocationMessageSizeCalculator.swift

@@ -23,6 +23,7 @@
  */
 
 import Foundation
+import UIKit
 
 open class LocationMessageSizeCalculator: MessageSizeCalculator {
 

+ 1 - 0
Pods/MessageKit/Sources/Layout/MediaMessageSizeCalculator.swift → deltachat-ios/MessageKit/Layout/MediaMessageSizeCalculator.swift

@@ -23,6 +23,7 @@
  */
 
 import Foundation
+import UIKit
 
 open class MediaMessageSizeCalculator: MessageSizeCalculator {
 

+ 1 - 0
Pods/MessageKit/Sources/Layout/MessageSizeCalculator.swift → deltachat-ios/MessageKit/Layout/MessageSizeCalculator.swift

@@ -23,6 +23,7 @@
  */
 
 import Foundation
+import UIKit
 
 open class MessageSizeCalculator: CellSizeCalculator {
 

+ 25 - 18
Pods/MessageKit/Sources/Layout/MessagesCollectionViewFlowLayout.swift → deltachat-ios/MessageKit/Layout/MessagesCollectionViewFlowLayout.swift

@@ -89,7 +89,10 @@ open class MessagesCollectionViewFlowLayout: UICollectionViewFlowLayout {
     }
     
     private func setupObserver() {
-        NotificationCenter.default.addObserver(self, selector: #selector(MessagesCollectionViewFlowLayout.handleOrientationChange(_:)), name: UIDevice.orientationDidChangeNotification, object: nil)
+        NotificationCenter.default.addObserver(self,
+                                               selector: #selector(MessagesCollectionViewFlowLayout.handleOrientationChange(_:)),
+                                               name: UIDevice.orientationDidChangeNotification,
+                                               object: nil)
     }
 
     // MARK: - Typing Indicator API
@@ -163,6 +166,7 @@ open class MessagesCollectionViewFlowLayout: UICollectionViewFlowLayout {
         sizeCalculator.messageLabelFont = UIFont.systemFont(ofSize: sizeCalculator.messageLabelFont.pointSize * 2)
         return sizeCalculator
     }()
+    lazy open var photoTextMessageSizeCalculator = TextMediaMessageSizeCalculator(layout: self)
     lazy open var photoMessageSizeCalculator = MediaMessageSizeCalculator(layout: self)
     lazy open var videoMessageSizeCalculator = MediaMessageSizeCalculator(layout: self)
     lazy open var locationMessageSizeCalculator = LocationMessageSizeCalculator(layout: self)
@@ -189,6 +193,8 @@ open class MessagesCollectionViewFlowLayout: UICollectionViewFlowLayout {
             return emojiMessageSizeCalculator
         case .photo:
             return photoMessageSizeCalculator
+        case .photoText:
+            return photoTextMessageSizeCalculator
         case .video:
             return videoMessageSizeCalculator
         case .location:
@@ -206,22 +212,22 @@ open class MessagesCollectionViewFlowLayout: UICollectionViewFlowLayout {
         let calculator = cellSizeCalculatorForItem(at: indexPath)
         return calculator.sizeForItem(at: indexPath)
     }
-    
+
     /// Set `incomingAvatarSize` of all `MessageSizeCalculator`s
     public func setMessageIncomingAvatarSize(_ newSize: CGSize) {
         messageSizeCalculators().forEach { $0.incomingAvatarSize = newSize }
     }
-    
+
     /// Set `outgoingAvatarSize` of all `MessageSizeCalculator`s
     public func setMessageOutgoingAvatarSize(_ newSize: CGSize) {
         messageSizeCalculators().forEach { $0.outgoingAvatarSize = newSize }
     }
-    
+
     /// Set `incomingAvatarPosition` of all `MessageSizeCalculator`s
     public func setMessageIncomingAvatarPosition(_ newPosition: AvatarPosition) {
         messageSizeCalculators().forEach { $0.incomingAvatarPosition = newPosition }
     }
-    
+
     /// Set `outgoingAvatarPosition` of all `MessageSizeCalculator`s
     public func setMessageOutgoingAvatarPosition(_ newPosition: AvatarPosition) {
         messageSizeCalculators().forEach { $0.outgoingAvatarPosition = newPosition }
@@ -231,52 +237,52 @@ open class MessagesCollectionViewFlowLayout: UICollectionViewFlowLayout {
     public func setAvatarLeadingTrailingPadding(_ newPadding: CGFloat) {
         messageSizeCalculators().forEach { $0.avatarLeadingTrailingPadding = newPadding }
     }
-    
+
     /// Set `incomingMessagePadding` of all `MessageSizeCalculator`s
     public func setMessageIncomingMessagePadding(_ newPadding: UIEdgeInsets) {
         messageSizeCalculators().forEach { $0.incomingMessagePadding = newPadding }
     }
-    
+
     /// Set `outgoingMessagePadding` of all `MessageSizeCalculator`s
     public func setMessageOutgoingMessagePadding(_ newPadding: UIEdgeInsets) {
         messageSizeCalculators().forEach { $0.outgoingMessagePadding = newPadding }
     }
-    
+
     /// Set `incomingCellTopLabelAlignment` of all `MessageSizeCalculator`s
     public func setMessageIncomingCellTopLabelAlignment(_ newAlignment: LabelAlignment) {
         messageSizeCalculators().forEach { $0.incomingCellTopLabelAlignment = newAlignment }
     }
-    
+
     /// Set `outgoingCellTopLabelAlignment` of all `MessageSizeCalculator`s
     public func setMessageOutgoingCellTopLabelAlignment(_ newAlignment: LabelAlignment) {
         messageSizeCalculators().forEach { $0.outgoingCellTopLabelAlignment = newAlignment }
     }
-    
+
     /// Set `incomingCellBottomLabelAlignment` of all `MessageSizeCalculator`s
     public func setMessageIncomingCellBottomLabelAlignment(_ newAlignment: LabelAlignment) {
         messageSizeCalculators().forEach { $0.incomingCellBottomLabelAlignment = newAlignment }
     }
-    
+
     /// Set `outgoingCellBottomLabelAlignment` of all `MessageSizeCalculator`s
     public func setMessageOutgoingCellBottomLabelAlignment(_ newAlignment: LabelAlignment) {
         messageSizeCalculators().forEach { $0.outgoingCellBottomLabelAlignment = newAlignment }
     }
-    
+
     /// Set `incomingMessageTopLabelAlignment` of all `MessageSizeCalculator`s
     public func setMessageIncomingMessageTopLabelAlignment(_ newAlignment: LabelAlignment) {
         messageSizeCalculators().forEach { $0.incomingMessageTopLabelAlignment = newAlignment }
     }
-    
+
     /// Set `outgoingMessageTopLabelAlignment` of all `MessageSizeCalculator`s
     public func setMessageOutgoingMessageTopLabelAlignment(_ newAlignment: LabelAlignment) {
         messageSizeCalculators().forEach { $0.outgoingMessageTopLabelAlignment = newAlignment }
     }
-    
+
     /// Set `incomingMessageBottomLabelAlignment` of all `MessageSizeCalculator`s
     public func setMessageIncomingMessageBottomLabelAlignment(_ newAlignment: LabelAlignment) {
         messageSizeCalculators().forEach { $0.incomingMessageBottomLabelAlignment = newAlignment }
     }
-    
+
     /// Set `outgoingMessageBottomLabelAlignment` of all `MessageSizeCalculator`s
     public func setMessageOutgoingMessageBottomLabelAlignment(_ newAlignment: LabelAlignment) {
         messageSizeCalculators().forEach { $0.outgoingMessageBottomLabelAlignment = newAlignment }
@@ -301,12 +307,12 @@ open class MessagesCollectionViewFlowLayout: UICollectionViewFlowLayout {
     public func setMessageOutgoingAccessoryViewPadding(_ newPadding: HorizontalEdgeInsets) {
         messageSizeCalculators().forEach { $0.outgoingAccessoryViewPadding = newPadding }
     }
-    
+
     /// Set `incomingAccessoryViewPosition` of all `MessageSizeCalculator`s
     public func setMessageIncomingAccessoryViewPosition(_ newPosition: AccessoryPosition) {
         messageSizeCalculators().forEach { $0.incomingAccessoryViewPosition = newPosition }
     }
-    
+
     /// Set `outgoingAccessoryViewPosition` of all `MessageSizeCalculator`s
     public func setMessageOutgoingAccessoryViewPosition(_ newPosition: AccessoryPosition) {
         messageSizeCalculators().forEach { $0.outgoingAccessoryViewPosition = newPosition }
@@ -317,6 +323,7 @@ open class MessagesCollectionViewFlowLayout: UICollectionViewFlowLayout {
         return [textMessageSizeCalculator,
                 attributedTextMessageSizeCalculator,
                 emojiMessageSizeCalculator,
+                photoTextMessageSizeCalculator,
                 photoMessageSizeCalculator,
                 videoMessageSizeCalculator,
                 locationMessageSizeCalculator,
@@ -324,5 +331,5 @@ open class MessagesCollectionViewFlowLayout: UICollectionViewFlowLayout {
                 contactMessageSizeCalculator
         ]
     }
-    
+
 }

+ 3 - 3
Pods/MessageKit/Sources/Layout/MessagesCollectionViewLayoutAttributes.swift → deltachat-ios/MessageKit/Layout/MessagesCollectionViewLayoutAttributes.swift

@@ -40,10 +40,10 @@ open class MessagesCollectionViewLayoutAttributes: UICollectionViewLayoutAttribu
 
     public var cellTopLabelAlignment = LabelAlignment(textAlignment: .center, textInsets: .zero)
     public var cellTopLabelSize: CGSize = .zero
-    
+
     public var cellBottomLabelAlignment = LabelAlignment(textAlignment: .center, textInsets: .zero)
     public var cellBottomLabelSize: CGSize = .zero
-    
+
     public var messageTopLabelAlignment = LabelAlignment(textAlignment: .center, textInsets: .zero)
     public var messageTopLabelSize: CGSize = .zero
 
@@ -53,7 +53,7 @@ open class MessagesCollectionViewLayoutAttributes: UICollectionViewLayoutAttribu
     public var accessoryViewSize: CGSize = .zero
     public var accessoryViewPadding: HorizontalEdgeInsets = .zero
     public var accessoryViewPosition: AccessoryPosition = .messageCenter
-    
+
     // MARK: - Methods
 
     open override func copy(with zone: NSZone? = nil) -> Any {

+ 101 - 0
deltachat-ios/MessageKit/Layout/TextMediaMessageSizeCalculator.swift

@@ -0,0 +1,101 @@
+/*
+ MIT License
+
+ Copyright (c) 2017-2019 MessageKit
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+ */
+
+import Foundation
+import UIKit
+
+open class TextMediaMessageSizeCalculator: MessageSizeCalculator {
+
+    public var incomingMessageLabelInsets = UIEdgeInsets(top: TextMediaMessageCell.insetTop,
+                                                         left: TextMediaMessageCell.insetHorizontalBig,
+                                                         bottom: TextMediaMessageCell.insetBottom,
+                                                         right: TextMediaMessageCell.insetHorizontalSmall)
+    public var outgoingMessageLabelInsets = UIEdgeInsets(top: TextMediaMessageCell.insetTop,
+                                                         left: TextMediaMessageCell.insetHorizontalSmall,
+                                                         bottom: TextMediaMessageCell.insetBottom,
+                                                         right: TextMediaMessageCell.insetHorizontalBig)
+
+    public var messageLabelFont = UIFont.preferredFont(forTextStyle: .body)
+
+    internal func messageLabelInsets(for message: MessageType) -> UIEdgeInsets {
+        let dataSource = messagesLayout.messagesDataSource
+        let isFromCurrentSender = dataSource.isFromCurrentSender(message: message)
+        return isFromCurrentSender ? outgoingMessageLabelInsets : incomingMessageLabelInsets
+    }
+
+    open override func messageContainerSize(for message: MessageType) -> CGSize {
+        let maxImageWidth = messageContainerMaxWidth(for: message)
+
+        let sizeForMediaItem = { (maxWidth: CGFloat, item: MediaItem) -> CGSize in
+            let maxTextWidth = maxWidth - self.messageLabelInsets(for: message).horizontal
+            var imageHeight = item.size.height
+            var itemWidth = item.size.width
+
+            if maxWidth < item.size.width {
+                // Maintain the ratio if width is too great
+                imageHeight = maxWidth * item.size.height / item.size.width
+                itemWidth = maxWidth
+            }
+
+            var messageContainerSize = CGSize(width: itemWidth, height: imageHeight)
+            switch message.kind {
+            case .photoText(let mediaItem):
+                if let text = mediaItem.text {
+                    let textHeight = text.height(withConstrainedWidth: maxTextWidth)
+                    messageContainerSize.height += textHeight
+                    messageContainerSize.height +=  self.messageLabelInsets(for: message).vertical
+                }
+                return messageContainerSize
+            default:
+                return messageContainerSize
+            }
+        }
+
+        switch message.kind {
+        case .photoText(let item):
+            return sizeForMediaItem(maxImageWidth, item)
+        default:
+            fatalError("messageContainerSize received unhandled MessageDataType: \(message.kind)")
+        }
+    }
+
+    open override func configure(attributes: UICollectionViewLayoutAttributes) {
+        super.configure(attributes: attributes)
+        guard let attributes = attributes as? MessagesCollectionViewLayoutAttributes else { return }
+
+        let dataSource = messagesLayout.messagesDataSource
+        let indexPath = attributes.indexPath
+        let message = dataSource.messageForItem(at: indexPath, in: messagesLayout.messagesCollectionView)
+
+        switch message.kind {
+        case .photoText:
+            attributes.messageLabelInsets = messageLabelInsets(for: message)
+            attributes.messageLabelFont = messageLabelFont
+        default:
+            break
+        }
+    }
+
+
+}

+ 1 - 0
Pods/MessageKit/Sources/Layout/TextMessageSizeCalculator.swift → deltachat-ios/MessageKit/Layout/TextMessageSizeCalculator.swift

@@ -23,6 +23,7 @@
  */
 
 import Foundation
+import UIKit
 
 open class TextMessageSizeCalculator: MessageSizeCalculator {
 

+ 0 - 0
Pods/MessageKit/Sources/Layout/TypingIndicatorCellSizeCalculator.swift → deltachat-ios/MessageKit/Layout/TypingIndicatorCellSizeCalculator.swift


+ 0 - 0
Pods/MessageKit/Sources/Models/AccessoryPosition.swift → deltachat-ios/MessageKit/Models/AccessoryPosition.swift


+ 1 - 0
Pods/MessageKit/Sources/Models/Avatar.swift → deltachat-ios/MessageKit/Models/Avatar.swift

@@ -23,6 +23,7 @@
  */
 
 import Foundation
+import UIKit
 
 /// An object used to group the information to be used by an `AvatarView`.
 public struct Avatar {

+ 0 - 0
Pods/MessageKit/Sources/Models/AvatarPosition.swift → deltachat-ios/MessageKit/Models/AvatarPosition.swift


+ 0 - 0
Pods/MessageKit/Sources/Models/DetectorType.swift → deltachat-ios/MessageKit/Models/DetectorType.swift


+ 2 - 1
Pods/MessageKit/Sources/Models/HorizontalEdgeInsets.swift → deltachat-ios/MessageKit/Models/HorizontalEdgeInsets.swift

@@ -23,6 +23,7 @@
  */
 
 import Foundation
+import UIKit
 
 /// A varient of `UIEdgeInsets` that only has horizontal inset properties
 public struct HorizontalEdgeInsets: Equatable {
@@ -49,7 +50,7 @@ public extension HorizontalEdgeInsets {
 
 internal extension HorizontalEdgeInsets {
 
-    internal var horizontal: CGFloat {
+    var horizontal: CGFloat {
         return left + right
     }
 }

+ 0 - 0
Pods/MessageKit/Sources/Models/LabelAlignment.swift → deltachat-ios/MessageKit/Models/LabelAlignment.swift


+ 0 - 0
Pods/MessageKit/Sources/Models/LocationMessageSnapshotOptions.swift → deltachat-ios/MessageKit/Models/LocationMessageSnapshotOptions.swift


+ 4 - 1
Pods/MessageKit/Sources/Models/MessageKind.swift → deltachat-ios/MessageKit/Models/MessageKind.swift

@@ -35,13 +35,16 @@ public enum MessageKind {
     /// Using `MessageKind.attributedText(NSAttributedString)` doesn't require you
     /// to set this property and results in higher performance.
     case text(String)
-    
+
     /// A message with attributed text.
     case attributedText(NSAttributedString)
 
     /// A photo message.
     case photo(MediaItem)
 
+    /// A photo message with a textual description
+    case photoText(MediaItem)
+
     /// A video message.
     case video(MediaItem)
 

+ 0 - 0
Pods/MessageKit/Sources/Models/MessageKitDateFormatter.swift → deltachat-ios/MessageKit/Models/MessageKitDateFormatter.swift


+ 0 - 0
Pods/MessageKit/Sources/Models/MessageKitError.swift → deltachat-ios/MessageKit/Models/MessageKitError.swift


+ 0 - 0
Pods/MessageKit/Sources/Models/MessageStyle.swift → deltachat-ios/MessageKit/Models/MessageStyle.swift


+ 0 - 0
Pods/MessageKit/Sources/Models/NSConstraintLayoutSet.swift → deltachat-ios/MessageKit/Models/NSConstraintLayoutSet.swift


+ 0 - 0
Pods/MessageKit/Sources/Models/Sender.swift → deltachat-ios/MessageKit/Models/Sender.swift


+ 1 - 0
Pods/MessageKit/Sources/Protocols/AudioItem.swift → deltachat-ios/MessageKit/Protocols/AudioItem.swift

@@ -23,6 +23,7 @@
  */
 
 import class AVFoundation.AVAudioPlayer
+import UIKit
 
 /// A protocol used to represent the data for an audio message.
 public protocol AudioItem {

+ 0 - 0
Pods/MessageKit/Sources/Protocols/ContactItem.swift → deltachat-ios/MessageKit/Protocols/ContactItem.swift


+ 1 - 0
Pods/MessageKit/Sources/Protocols/LocationItem.swift → deltachat-ios/MessageKit/Protocols/LocationItem.swift

@@ -23,6 +23,7 @@
  */
 
 import class CoreLocation.CLLocation
+import UIKit
 
 /// A protocol used to represent the data for a location message.
 public protocol LocationItem {

+ 3 - 0
Pods/MessageKit/Sources/Protocols/MediaItem.swift → deltachat-ios/MessageKit/Protocols/MediaItem.swift

@@ -23,6 +23,7 @@
  */
 
 import Foundation
+import UIKit
 
 /// A protocol used to represent the data for a media message.
 public protocol MediaItem {
@@ -39,4 +40,6 @@ public protocol MediaItem {
     /// The size of the media item.
     var size: CGSize { get }
 
+    var text: NSAttributedString? { get }
+
 }

+ 0 - 0
Pods/MessageKit/Sources/Protocols/MessageCellDelegate.swift → deltachat-ios/MessageKit/Protocols/MessageCellDelegate.swift


+ 0 - 0
Pods/MessageKit/Sources/Protocols/MessageLabelDelegate.swift → deltachat-ios/MessageKit/Protocols/MessageLabelDelegate.swift


+ 0 - 0
Pods/MessageKit/Sources/Protocols/MessageType.swift → deltachat-ios/MessageKit/Protocols/MessageType.swift


+ 5 - 5
Pods/MessageKit/Sources/Protocols/MessagesDataSource.swift → deltachat-ios/MessageKit/Protocols/MessagesDataSource.swift

@@ -72,7 +72,7 @@ public protocol MessagesDataSource: AnyObject {
     ///
     /// The default value returned by this method is `nil`.
     func cellTopLabelAttributedText(for message: MessageType, at indexPath: IndexPath) -> NSAttributedString?
-    
+
     /// The attributed text to be used for cell's bottom label.
     ///
     /// - Parameters:
@@ -82,7 +82,7 @@ public protocol MessagesDataSource: AnyObject {
     ///
     /// The default value returned by this method is `nil`.
     func cellBottomLabelAttributedText(for message: MessageType, at indexPath: IndexPath) -> NSAttributedString?
-    
+
     /// The attributed text to be used for message bubble's top label.
     ///
     /// - Parameters:
@@ -136,11 +136,11 @@ public extension MessagesDataSource {
     func cellTopLabelAttributedText(for message: MessageType, at indexPath: IndexPath) -> NSAttributedString? {
         return nil
     }
-    
+
     func cellBottomLabelAttributedText(for message: MessageType, at indexPath: IndexPath) -> NSAttributedString? {
         return nil
     }
-    
+
     func messageTopLabelAttributedText(for message: MessageType, at indexPath: IndexPath) -> NSAttributedString? {
         return nil
     }
@@ -148,7 +148,7 @@ public extension MessagesDataSource {
     func messageBottomLabelAttributedText(for message: MessageType, at indexPath: IndexPath) -> NSAttributedString? {
         return nil
     }
-    
+
     func customCell(for message: MessageType, at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> UICollectionViewCell {
         fatalError(MessageKitError.customDataUnresolvedCell)
     }

+ 4 - 3
Pods/MessageKit/Sources/Protocols/MessagesDisplayDelegate.swift → deltachat-ios/MessageKit/Protocols/MessagesDisplayDelegate.swift

@@ -24,6 +24,7 @@
 
 import Foundation
 import MapKit
+import UIKit
 
 /// A protocol used by the `MessagesViewController` to customize the appearance of a `MessageContentCell`.
 public protocol MessagesDisplayDelegate: AnyObject {
@@ -71,7 +72,7 @@ public protocol MessagesDisplayDelegate: AnyObject {
     ///   - indexPath: The `IndexPath` of the footer.
     ///   - messagesCollectionView: The `MessagesCollectionView` in which this footer will be displayed.
     func messageFooterView(for indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> MessageReusableView
-    
+
     /// Used to configure the `AvatarView`‘s image in a `MessageContentCell` class.
     ///
     /// - Parameters:
@@ -241,7 +242,7 @@ public extension MessagesDisplayDelegate {
     func messageFooterView(for indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> MessageReusableView {
         return messagesCollectionView.dequeueReusableFooterView(MessageReusableView.self, for: indexPath)
     }
-    
+
     func configureAvatarView(_ avatarView: AvatarView, for message: MessageType, at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) {
         avatarView.initials = "?"
     }
@@ -287,7 +288,7 @@ public extension MessagesDisplayDelegate {
     // MARK: - Audio Message Defaults
     
     func configureAudioCell(_ cell: AudioMessageCell, message: MessageType) {
-        
+
     }
 
     func audioTintColor(for message: MessageType, at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> UIColor {

+ 3 - 2
Pods/MessageKit/Sources/Protocols/MessagesLayoutDelegate.swift → deltachat-ios/MessageKit/Protocols/MessagesLayoutDelegate.swift

@@ -23,6 +23,7 @@
  */
 
 import Foundation
+import UIKit
 
 /// A protocol used by the `MessagesCollectionViewFlowLayout` object to determine
 /// the size and layout of a `MessageCollectionViewCell` and its contents.
@@ -148,7 +149,7 @@ public extension MessagesLayoutDelegate {
     func cellBottomLabelHeight(for message: MessageType, at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> CGFloat {
         return 0
     }
-    
+
     func messageTopLabelHeight(for message: MessageType, at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> CGFloat {
         return 0
     }
@@ -156,7 +157,7 @@ public extension MessagesLayoutDelegate {
     func messageBottomLabelHeight(for message: MessageType, at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> CGFloat {
         return 0
     }
-    
+
     func customCellSizeCalculator(for message: MessageType, at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> CellSizeCalculator {
         fatalError("Must return a CellSizeCalculator for MessageKind.custom(Any?)")
     }

+ 0 - 0
Pods/MessageKit/Sources/Protocols/SenderType.swift → deltachat-ios/MessageKit/Protocols/SenderType.swift


+ 0 - 0
Pods/MessageKit/Sources/Supporting/MessageInputBar.swift → deltachat-ios/MessageKit/Supporting/MessageInputBar.swift


+ 1 - 0
Pods/MessageKit/Sources/Supporting/MessageKit+Availability.swift → deltachat-ios/MessageKit/Supporting/MessageKit+Availability.swift

@@ -23,6 +23,7 @@
  */
 
 import Foundation
+import UIKit
 
 public extension MessagesLayoutDelegate {
 

+ 4 - 18
Pods/MessageKit/Sources/Extensions/UIImage+Extension.swift → deltachat-ios/MessageKit/Supporting/MessageKit.h

@@ -1,7 +1,7 @@
 /*
  MIT License
  
- Copyright (c) 2017-2018 MessageKit
+ Copyright (c) 2017 MessageKit
  
  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,22 +22,8 @@
  SOFTWARE.
  */
 
-public enum ImageType: String {
-    case play
-    case pause
-    case disclouser
-}
+#import <UIKit/UIKit.h>
 
-import UIKit
+FOUNDATION_EXPORT double MessageKitVersionNumber;
 
-/// This extension provide a way to access image resources with in framework
-public extension UIImage {
-    
-    public class func messageKitImageWith(type: ImageType) -> UIImage? {
-        let assetBundle = Bundle.messageKitAssetBundle()
-        let imagePath = assetBundle.path(forResource: type.rawValue, ofType: "png", inDirectory: "Images")
-        let image = UIImage(contentsOfFile: imagePath ?? "")
-        return image
-    }
-    
-}
+FOUNDATION_EXPORT const unsigned char MessageKitVersionString[];

Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio