Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions FlowCrypt.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@
21CE25E62650070300ADFF4B /* WkdUrlConstructor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21CE25E52650070300ADFF4B /* WkdUrlConstructor.swift */; };
21EA3B592656611D00691848 /* ClientConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21EA3B15265647C400691848 /* ClientConfiguration.swift */; };
21F836B62652A26B00B2448C /* DataExntensions+ZBase32Encoding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21F836B52652A26B00B2448C /* DataExntensions+ZBase32Encoding.swift */; };
21FEE26626FDD91A00E3783F /* ComposeMessageAttachment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21FEE26526FDD91A00E3783F /* ComposeMessageAttachment.swift */; };
2C08F6BE273FA7B900EE1610 /* Version5SchemaMigration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C08F6BD273FA7B900EE1610 /* Version5SchemaMigration.swift */; };
2C124DB42728809100A2EFA6 /* ApiCall.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C124DB32728809100A2EFA6 /* ApiCall.swift */; };
2C141B2C274572D50038A3F8 /* Recipient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C141B2B274572D50038A3F8 /* Recipient.swift */; };
Expand Down Expand Up @@ -61,6 +60,7 @@
5133B6702716320F00C95463 /* ContactKeyDetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5133B66F2716320F00C95463 /* ContactKeyDetailViewController.swift */; };
5133B6722716321F00C95463 /* ContactKeyDetailDecorator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5133B6712716321F00C95463 /* ContactKeyDetailDecorator.swift */; };
5133B6742716E5EA00C95463 /* LabelCellNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5133B6732716E5EA00C95463 /* LabelCellNode.swift */; };
5168FB0B274F94D300131072 /* MessageAttachment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5168FB0A274F94D300131072 /* MessageAttachment.swift */; };
51775C32270B01C200D7C944 /* PrvKeyInfoTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51775C31270B01C200D7C944 /* PrvKeyInfoTests.swift */; };
51775C39270C7D2400D7C944 /* StorageMethod.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51775C38270C7D2400D7C944 /* StorageMethod.swift */; };
5180CB9127356D48001FC7EF /* MessageSubjectNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5180CB9027356D48001FC7EF /* MessageSubjectNode.swift */; };
Expand Down Expand Up @@ -443,7 +443,6 @@
21F836B52652A26B00B2448C /* DataExntensions+ZBase32Encoding.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DataExntensions+ZBase32Encoding.swift"; sourceTree = "<group>"; };
21F836CB2652A38700B2448C /* ZBase32EncodingTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ZBase32EncodingTests.swift; sourceTree = "<group>"; };
21F836D22652A46E00B2448C /* WKDURLsConstructorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WKDURLsConstructorTests.swift; sourceTree = "<group>"; };
21FEE26526FDD91A00E3783F /* ComposeMessageAttachment.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposeMessageAttachment.swift; sourceTree = "<group>"; };
2C08F6BD273FA7B900EE1610 /* Version5SchemaMigration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Version5SchemaMigration.swift; sourceTree = "<group>"; };
2C124DB32728809100A2EFA6 /* ApiCall.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApiCall.swift; sourceTree = "<group>"; };
2C141B2B274572D50038A3F8 /* Recipient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Recipient.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -484,6 +483,7 @@
5133B66F2716320F00C95463 /* ContactKeyDetailViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContactKeyDetailViewController.swift; sourceTree = "<group>"; };
5133B6712716321F00C95463 /* ContactKeyDetailDecorator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContactKeyDetailDecorator.swift; sourceTree = "<group>"; };
5133B6732716E5EA00C95463 /* LabelCellNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LabelCellNode.swift; sourceTree = "<group>"; };
5168FB0A274F94D300131072 /* MessageAttachment.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageAttachment.swift; sourceTree = "<group>"; };
51775C31270B01C200D7C944 /* PrvKeyInfoTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrvKeyInfoTests.swift; sourceTree = "<group>"; };
51775C38270C7D2400D7C944 /* StorageMethod.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StorageMethod.swift; sourceTree = "<group>"; };
5180CB9027356D48001FC7EF /* MessageSubjectNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageSubjectNode.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -1348,7 +1348,6 @@
children = (
9F6F3BEC26ADF5DE005BD9C6 /* ComposeMessageService.swift */,
9F6F3BED26ADF5DE005BD9C6 /* ComposeMessageError.swift */,
21FEE26526FDD91A00E3783F /* ComposeMessageAttachment.swift */,
);
path = "Compose Message Service";
sourceTree = "<group>";
Expand Down Expand Up @@ -1427,6 +1426,7 @@
9F93623E2573D16F0009912F /* Gmail+Message.swift */,
9F9362182573D10E0009912F /* Imap+Message.swift */,
9FA9C83B264C2D75005A9670 /* MessageService.swift */,
5168FB0A274F94D300131072 /* MessageAttachment.swift */,
);
path = "Message Provider";
sourceTree = "<group>";
Expand Down Expand Up @@ -2539,6 +2539,7 @@
C132B9D91EC30E1D00763715 /* InboxViewController.swift in Sources */,
9F56BD2C23438A8500A7371A /* Imap+messages.swift in Sources */,
9F6F3BEE26ADF5DE005BD9C6 /* ComposeMessageService.swift in Sources */,
5168FB0B274F94D300131072 /* MessageAttachment.swift in Sources */,
C132B9CB1EC2DE6400763715 /* GeneralConstants.swift in Sources */,
5ADEDCBE23A4363700EC495E /* KeyDetailInfoViewController.swift in Sources */,
D20D3C752520AB9A00D4AA9A /* BackupService.swift in Sources */,
Expand Down Expand Up @@ -2690,7 +2691,6 @@
32DCAF9DA9EC47798DF8BB73 /* SignInViewController.swift in Sources */,
21489B78267CB42400BDE4AC /* LocalClientConfiguration.swift in Sources */,
9FF0671C25520D9D00FCC9E6 /* MailProvider.swift in Sources */,
21FEE26626FDD91A00E3783F /* ComposeMessageAttachment.swift in Sources */,
9FE743072347AA54005E2DBB /* MainNavigationController.swift in Sources */,
9F5C2A8B257E6C4900DE9B4B /* ImapError.swift in Sources */,
9FAFD7592713870800321FA4 /* InboxViewController+State.swift in Sources */,
Expand Down
23 changes: 12 additions & 11 deletions FlowCrypt/Controllers/Compose/ComposeViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@ final class ComposeViewController: TableNodeViewController {
self.passPhraseService = passPhraseService
self.router = router
self.contextToSend.subject = input.subject
self.contextToSend.attachments = input.attachments
super.init(node: TableNode())
}

Expand Down Expand Up @@ -157,7 +158,7 @@ final class ComposeViewController: TableNodeViewController {
}
}

func updateWithMessage(message: Message) {
func update(with message: Message) {
self.contextToSend.subject = message.subject
self.contextToSend.message = message.raw
self.contextToSend.recipients = [ComposeMessageRecipient(email: "tom@flowcrypt.com", state: decorator.recipientIdleState)]
Expand Down Expand Up @@ -558,8 +559,7 @@ extension ComposeViewController {
return true
}
.then {
let subject = input.isQuote ? input.subjectQuoteTitle : contextToSend.subject
$0.attributedText = decorator.styledTitle(with: subject)
$0.attributedText = decorator.styledTitle(with: contextToSend.subject)
}
}

Expand Down Expand Up @@ -625,7 +625,8 @@ extension ComposeViewController {
private func attachmentNode(for index: Int) -> ASCellNode {
AttachmentNode(
input: .init(
composeAttachment: contextToSend.attachments[index]
attachment: contextToSend.attachments[index],
index: index
),
onDeleteTap: { [weak self] in
self?.contextToSend.attachments.safeRemove(at: index)
Expand Down Expand Up @@ -924,7 +925,7 @@ extension ComposeViewController {
extension ComposeViewController: UIDocumentPickerDelegate {
func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
guard let fileUrl = urls.first,
let attachment = ComposeMessageAttachment(fileURL: fileUrl)
let attachment = MessageAttachment(fileURL: fileUrl)
else {
showAlert(message: "files_picking_files_error_message".localized)
return
Expand All @@ -946,7 +947,7 @@ extension ComposeViewController: PHPickerViewControllerDelegate {
completionHandler: { [weak self] url, _ in
guard let self = self else { return }
DispatchQueue.main.async {
if let url = url, let composeMessageAttachment = ComposeMessageAttachment(fileURL: url) {
if let url = url, let composeMessageAttachment = MessageAttachment(fileURL: url) {
self.appendAttachmentIfAllowed(composeMessageAttachment)
self.node.reloadSections(IndexSet(integer: 2), with: .automatic)
} else {
Expand All @@ -960,7 +961,7 @@ extension ComposeViewController: PHPickerViewControllerDelegate {
completionHandler: { [weak self] url, _ in
guard let self = self else { return }
DispatchQueue.main.async {
if let url = url, let composeMessageAttachment = ComposeMessageAttachment(fileURL: url) {
if let url = url, let composeMessageAttachment = MessageAttachment(fileURL: url) {
self.appendAttachmentIfAllowed(composeMessageAttachment)
self.node.reloadSections(IndexSet(integer: 2), with: .automatic)
} else {
Expand All @@ -981,10 +982,10 @@ extension ComposeViewController: UIImagePickerControllerDelegate, UINavigationCo
) {
picker.dismiss(animated: true, completion: nil)

let composeMessageAttachment: ComposeMessageAttachment?
let composeMessageAttachment: MessageAttachment?
switch picker.sourceType {
case .camera:
composeMessageAttachment = ComposeMessageAttachment(cameraSourceMediaInfo: info)
composeMessageAttachment = MessageAttachment(cameraSourceMediaInfo: info)
default: fatalError("No other image picker's sources should be used")
}
guard let attachment = composeMessageAttachment else {
Expand All @@ -995,8 +996,8 @@ extension ComposeViewController: UIImagePickerControllerDelegate, UINavigationCo
node.reloadSections(IndexSet(integer: 2), with: .automatic)
}

private func appendAttachmentIfAllowed(_ attachment: ComposeMessageAttachment) {
let totalSize = contextToSend.attachments.reduce(0, { $0 + $1.size }) + attachment.size
private func appendAttachmentIfAllowed(_ attachment: MessageAttachment) {
let totalSize = contextToSend.attachments.map(\.size).reduce(0, +) + attachment.size
if totalSize > GeneralConstants.Global.attachmentSizeLimit {
showToast("files_picking_size_error_message".localized)
} else {
Expand Down
11 changes: 6 additions & 5 deletions FlowCrypt/Controllers/Compose/ComposeViewControllerInput.swift
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ struct ComposeMessageInput: Equatable {
let sentDate: Date
let message: String
let threadId: String?
let attachments: [MessageAttachment]
}

enum InputType: Equatable {
Expand All @@ -40,11 +41,6 @@ struct ComposeMessageInput: Equatable {
return info.recipients
}

var subjectQuoteTitle: String? {
guard case let .quote(info) = type else { return nil }
return info.subject
}

var successfullySentToast: String {
switch type {
case .idle: return "compose_encrypted_sent".localized
Expand All @@ -71,4 +67,9 @@ struct ComposeMessageInput: Equatable {
guard case let .quote(info) = type else { return nil }
return info.threadId
}

var attachments: [MessageAttachment] {
guard case let .quote(info) = type else { return [] }
return info.attachments
}
}
9 changes: 5 additions & 4 deletions FlowCrypt/Controllers/Compose/ComposeViewDecorator.swift
Original file line number Diff line number Diff line change
Expand Up @@ -236,12 +236,13 @@ extension RecipientEmailsCellNode.Input {

// MARK: - AttachmentNode.Input
extension AttachmentNode.Input {
init(composeAttachment: ComposeMessageAttachment) {
init(attachment: MessageAttachment, index: Int) {
self.init(
name: composeAttachment.name
name: attachment.name
.attributed(.regular(18), color: .mainTextColor, alignment: .left),
size: composeAttachment.humanReadableSizeString
.attributed(.medium(12), color: .mainTextColor, alignment: .left)
size: attachment.formattedSize
.attributed(.medium(12), color: .mainTextColor, alignment: .left),
index: index
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
// Created by Anton Kharchevskyi on 10.10.2021
// Copyright © 2017-present FlowCrypt a. s. All rights reserved.
//

import Foundation

extension InboxViewController {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ extension MsgListViewController where Self: UIViewController {
guard let email = DataService.shared.email else { return }

let controller = ComposeViewController(email: email)
controller.updateWithMessage(message: message)
controller.update(with: message)
navigationController?.pushViewController(controller, animated: true)
}

Expand Down
7 changes: 4 additions & 3 deletions FlowCrypt/Controllers/Threads/ThreadDetailsDecorator.swift
Original file line number Diff line number Diff line change
Expand Up @@ -61,12 +61,13 @@ extension ProcessedMessage {
}

extension AttachmentNode.Input {
init(msgAttachment: MessageAttachment) {
init(msgAttachment: MessageAttachment, index: Int) {
self.init(
name: msgAttachment.name
.attributed(.regular(18), color: .textColor, alignment: .left),
size: msgAttachment.humanReadableSizeString
.attributed(.medium(12), color: .textColor, alignment: .left)
size: msgAttachment.formattedSize
.attributed(.medium(12), color: .textColor, alignment: .left),
index: index
)
}
}
Expand Down
21 changes: 12 additions & 9 deletions FlowCrypt/Controllers/Threads/ThreadDetailsViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -147,15 +147,16 @@ extension ThreadDetailsViewController {
let processedMessage = input.processedMessage
else { return }

let recipients: [String]
switch quoteType {
case .reply:
recipients = [input.rawMessage.sender].compactMap { $0 }
case .forward:
recipients = []
}
let recipients = quoteType == .reply
? [input.rawMessage.sender].compactMap({ $0 })
: []

let attachments = quoteType == .forward
? input.processedMessage?.attachments ?? []
: []

let subject = input.rawMessage.subject ?? "(no subject)"
let threadId = quoteType == .reply ? input.rawMessage.threadId : nil

let replyInfo = ComposeMessageInput.MessageQuoteInfo(
recipients: recipients,
Expand All @@ -164,7 +165,8 @@ extension ThreadDetailsViewController {
mime: processedMessage.rawMimeData,
sentDate: input.rawMessage.date,
message: processedMessage.text,
threadId: input.rawMessage.threadId
threadId: threadId,
attachments: attachments
)

let composeInput = ComposeMessageInput(type: .quote(replyInfo))
Expand Down Expand Up @@ -445,7 +447,8 @@ extension ThreadDetailsViewController: ASTableDelegate, ASTableDataSource {
let attachment = message.attachments[indexPath.row - 2]
return AttachmentNode(
input: .init(
msgAttachment: attachment
msgAttachment: attachment,
index: indexPath.row - 2
),
onDownloadTap: { [weak self] in self?.attachmentManager.open(attachment) }
)
Expand Down
9 changes: 8 additions & 1 deletion FlowCrypt/Functionality/FilesManager/FilesManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,17 @@ import UIKit

protocol FileType {
var name: String { get }
var size: Int { get }
var data: Data { get }
}

extension FileType {
var size: Int { data.count }
var formattedSize: String {
ByteCountFormatter().string(fromByteCount: Int64(size))
}
var type: String { name.mimeType }
}

protocol FilesManagerPresenter {
func present(_ viewControllerToPresent: UIViewController, animated flag: Bool, completion: (() -> Void)?)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,26 +1,20 @@
//
// ComposeMessageAttachment.swift
// MessageAttachment.swift
// FlowCrypt
//
// Created by Yevhen Kyivskyi on 24.09.2021.
// Created by Roma Sosnovsky on 25/11/21
// Copyright © 2017-present FlowCrypt a. s. All rights reserved.
//

import UIKit
import Photos
import UIKit

struct ComposeMessageAttachment: Equatable {
struct MessageAttachment: Equatable, FileType {
let name: String
let size: Int
let data: Data
let type: String
var humanReadableSizeString: String {
return ByteCountFormatter().string(fromByteCount: Int64(self.size))
}
}

extension ComposeMessageAttachment {

extension MessageAttachment {
init?(cameraSourceMediaInfo: [UIImagePickerController.InfoKey: Any]) {
guard let image = cameraSourceMediaInfo[.originalImage] as? UIImage,
let data = image.jpegData(compressionQuality: 1) else {
Expand All @@ -29,8 +23,6 @@ extension ComposeMessageAttachment {

self.name = "\(UUID().uuidString).jpg"
self.data = data
self.size = data.count
self.type = "image/jpg"
}

init?(fileURL: URL) {
Expand All @@ -40,11 +32,11 @@ extension ComposeMessageAttachment {

self.name = fileURL.lastPathComponent
self.data = data
self.size = data.count
self.type = fileURL.mimeType
}
}

extension MessageAttachment {
func toSendableMsgAttachment() -> SendableMsg.Attachment {
return SendableMsg.Attachment( name: self.name, type: self.type, base64: self.data.base64EncodedString())
return SendableMsg.Attachment(name: name, type: type, base64: data.base64EncodedString())
}
}
Loading