DcUtils.swift 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. import Foundation
  2. import UIKit
  3. import MobileCoreServices
  4. import AVFoundation
  5. import Intents
  6. public struct DcUtils {
  7. public static func getInitials(inputName: String) -> String {
  8. if let firstLetter = inputName.first {
  9. return firstLetter.uppercased()
  10. } else {
  11. return ""
  12. }
  13. }
  14. public static func donateSendMessageIntent(chatId: Int) {
  15. if #available(iOS 13.0, *) {
  16. let chat = DcContext.shared.getChat(chatId: chatId)
  17. let groupName = INSpeakableString(spokenPhrase: chat.name)
  18. let sendMessageIntent = INSendMessageIntent(recipients: nil,
  19. content: nil,
  20. speakableGroupName: groupName,
  21. conversationIdentifier: "\(chat.id)",
  22. serviceName: nil,
  23. sender: nil)
  24. // Add the user's avatar to the intent.
  25. if let imageData = chat.profileImage?.pngData() {
  26. let image = INImage(imageData: imageData)
  27. sendMessageIntent.setImage(image, forParameterNamed: \.speakableGroupName)
  28. }
  29. // Donate the intent.
  30. let interaction = INInteraction(intent: sendMessageIntent, response: nil)
  31. interaction.donate(completion: { error in
  32. if error != nil {
  33. DcContext.shared.logger?.error(error.debugDescription)
  34. }
  35. })
  36. }
  37. }
  38. static func copyAndFreeArray(inputArray: OpaquePointer?) -> [Int] {
  39. var acc: [Int] = []
  40. let len = dc_array_get_cnt(inputArray)
  41. for i in 0 ..< len {
  42. let e = dc_array_get_id(inputArray, i)
  43. acc.append(Int(e))
  44. }
  45. dc_array_unref(inputArray)
  46. return acc
  47. }
  48. static func copyAndFreeArrayWithLen(inputArray: OpaquePointer?, len: Int = 0) -> [Int] {
  49. var acc: [Int] = []
  50. let arrayLen = dc_array_get_cnt(inputArray)
  51. let start = max(0, arrayLen - len)
  52. for i in start ..< arrayLen {
  53. let e = dc_array_get_id(inputArray, i)
  54. acc.append(Int(e))
  55. }
  56. dc_array_unref(inputArray)
  57. return acc
  58. }
  59. static func copyAndFreeArrayWithOffset(inputArray: OpaquePointer?, len: Int? = 0, from: Int = 0, skipEnd: Int = 0) -> [Int] {
  60. let lenArray = dc_array_get_cnt(inputArray)
  61. let length = len ?? lenArray
  62. if lenArray <= skipEnd || lenArray == 0 {
  63. dc_array_unref(inputArray)
  64. return []
  65. }
  66. let start = lenArray - 1 - skipEnd
  67. let end = max(0, start - length)
  68. let finalLen = start - end + (length > 0 ? 0 : 1)
  69. var acc: [Int] = [Int](repeating: 0, count: finalLen)
  70. for i in stride(from: start, to: end, by: -1) {
  71. let index = finalLen - (start - i) - 1
  72. acc[index] = Int(dc_array_get_id(inputArray, i))
  73. }
  74. dc_array_unref(inputArray)
  75. DcContext.shared.logger?.info("got: \(from) \(length) \(lenArray) - \(acc)")
  76. return acc
  77. }
  78. public static func saveImage(image: UIImage) -> String? {
  79. let suffix = image.isTransparent() ? "png" : "jpg"
  80. guard let data = image.isTransparent() ? image.pngData() : image.jpegData(compressionQuality: 1.0) else {
  81. return nil
  82. }
  83. return saveImage(data: data, suffix: suffix)
  84. }
  85. public static func saveImage(data: Data, suffix: String) -> String? {
  86. let timestamp = Double(Date().timeIntervalSince1970)
  87. guard let directory = try? FileManager.default.url(for: .documentDirectory, in: .userDomainMask,
  88. appropriateFor: nil, create: false) as NSURL,
  89. let path = directory.appendingPathComponent("\(timestamp).\(suffix)")
  90. else { return nil }
  91. do {
  92. try data.write(to: path)
  93. return path.relativePath
  94. } catch {
  95. DcContext.shared.logger?.info(error.localizedDescription)
  96. return nil
  97. }
  98. }
  99. public static func getMimeTypeForPath(path: String) -> String {
  100. let url = NSURL(fileURLWithPath: path)
  101. let pathExtension = url.pathExtension
  102. if let uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, pathExtension! as NSString, nil)?.takeRetainedValue() {
  103. if let mimetype = UTTypeCopyPreferredTagWithClass(uti, kUTTagClassMIMEType)?.takeRetainedValue() {
  104. return mimetype as String
  105. }
  106. }
  107. return "application/octet-stream"
  108. }
  109. public static func generateThumbnailFromVideo(url: URL?) -> UIImage? {
  110. guard let url = url else {
  111. return nil
  112. }
  113. do {
  114. let asset = AVURLAsset(url: url)
  115. let imageGenerator = AVAssetImageGenerator(asset: asset)
  116. imageGenerator.appliesPreferredTrackTransform = true
  117. let cgImage = try imageGenerator.copyCGImage(at: .zero, actualTime: nil)
  118. return UIImage(cgImage: cgImage)
  119. } catch {
  120. print(error.localizedDescription)
  121. return nil
  122. }
  123. }
  124. public static func thumbnailFromPdf(withUrl url: URL, pageNumber: Int = 1, width: CGFloat = 240) -> UIImage? {
  125. guard let pdf = CGPDFDocument(url as CFURL),
  126. let page = pdf.page(at: pageNumber)
  127. else {
  128. return nil
  129. }
  130. var pageRect = page.getBoxRect(.mediaBox)
  131. let pdfScale = width / pageRect.size.width
  132. pageRect.size = CGSize(width: pageRect.size.width*pdfScale, height: pageRect.size.height*pdfScale)
  133. pageRect.origin = .zero
  134. UIGraphicsBeginImageContext(pageRect.size)
  135. let context = UIGraphicsGetCurrentContext()!
  136. // White BG
  137. context.setFillColor(UIColor.white.cgColor)
  138. context.fill(pageRect)
  139. context.saveGState()
  140. // Next 3 lines makes the rotations so that the page look in the right direction
  141. context.translateBy(x: 0.0, y: pageRect.size.height)
  142. context.scaleBy(x: 1.0, y: -1.0)
  143. context.concatenate(page.getDrawingTransform(.mediaBox, rect: pageRect, rotate: 0, preserveAspectRatio: true))
  144. context.drawPDFPage(page)
  145. context.restoreGState()
  146. let image = UIGraphicsGetImageFromCurrentImageContext()
  147. UIGraphicsEndImageContext()
  148. return image
  149. }
  150. }