core: file protocol field; ios: distinguish behavior and look of XFTP and SMP files (#2090)

* core: file protocol field; ios: distinguish behavior and look of XFTP and SMP files

* remove unused method

* count style

* corrections

---------

Co-authored-by: Evgeny Poberezkin <2769109+epoberezkin@users.noreply.github.com>
This commit is contained in:
spaced4ndy
2023-03-28 22:20:06 +04:00
committed by GitHub
parent 6a99a4f1ae
commit ef05fa4905
10 changed files with 145 additions and 76 deletions

View File

@@ -24,7 +24,7 @@ struct CIFileView: View {
.padding(.top, 5)
.padding(.bottom, 3)
if let file = file {
let prettyFileSize = ByteCountFormatter().string(fromByteCount: file.fileSize)
let prettyFileSize = ByteCountFormatter.string(fromByteCount: file.fileSize, countStyle: .binary)
VStack(alignment: .leading, spacing: 2) {
Text(file.fileName)
.lineLimit(1)
@@ -56,7 +56,7 @@ struct CIFileView: View {
case .sndComplete: return false
case .sndCancelled: return false
case .rcvInvitation: return true
case .rcvAccepted: return true
case .rcvAccepted: return file.isSMP
case .rcvTransfer: return false
case .rcvComplete: return true
case .rcvCancelled: return false
@@ -67,7 +67,7 @@ struct CIFileView: View {
private func fileSizeValid() -> Bool {
if let file = file {
return file.fileSize <= MAX_FILE_SIZE
return file.fileSize <= getMaxFileSize(file.fileProtocol)
}
return false
}
@@ -85,17 +85,19 @@ struct CIFileView: View {
}
}
} else {
let prettyMaxFileSize = ByteCountFormatter().string(fromByteCount: MAX_FILE_SIZE)
let prettyMaxFileSize = ByteCountFormatter.string(fromByteCount: getMaxFileSize(file.fileProtocol), countStyle: .binary)
AlertManager.shared.showAlertMsg(
title: "Large file!",
message: "Your contact sent a file that is larger than currently supported maximum size (\(prettyMaxFileSize))."
)
}
case .rcvAccepted:
AlertManager.shared.showAlertMsg(
title: "Waiting for file",
message: "File will be received when your contact is online, please wait or check later!"
)
if file.isSMP {
AlertManager.shared.showAlertMsg(
title: "Waiting for file",
message: "File will be received when your contact is online, please wait or check later!"
)
}
case .rcvComplete:
logger.debug("CIFileView fileAction - in .rcvComplete")
if let filePath = getLoadedFilePath(file) {
@@ -111,8 +113,11 @@ struct CIFileView: View {
if let file = file {
switch file.fileStatus {
case .sndStored: fileIcon("doc.fill")
// case .sndTransfer: ProgressView().frame(width: 30, height: 30) // TODO use for SMP files
case let .sndTransfer(sndProgress, sndTotal): progressCircle(sndProgress, sndTotal)
case let .sndTransfer(sndProgress, sndTotal):
switch file.fileProtocol {
case .xftp: progressCircle(sndProgress, sndTotal)
case .smp: progressView()
}
case .sndComplete: fileIcon("doc.fill", innerIcon: "checkmark", innerIconSize: 10)
case .sndCancelled: fileIcon("doc.fill", innerIcon: "xmark", innerIconSize: 10)
case .rcvInvitation:
@@ -122,8 +127,12 @@ struct CIFileView: View {
fileIcon("doc.fill", color: .orange, innerIcon: "exclamationmark", innerIconSize: 12)
}
case .rcvAccepted: fileIcon("doc.fill", innerIcon: "ellipsis", innerIconSize: 12)
// case .rcvTransfer: ProgressView().frame(width: 30, height: 30) // TODO use for SMP files
case let .rcvTransfer(rcvProgress, rcvTotal): progressCircle(rcvProgress, rcvTotal)
case let .rcvTransfer(rcvProgress, rcvTotal):
if file.fileProtocol == .xftp && rcvProgress < rcvTotal {
progressCircle(rcvProgress, rcvTotal)
} else {
progressView()
}
case .rcvComplete: fileIcon("doc.fill")
case .rcvCancelled: fileIcon("doc.fill", innerIcon: "xmark", innerIconSize: 10)
}
@@ -152,6 +161,10 @@ struct CIFileView: View {
}
}
private func progressView() -> some View {
ProgressView().frame(width: 30, height: 30)
}
private func progressCircle(_ progress: Int64, _ total: Int64) -> some View {
Circle()
.trim(from: 0, to: Double(progress) / Double(total))

View File

@@ -41,10 +41,12 @@ struct CIImageView: View {
// TODO image accepted alert?
}
case .rcvAccepted:
AlertManager.shared.showAlertMsg(
title: "Waiting for image",
message: "Image will be received when your contact is online, please wait or check later!"
)
if file.isSMP {
AlertManager.shared.showAlertMsg(
title: "Waiting for image",
message: "Image will be received when your contact is online, please wait or check later!"
)
}
case .rcvTransfer: () // ?
case .rcvComplete: () // ?
case .rcvCancelled: () // TODO
@@ -78,11 +80,7 @@ struct CIImageView: View {
if let file = chatItem.file {
switch file.fileStatus {
case .sndTransfer:
ProgressView()
.progressViewStyle(.circular)
.frame(width: 20, height: 20)
.tint(.white)
.padding(8)
progressView()
case .sndComplete:
Image(systemName: "checkmark")
.resizable()
@@ -98,13 +96,17 @@ struct CIImageView: View {
.foregroundColor(.white)
.padding(11)
case .rcvTransfer:
ProgressView()
.progressViewStyle(.circular)
.frame(width: 20, height: 20)
.tint(.white)
.padding(8)
progressView()
default: EmptyView()
}
}
}
private func progressView() -> some View {
ProgressView()
.progressViewStyle(.circular)
.frame(width: 20, height: 20)
.tint(.white)
.padding(8)
}
}

View File

@@ -229,6 +229,8 @@ struct ComposeView: View {
@State var pendingLinkUrl: URL? = nil
@State var cancelledLinks: Set<String> = []
@AppStorage(GROUP_DEFAULT_XFTP_SEND_ENABLED, store: groupDefaults) private var xftpSendEnabled = false
@State private var showChooseSource = false
@State private var showImagePicker = false
@State private var showTakePhoto = false
@@ -394,10 +396,10 @@ struct ComposeView: View {
}
fileURL.stopAccessingSecurityScopedResource()
if let fileSize = fileSize,
fileSize <= MAX_FILE_SIZE {
fileSize <= maxFileSize {
composeState = composeState.copy(preview: .filePreview(fileName: fileURL.lastPathComponent, file: fileURL))
} else {
let prettyMaxFileSize = ByteCountFormatter().string(fromByteCount: MAX_FILE_SIZE)
let prettyMaxFileSize = ByteCountFormatter.string(fromByteCount: maxFileSize, countStyle: .binary)
AlertManager.shared.showAlertMsg(
title: "Large file!",
message: "Currently maximum supported file size is \(prettyMaxFileSize)."
@@ -447,6 +449,11 @@ struct ComposeView: View {
}
}
private var maxFileSize: Int64 {
let fileProtocol: FileProtocol = xftpSendEnabled ? .xftp : .smp
return getMaxFileSize(fileProtocol)
}
private func sendLiveMessage() async {
let typedMsg = composeState.message
let lm = composeState.liveMessage

View File

@@ -185,7 +185,7 @@ struct DatabaseView: View {
if fileCount == 0 {
Text("No received or sent files")
} else {
Text("\(fileCount) file(s) with total size of \(ByteCountFormatter().string(fromByteCount: Int64(size)))")
Text("\(fileCount) file(s) with total size of \(ByteCountFormatter.string(fromByteCount: Int64(size), countStyle: .binary))")
}
}
}

View File

@@ -10,7 +10,7 @@ import SwiftUI
import SimpleXChat
struct ExperimentalFeaturesView: View {
@AppStorage(GROUP_DEFAULT_XFTP_SEND_ENABLED, store: UserDefaults(suiteName: APP_GROUP_NAME)!) private var xftpSendEnabled = false
@AppStorage(GROUP_DEFAULT_XFTP_SEND_ENABLED, store: groupDefaults) private var xftpSendEnabled = false
var body: some View {
List {

View File

@@ -2215,9 +2215,17 @@ public struct CIFile: Decodable {
public var fileSize: Int64
public var filePath: String?
public var fileStatus: CIFileStatus
public var fileProtocol: FileProtocol
public static func getSample(fileId: Int64 = 1, fileName: String = "test.txt", fileSize: Int64 = 100, filePath: String? = "test.txt", fileStatus: CIFileStatus = .rcvComplete) -> CIFile {
CIFile(fileId: fileId, fileName: fileName, fileSize: fileSize, filePath: filePath, fileStatus: fileStatus)
CIFile(fileId: fileId, fileName: fileName, fileSize: fileSize, filePath: filePath, fileStatus: fileStatus, fileProtocol: .xftp)
}
public var isSMP: Bool {
switch self.fileProtocol {
case .smp: return true
default: return false
}
}
public var loaded: Bool {
@@ -2237,6 +2245,11 @@ public struct CIFile: Decodable {
}
}
public enum FileProtocol: String, Decodable {
case smp = "smp"
case xftp = "xftp"
}
public enum CIFileStatus: Decodable {
case sndStored
case sndTransfer(sndProgress: Int64, sndTotal: Int64)

View File

@@ -16,8 +16,9 @@ public let MAX_IMAGE_SIZE: Int64 = 236700
public let MAX_IMAGE_SIZE_AUTO_RCV: Int64 = MAX_IMAGE_SIZE * 2
//public let MAX_FILE_SIZE_SMP: Int64 = 8000000 // TODO distinguish between XFTP and SMP files
public let MAX_FILE_SIZE: Int64 = 1_073_741_824
public let MAX_FILE_SIZE_XFTP: Int64 = 1_073_741_824
public let MAX_FILE_SIZE_SMP: Int64 = 8000000
public let MAX_VOICE_MESSAGE_LENGTH = TimeInterval(30)
@@ -43,7 +44,6 @@ func getAppDirectory() -> URL {
dbContainerGroupDefault.get() == .group
? getGroupContainerDirectory()
: getDocumentsDirectory()
// getDocumentsDirectory()
}
let DB_FILE_PREFIX = "simplex_v1"
@@ -189,3 +189,10 @@ public func removeFile(_ fileName: String) {
logger.error("FileUtils.removeFile error: \(error.localizedDescription)")
}
}
public func getMaxFileSize(_ fileProtocol: FileProtocol) -> Int64 {
switch fileProtocol {
case .xftp: return MAX_FILE_SIZE_XFTP
case .smp: return MAX_FILE_SIZE_SMP
}
}