CCCreateCloud.swift 52 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239
  1. //
  2. // CCCreateCloud.swift
  3. // Nextcloud
  4. //
  5. // Created by Marino Faggiana on 09/01/17.
  6. // Copyright © 2017 Marino Faggiana. All rights reserved.
  7. //
  8. // Author Marino Faggiana <m.faggiana@twsweb.it>
  9. //
  10. // This program is free software: you can redistribute it and/or modify
  11. // it under the terms of the GNU General Public License as published by
  12. // the Free Software Foundation, either version 3 of the License, or
  13. // (at your option) any later version.
  14. //
  15. // This program is distributed in the hope that it will be useful,
  16. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  18. // GNU General Public License for more details.
  19. //
  20. // You should have received a copy of the GNU General Public License
  21. // along with this program. If not, see <http://www.gnu.org/licenses/>.
  22. //
  23. import Foundation
  24. import PDFGenerator
  25. import Sheeeeeeeeet
  26. // MARK: -
  27. class CreateMenuAdd: NSObject {
  28. let appDelegate = UIApplication.shared.delegate as! AppDelegate
  29. let fontButton = [NSAttributedString.Key.font:UIFont(name: "HelveticaNeue", size: 16)!, NSAttributedString.Key.foregroundColor: UIColor.black]
  30. let fontEncrypted = [NSAttributedString.Key.font:UIFont(name: "HelveticaNeue", size: 16)!, NSAttributedString.Key.foregroundColor: NCBrandColor.sharedInstance.encrypted as UIColor]
  31. let fontCancel = [NSAttributedString.Key.font:UIFont(name: "HelveticaNeue-Bold", size: 17)!, NSAttributedString.Key.foregroundColor: UIColor.black]
  32. let fontDisable = [NSAttributedString.Key.font:UIFont(name: "HelveticaNeue", size: 16)!, NSAttributedString.Key.foregroundColor: UIColor.darkGray]
  33. var colorIcon = NCBrandColor.sharedInstance.brandElement
  34. @objc init (themingColor : UIColor) {
  35. super.init()
  36. colorIcon = themingColor
  37. }
  38. @objc func createMenu(viewController: UIViewController, view : UIView) {
  39. var items = [ActionSheetItem]()
  40. items.append(ActionSheetItem(title: NSLocalizedString("_upload_photos_videos_", comment: ""), value: 1, image: CCGraphics.changeThemingColorImage(UIImage(named: "media"), multiplier:1, color: NCBrandColor.sharedInstance.icon)))
  41. items.append(ActionSheetItem(title: NSLocalizedString("_upload_file_", comment: ""), value: 2, image: CCGraphics.changeThemingColorImage(UIImage(named: "file"), multiplier:1, color: NCBrandColor.sharedInstance.icon)))
  42. items.append(ActionSheetItem(title: NSLocalizedString("_upload_file_text_", comment: ""), value: 3, image: CCGraphics.changeThemingColorImage(UIImage(named: "file_txt"), multiplier:1, color: NCBrandColor.sharedInstance.icon)))
  43. if #available(iOS 11.0, *) {
  44. items.append(ActionSheetItem(title: NSLocalizedString("_scans_document_", comment: ""), value: 4, image: CCGraphics.changeThemingColorImage(UIImage(named: "scan"), multiplier:2, color: NCBrandColor.sharedInstance.icon)))
  45. }
  46. items.append(ActionSheetItem(title: NSLocalizedString("_create_folder_", comment: ""), value: 5, image: CCGraphics.changeThemingColorImage(UIImage(named: "folder"), multiplier:1, color: colorIcon)))
  47. // items.append(ActionSheetSectionTitle(title: "Cheap"))
  48. // items.append(ActionSheetSectionMargin())
  49. /*
  50. let appearanceSectionMargin = ActionSheetAppearance.standard
  51. //appearanceSectionMargin. = 10
  52. appearanceSectionMargin.backgroundColor = UIColor.red
  53. let itemSectionMargin = ActionSheetSectionTitle(title: "Cheap")
  54. itemSectionMargin.customAppearance = appearanceSectionMargin
  55. items.append(itemSectionMargin)
  56. */
  57. if let richdocumentsMimetypes = NCManageDatabase.sharedInstance.getRichdocumentsMimetypes() {
  58. if richdocumentsMimetypes.count > 0 {
  59. items.append(ActionSheetItem(title: NSLocalizedString("_create_new_document_", comment: ""), value: 6, image: UIImage.init(named: "document_menu")))
  60. items.append(ActionSheetItem(title: NSLocalizedString("_create_new_spreadsheet", comment: ""), value: 7, image: UIImage(named: "file_xls_menu")))
  61. items.append(ActionSheetItem(title: NSLocalizedString("_create_new_presentation_", comment: ""), value: 8, image: UIImage(named: "file_ppt_menu")))
  62. }
  63. }
  64. items.append(ActionSheetCancelButton(title: NSLocalizedString("_cancel_", comment: "")))
  65. let actionSheet = ActionSheet(items: items) { sheet, item in
  66. if item.value as? Int == 1 { self.appDelegate.activeMain.openAssetsPickerController() }
  67. if item.value as? Int == 2 { self.appDelegate.activeMain.openImportDocumentPicker() }
  68. if item.value as? Int == 3 {
  69. let storyboard = UIStoryboard(name: "NCText", bundle: nil)
  70. let controller = storyboard.instantiateViewController(withIdentifier: "NCText")
  71. controller.modalPresentationStyle = UIModalPresentationStyle.pageSheet
  72. self.appDelegate.activeMain.present(controller, animated: true, completion: nil)
  73. }
  74. if item.value as? Int == 4 {
  75. if #available(iOS 11.0, *) {
  76. NCCreateScanDocument.sharedInstance.openScannerDocument(viewController: self.appDelegate.activeMain, openScan: true)
  77. }
  78. }
  79. if item.value as? Int == 5 { self.appDelegate.activeMain.createFolder() }
  80. if item.value as? Int == 6 {
  81. let form = CreateFormUploadRichdocuments.init(typeTemplate: k_richdocument_document)
  82. let navigationController = UINavigationController.init(rootViewController: form)
  83. navigationController.modalPresentationStyle = UIModalPresentationStyle.formSheet
  84. self.appDelegate.window.rootViewController?.present(navigationController, animated: true, completion: nil)
  85. }
  86. if item.value as? Int == 7 { print("Cancel buttons has the value `true`") }
  87. if item.value as? Int == 8 { print("Cancel buttons has the value `true`") }
  88. if item is ActionSheetCancelButton { print("Cancel buttons has the value `true`") }
  89. }
  90. actionSheet.present(in: viewController, from: view)
  91. }
  92. }
  93. // MARK: -
  94. class CreateFormUploadRichdocuments: XLFormViewController {
  95. let appDelegate = UIApplication.shared.delegate as! AppDelegate
  96. @objc convenience init(typeTemplate : String) {
  97. self.init()
  98. let ocNetworking = OCnetworking.init(delegate: nil, metadataNet: nil, withUser: appDelegate.activeUser, withUserID: appDelegate.activeUserID, withPassword: appDelegate.activePassword, withUrl: appDelegate.activeUrl)
  99. ocNetworking?.createTemplateRichdocuments(withTemplate: typeTemplate, success: { (url) in
  100. //
  101. }, failure: { (message, errorCode) in
  102. //
  103. })
  104. }
  105. }
  106. // MARK: -
  107. @objc protocol createFormUploadAssetsDelegate {
  108. func dismissFormUploadAssets()
  109. }
  110. // MARK: -
  111. class CreateFormUploadAssets: XLFormViewController, CCMoveDelegate {
  112. var serverUrl : String = ""
  113. var titleServerUrl : String?
  114. var assets: NSMutableArray = []
  115. var cryptated : Bool = false
  116. var session : String = ""
  117. weak var delegate: createFormUploadAssetsDelegate?
  118. let appDelegate = UIApplication.shared.delegate as! AppDelegate
  119. @objc convenience init(serverUrl : String, assets : NSMutableArray, cryptated : Bool, session : String, delegate: createFormUploadAssetsDelegate) {
  120. self.init()
  121. if serverUrl == CCUtility.getHomeServerUrlActiveUrl(appDelegate.activeUrl) {
  122. titleServerUrl = "/"
  123. } else {
  124. titleServerUrl = (serverUrl as NSString).lastPathComponent
  125. }
  126. self.serverUrl = serverUrl
  127. self.assets = assets
  128. self.cryptated = cryptated
  129. self.session = session
  130. self.delegate = delegate
  131. self.initializeForm()
  132. }
  133. //MARK: XLFormDescriptorDelegate
  134. func initializeForm() {
  135. let form : XLFormDescriptor = XLFormDescriptor(title: NSLocalizedString("_upload_photos_videos_", comment: "")) as XLFormDescriptor
  136. form.rowNavigationOptions = XLFormRowNavigationOptions.stopDisableRow
  137. var section : XLFormSectionDescriptor
  138. var row : XLFormRowDescriptor
  139. // Section: Destination Folder
  140. section = XLFormSectionDescriptor.formSection(withTitle: NSLocalizedString("_save_path_", comment: ""))
  141. form.addFormSection(section)
  142. row = XLFormRowDescriptor(tag: "ButtonDestinationFolder", rowType: XLFormRowDescriptorTypeButton, title: self.titleServerUrl)
  143. row.action.formSelector = #selector(changeDestinationFolder(_:))
  144. let imageFolder = CCGraphics.changeThemingColorImage(UIImage(named: "folder")!, multiplier:2, color: NCBrandColor.sharedInstance.brandElement) as UIImage
  145. row.cellConfig["imageView.image"] = imageFolder
  146. row.cellConfig["textLabel.textAlignment"] = NSTextAlignment.right.rawValue
  147. row.cellConfig["textLabel.font"] = UIFont.systemFont(ofSize: 15.0)
  148. section.addFormRow(row)
  149. // User folder Autoupload
  150. row = XLFormRowDescriptor(tag: "useFolderAutoUpload", rowType: XLFormRowDescriptorTypeBooleanSwitch, title: NSLocalizedString("_use_folder_auto_upload_", comment: ""))
  151. row.value = 0
  152. row.cellConfig["textLabel.font"] = UIFont.systemFont(ofSize: 15.0)
  153. section.addFormRow(row)
  154. // Use Sub folder
  155. row = XLFormRowDescriptor(tag: "useSubFolder", rowType: XLFormRowDescriptorTypeBooleanSwitch, title: NSLocalizedString("_autoupload_create_subfolder_", comment: ""))
  156. let tableAccount = NCManageDatabase.sharedInstance.getAccountActive()
  157. if tableAccount?.autoUploadCreateSubfolder == true {
  158. row.value = 1
  159. } else {
  160. row.value = 0
  161. }
  162. row.hidden = "$\("useFolderAutoUpload") == 0"
  163. row.cellConfig["textLabel.font"] = UIFont.systemFont(ofSize: 15.0)
  164. section.addFormRow(row)
  165. // Section Mode filename
  166. section = XLFormSectionDescriptor.formSection(withTitle: NSLocalizedString("_mode_filename_", comment: ""))
  167. form.addFormSection(section)
  168. // Maintain the original fileName
  169. row = XLFormRowDescriptor(tag: "maintainOriginalFileName", rowType: XLFormRowDescriptorTypeBooleanSwitch, title: NSLocalizedString("_maintain_original_filename_", comment: ""))
  170. row.value = CCUtility.getOriginalFileName(k_keyFileNameOriginal)
  171. row.cellConfig["textLabel.font"] = UIFont.systemFont(ofSize: 15.0)
  172. section.addFormRow(row)
  173. // Add File Name Type
  174. row = XLFormRowDescriptor(tag: "addFileNameType", rowType: XLFormRowDescriptorTypeBooleanSwitch, title: NSLocalizedString("_add_filenametype_", comment: ""))
  175. row.value = CCUtility.getFileNameType(k_keyFileNameType)
  176. row.hidden = "$\("maintainOriginalFileName") == 1"
  177. row.cellConfig["textLabel.font"] = UIFont.systemFont(ofSize: 15.0)
  178. section.addFormRow(row)
  179. // Section: Rename File Name
  180. section = XLFormSectionDescriptor.formSection(withTitle: NSLocalizedString("_filename_", comment: ""))
  181. form.addFormSection(section)
  182. row = XLFormRowDescriptor(tag: "maskFileName", rowType: XLFormRowDescriptorTypeAccount, title: (NSLocalizedString("_filename_", comment: "")))
  183. let fileNameMask : String = CCUtility.getFileNameMask(k_keyFileNameMask)
  184. if fileNameMask.count > 0 {
  185. row.value = fileNameMask
  186. }
  187. row.hidden = "$\("maintainOriginalFileName") == 1"
  188. row.cellConfig["textLabel.font"] = UIFont.systemFont(ofSize: 15.0)
  189. row.cellConfig["textField.textAlignment"] = NSTextAlignment.right.rawValue
  190. row.cellConfig["textField.font"] = UIFont.systemFont(ofSize: 15.0)
  191. section.addFormRow(row)
  192. // Section: Preview File Name
  193. row = XLFormRowDescriptor(tag: "previewFileName", rowType: XLFormRowDescriptorTypeTextView, title: "")
  194. row.height = 180
  195. row.disabled = true
  196. row.cellConfig["textView.backgroundColor"] = NCBrandColor.sharedInstance.backgroundView
  197. row.cellConfig["textView.font"] = UIFont.systemFont(ofSize: 14.0)
  198. section.addFormRow(row)
  199. self.form = form
  200. }
  201. override func formRowDescriptorValueHasChanged(_ formRow: XLFormRowDescriptor!, oldValue: Any!, newValue: Any!) {
  202. super.formRowDescriptorValueHasChanged(formRow, oldValue: oldValue, newValue: newValue)
  203. if formRow.tag == "useFolderAutoUpload" {
  204. if (formRow.value! as AnyObject).boolValue == true {
  205. let buttonDestinationFolder : XLFormRowDescriptor = self.form.formRow(withTag: "ButtonDestinationFolder")!
  206. buttonDestinationFolder.hidden = true
  207. } else{
  208. let buttonDestinationFolder : XLFormRowDescriptor = self.form.formRow(withTag: "ButtonDestinationFolder")!
  209. buttonDestinationFolder.hidden = false
  210. }
  211. }
  212. else if formRow.tag == "useSubFolder" {
  213. if (formRow.value! as AnyObject).boolValue == true {
  214. } else{
  215. }
  216. }
  217. else if formRow.tag == "maintainOriginalFileName" {
  218. CCUtility.setOriginalFileName((formRow.value! as AnyObject).boolValue, key: k_keyFileNameOriginal)
  219. self.reloadForm()
  220. }
  221. else if formRow.tag == "addFileNameType" {
  222. CCUtility.setFileNameType((formRow.value! as AnyObject).boolValue, key: k_keyFileNameType)
  223. self.reloadForm()
  224. }
  225. else if formRow.tag == "maskFileName" {
  226. let fileName = formRow.value as? String
  227. self.form.delegate = nil
  228. if let fileName = fileName {
  229. formRow.value = CCUtility.removeForbiddenCharactersServer(fileName)
  230. }
  231. self.form.delegate = self
  232. let previewFileName : XLFormRowDescriptor = self.form.formRow(withTag: "previewFileName")!
  233. previewFileName.value = self.previewFileName(valueRename: formRow.value as? String)
  234. // reload cell
  235. if fileName != nil {
  236. if newValue as! String != formRow.value as! String {
  237. self.reloadFormRow(formRow)
  238. appDelegate.messageNotification("_info_", description: "_forbidden_characters_", visible: true, delay: TimeInterval(k_dismissAfterSecond), type: TWMessageBarMessageType.info, errorCode: 0)
  239. }
  240. }
  241. self.reloadFormRow(previewFileName)
  242. }
  243. }
  244. // MARK: - View Life Cycle
  245. override func viewDidLoad() {
  246. super.viewDidLoad()
  247. let cancelButton : UIBarButtonItem = UIBarButtonItem(title: NSLocalizedString("_cancel_", comment: ""), style: UIBarButtonItem.Style.plain, target: self, action: #selector(cancel))
  248. let saveButton : UIBarButtonItem = UIBarButtonItem(title: NSLocalizedString("_save_", comment: ""), style: UIBarButtonItem.Style.plain, target: self, action: #selector(save))
  249. self.navigationItem.leftBarButtonItem = cancelButton
  250. self.navigationItem.rightBarButtonItem = saveButton
  251. self.navigationController?.navigationBar.isTranslucent = false
  252. self.navigationController?.navigationBar.barTintColor = NCBrandColor.sharedInstance.brand
  253. self.navigationController?.navigationBar.tintColor = NCBrandColor.sharedInstance.brandText
  254. self.navigationController?.navigationBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor: NCBrandColor.sharedInstance.brandText]
  255. self.tableView.separatorStyle = UITableViewCell.SeparatorStyle.none
  256. self.reloadForm()
  257. }
  258. override func viewWillDisappear(_ animated: Bool)
  259. {
  260. super.viewWillDisappear(animated)
  261. self.delegate?.dismissFormUploadAssets()
  262. }
  263. func reloadForm() {
  264. self.form.delegate = nil
  265. let buttonDestinationFolder : XLFormRowDescriptor = self.form.formRow(withTag: "ButtonDestinationFolder")!
  266. buttonDestinationFolder.title = self.titleServerUrl
  267. let maskFileName : XLFormRowDescriptor = self.form.formRow(withTag: "maskFileName")!
  268. let previewFileName : XLFormRowDescriptor = self.form.formRow(withTag: "previewFileName")!
  269. previewFileName.value = self.previewFileName(valueRename: maskFileName.value as? String)
  270. self.tableView.reloadData()
  271. self.form.delegate = self
  272. }
  273. // MARK: - Action
  274. func moveServerUrl(to serverUrlTo: String!, title: String!, type: String!) {
  275. self.serverUrl = serverUrlTo
  276. if let title = title {
  277. self.titleServerUrl = title
  278. } else {
  279. self.titleServerUrl = "/"
  280. }
  281. self.reloadForm()
  282. }
  283. @objc func save() {
  284. self.dismiss(animated: true, completion: {
  285. let useFolderPhotoRow : XLFormRowDescriptor = self.form.formRow(withTag: "useFolderAutoUpload")!
  286. let useSubFolderRow : XLFormRowDescriptor = self.form.formRow(withTag: "useSubFolder")!
  287. var useSubFolder : Bool = false
  288. if (useFolderPhotoRow.value! as AnyObject).boolValue == true {
  289. self.serverUrl = NCManageDatabase.sharedInstance.getAccountAutoUploadPath(self.appDelegate.activeUrl)
  290. useSubFolder = (useSubFolderRow.value! as AnyObject).boolValue
  291. }
  292. self.appDelegate.activeMain.uploadFileAsset(self.assets, serverUrl: self.serverUrl, useSubFolder: useSubFolder, session: self.session)
  293. })
  294. }
  295. @objc func cancel() {
  296. self.dismiss(animated: true, completion: nil)
  297. }
  298. // MARK: - Utility
  299. func previewFileName(valueRename : String?) -> String {
  300. var returnString: String = ""
  301. let asset = assets[0] as! PHAsset
  302. if (CCUtility.getOriginalFileName(k_keyFileNameOriginal)) {
  303. return (NSLocalizedString("_filename_", comment: "") + ": " + (asset.value(forKey: "filename") as! String))
  304. } else if let valueRename = valueRename {
  305. let valueRenameTrimming = valueRename.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)
  306. if valueRenameTrimming.count > 0 {
  307. self.form.delegate = nil
  308. CCUtility.setFileNameMask(valueRename, key: k_keyFileNameMask)
  309. self.form.delegate = self
  310. returnString = CCUtility.createFileName(asset.value(forKey: "filename") as! String?, fileDate: asset.creationDate, fileType: asset.mediaType, keyFileName: k_keyFileNameMask, keyFileNameType: k_keyFileNameType, keyFileNameOriginal: k_keyFileNameOriginal)
  311. } else {
  312. CCUtility.setFileNameMask("", key: k_keyFileNameMask)
  313. returnString = CCUtility.createFileName(asset.value(forKey: "filename") as! String?, fileDate: asset.creationDate, fileType: asset.mediaType, keyFileName: nil, keyFileNameType: k_keyFileNameType, keyFileNameOriginal: k_keyFileNameOriginal)
  314. }
  315. } else {
  316. CCUtility.setFileNameMask("", key: k_keyFileNameMask)
  317. returnString = CCUtility.createFileName(asset.value(forKey: "filename") as! String?, fileDate: asset.creationDate, fileType: asset.mediaType, keyFileName: nil, keyFileNameType: k_keyFileNameType, keyFileNameOriginal: k_keyFileNameOriginal)
  318. }
  319. return String(format: NSLocalizedString("_preview_filename_", comment: ""), "MM,MMM,DD,YY,YYYY and HH,hh,mm,ss,ampm") + ":" + "\n\n" + returnString
  320. }
  321. @objc func changeDestinationFolder(_ sender: XLFormRowDescriptor) {
  322. self.deselectFormRow(sender)
  323. let storyboard : UIStoryboard = UIStoryboard(name: "CCMove", bundle: nil)
  324. let navigationController = storyboard.instantiateViewController(withIdentifier: "CCMove") as! UINavigationController
  325. let viewController : CCMove = navigationController.topViewController as! CCMove
  326. viewController.delegate = self;
  327. viewController.tintColor = NCBrandColor.sharedInstance.brandText
  328. viewController.barTintColor = NCBrandColor.sharedInstance.brand
  329. viewController.tintColorTitle = NCBrandColor.sharedInstance.brandText
  330. viewController.move.title = NSLocalizedString("_select_", comment: "");
  331. viewController.networkingOperationQueue = appDelegate.netQueue
  332. // E2EE
  333. viewController.includeDirectoryE2EEncryption = true;
  334. navigationController.modalPresentationStyle = UIModalPresentationStyle.formSheet
  335. self.present(navigationController, animated: true, completion: nil)
  336. }
  337. }
  338. // MARK: -
  339. class CreateFormUploadFileText: XLFormViewController, CCMoveDelegate {
  340. var serverUrl = ""
  341. var titleServerUrl = ""
  342. var fileName = ""
  343. var text = ""
  344. let appDelegate = UIApplication.shared.delegate as! AppDelegate
  345. convenience init(serverUrl: String, text: String, fileName: String) {
  346. self.init()
  347. if serverUrl == CCUtility.getHomeServerUrlActiveUrl(appDelegate.activeUrl) {
  348. titleServerUrl = "/"
  349. } else {
  350. titleServerUrl = (serverUrl as NSString).lastPathComponent
  351. }
  352. self.fileName = fileName
  353. self.serverUrl = serverUrl
  354. self.text = text
  355. initializeForm()
  356. }
  357. //MARK: XLFormDescriptorDelegate
  358. func initializeForm() {
  359. let form : XLFormDescriptor = XLFormDescriptor() as XLFormDescriptor
  360. form.rowNavigationOptions = XLFormRowNavigationOptions.stopDisableRow
  361. var section : XLFormSectionDescriptor
  362. var row : XLFormRowDescriptor
  363. // Section: Destination Folder
  364. section = XLFormSectionDescriptor.formSection(withTitle: NSLocalizedString("_save_path_", comment: ""))
  365. form.addFormSection(section)
  366. row = XLFormRowDescriptor(tag: "ButtonDestinationFolder", rowType: XLFormRowDescriptorTypeButton, title: self.titleServerUrl)
  367. row.action.formSelector = #selector(changeDestinationFolder(_:))
  368. let imageFolder = CCGraphics.changeThemingColorImage(UIImage(named: "folder")!, multiplier:2, color: NCBrandColor.sharedInstance.brandElement) as UIImage
  369. row.cellConfig["imageView.image"] = imageFolder
  370. row.cellConfig["textLabel.textAlignment"] = NSTextAlignment.right.rawValue
  371. row.cellConfig["textLabel.font"] = UIFont.systemFont(ofSize: 15.0)
  372. section.addFormRow(row)
  373. // Section: File Name
  374. section = XLFormSectionDescriptor.formSection(withTitle: NSLocalizedString("_filename_", comment: ""))
  375. form.addFormSection(section)
  376. row = XLFormRowDescriptor(tag: "fileName", rowType: XLFormRowDescriptorTypeAccount, title: NSLocalizedString("_filename_", comment: ""))
  377. row.value = self.fileName
  378. row.cellConfig["textLabel.font"] = UIFont.systemFont(ofSize: 15.0)
  379. row.cellConfig["textField.textAlignment"] = NSTextAlignment.right.rawValue
  380. row.cellConfig["textField.font"] = UIFont.systemFont(ofSize: 15.0)
  381. section.addFormRow(row)
  382. self.form = form
  383. }
  384. override func formRowDescriptorValueHasChanged(_ formRow: XLFormRowDescriptor!, oldValue: Any!, newValue: Any!) {
  385. super.formRowDescriptorValueHasChanged(formRow, oldValue: oldValue, newValue: newValue)
  386. if formRow.tag == "fileName" {
  387. self.form.delegate = nil
  388. if let fileNameNew = formRow.value {
  389. self.fileName = CCUtility.removeForbiddenCharactersServer(fileNameNew as? String)
  390. }
  391. formRow.value = self.fileName
  392. self.title = fileName
  393. self.updateFormRow(formRow)
  394. self.form.delegate = self
  395. }
  396. }
  397. // MARK: - View Life Cycle
  398. override func viewDidLoad() {
  399. super.viewDidLoad()
  400. let saveButton : UIBarButtonItem = UIBarButtonItem(title: NSLocalizedString("_save_", comment: ""), style: UIBarButtonItem.Style.plain, target: self, action: #selector(save))
  401. self.navigationItem.rightBarButtonItem = saveButton
  402. self.navigationController?.navigationBar.isTranslucent = false
  403. self.navigationController?.navigationBar.barTintColor = NCBrandColor.sharedInstance.brand
  404. self.navigationController?.navigationBar.tintColor = NCBrandColor.sharedInstance.brandText
  405. self.navigationController?.navigationBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor: NCBrandColor.sharedInstance.brandText]
  406. self.tableView.separatorStyle = UITableViewCell.SeparatorStyle.none
  407. }
  408. // MARK: - Action
  409. func moveServerUrl(to serverUrlTo: String!, title: String!, type: String!) {
  410. self.serverUrl = serverUrlTo
  411. if let title = title {
  412. self.titleServerUrl = title
  413. } else {
  414. self.titleServerUrl = "/"
  415. }
  416. // Update
  417. let row : XLFormRowDescriptor = self.form.formRow(withTag: "ButtonDestinationFolder")!
  418. row.title = self.titleServerUrl
  419. self.updateFormRow(row)
  420. }
  421. @objc func save() {
  422. let rowFileName : XLFormRowDescriptor = self.form.formRow(withTag: "fileName")!
  423. guard let name = rowFileName.value else {
  424. return
  425. }
  426. let ext = (name as! NSString).pathExtension.uppercased()
  427. var fileNameSave = ""
  428. if (ext == "") {
  429. fileNameSave = name as! String + ".txt"
  430. } else if (CCUtility.isDocumentModifiableExtension(ext)) {
  431. fileNameSave = name as! String
  432. } else {
  433. fileNameSave = (name as! NSString).deletingPathExtension + ".txt"
  434. }
  435. guard let directoryID = NCManageDatabase.sharedInstance.getDirectoryID(self.serverUrl) else {
  436. return
  437. }
  438. let metadata = NCManageDatabase.sharedInstance.getMetadata(predicate: NSPredicate(format: "directoryID == %@ AND fileNameView == %@", directoryID, fileNameSave))
  439. if (metadata != nil) {
  440. let alertController = UIAlertController(title: fileNameSave, message: NSLocalizedString("_file_already_exists_", comment: ""), preferredStyle: .alert)
  441. let cancelAction = UIAlertAction(title: NSLocalizedString("_cancel_", comment: ""), style: .default) { (action:UIAlertAction) in
  442. }
  443. let overwriteAction = UIAlertAction(title: NSLocalizedString("_overwrite_", comment: ""), style: .cancel) { (action:UIAlertAction) in
  444. self.dismissAndUpload(fileNameSave, fileID: metadata!.fileID, directoryID: directoryID)
  445. }
  446. alertController.addAction(cancelAction)
  447. alertController.addAction(overwriteAction)
  448. self.present(alertController, animated: true, completion:nil)
  449. } else {
  450. let directoryID = NCManageDatabase.sharedInstance.getDirectoryID(self.serverUrl)!
  451. dismissAndUpload(fileNameSave, fileID: directoryID + fileNameSave, directoryID: directoryID)
  452. }
  453. }
  454. func dismissAndUpload(_ fileNameSave: String, fileID: String, directoryID: String) {
  455. self.dismiss(animated: true, completion: {
  456. let data = self.text.data(using: .utf8)
  457. let success = FileManager.default.createFile(atPath: CCUtility.getDirectoryProviderStorageFileID(fileID, fileNameView: fileNameSave), contents: data, attributes: nil)
  458. if success {
  459. let metadataForUpload = tableMetadata()
  460. metadataForUpload.account = self.appDelegate.activeAccount
  461. metadataForUpload.date = NSDate()
  462. metadataForUpload.directoryID = directoryID
  463. metadataForUpload.fileID = fileID
  464. metadataForUpload.fileName = fileNameSave
  465. metadataForUpload.fileNameView = fileNameSave
  466. metadataForUpload.session = k_upload_session
  467. metadataForUpload.sessionSelector = selectorUploadFile
  468. metadataForUpload.status = Int(k_metadataStatusWaitUpload)
  469. _ = NCManageDatabase.sharedInstance.addMetadata(metadataForUpload)
  470. self.appDelegate.perform(#selector(self.appDelegate.loadAutoDownloadUpload), on: Thread.main, with: nil, waitUntilDone: true)
  471. NCMainCommon.sharedInstance.reloadDatasource(ServerUrl: self.serverUrl, fileID: nil, action: Int32(k_action_NULL))
  472. } else {
  473. self.appDelegate.messageNotification("_error_", description: "_error_creation_file_", visible: true, delay: TimeInterval(k_dismissAfterSecond), type: TWMessageBarMessageType.info, errorCode: 0)
  474. }
  475. })
  476. }
  477. func cancel() {
  478. self.dismiss(animated: true, completion: nil)
  479. }
  480. @objc func changeDestinationFolder(_ sender: XLFormRowDescriptor) {
  481. self.deselectFormRow(sender)
  482. let storyboard : UIStoryboard = UIStoryboard(name: "CCMove", bundle: nil)
  483. let navigationController = storyboard.instantiateViewController(withIdentifier: "CCMove") as! UINavigationController
  484. let viewController : CCMove = navigationController.topViewController as! CCMove
  485. viewController.delegate = self;
  486. viewController.tintColor = NCBrandColor.sharedInstance.brandText
  487. viewController.barTintColor = NCBrandColor.sharedInstance.brand
  488. viewController.tintColorTitle = NCBrandColor.sharedInstance.brandText
  489. viewController.move.title = NSLocalizedString("_select_", comment: "");
  490. viewController.networkingOperationQueue = appDelegate.netQueue
  491. // E2EE
  492. viewController.includeDirectoryE2EEncryption = true;
  493. navigationController.modalPresentationStyle = UIModalPresentationStyle.formSheet
  494. self.present(navigationController, animated: true, completion: nil)
  495. }
  496. }
  497. //MARK: -
  498. class CreateFormUploadScanDocument: XLFormViewController, CCMoveDelegate {
  499. enum typeDpiQuality {
  500. case low
  501. case medium
  502. case hight
  503. }
  504. var dpiQuality: typeDpiQuality = typeDpiQuality.medium
  505. var serverUrl = ""
  506. var titleServerUrl = ""
  507. var arrayImages = [UIImage]()
  508. var fileName = CCUtility.createFileNameDate("scan", extension: "pdf")
  509. var password : PDFPassword = ""
  510. var fileType = "PDF"
  511. let appDelegate = UIApplication.shared.delegate as! AppDelegate
  512. convenience init(serverUrl: String, arrayImages: [UIImage]) {
  513. self.init()
  514. if serverUrl == CCUtility.getHomeServerUrlActiveUrl(appDelegate.activeUrl) {
  515. titleServerUrl = "/"
  516. } else {
  517. titleServerUrl = (serverUrl as NSString).lastPathComponent
  518. }
  519. self.serverUrl = serverUrl
  520. self.arrayImages = arrayImages
  521. initializeForm()
  522. }
  523. //MARK: XLFormDescriptorDelegate
  524. func initializeForm() {
  525. let form : XLFormDescriptor = XLFormDescriptor(title: NSLocalizedString("_save_settings_", comment: "")) as XLFormDescriptor
  526. form.rowNavigationOptions = XLFormRowNavigationOptions.stopDisableRow
  527. var section : XLFormSectionDescriptor
  528. var row : XLFormRowDescriptor
  529. // Section: Destination Folder
  530. section = XLFormSectionDescriptor.formSection(withTitle: NSLocalizedString("_save_path_", comment: ""))
  531. form.addFormSection(section)
  532. row = XLFormRowDescriptor(tag: "ButtonDestinationFolder", rowType: XLFormRowDescriptorTypeButton, title: self.titleServerUrl)
  533. row.action.formSelector = #selector(changeDestinationFolder(_:))
  534. let imageFolder = CCGraphics.changeThemingColorImage(UIImage(named: "folder")!, multiplier:2, color: NCBrandColor.sharedInstance.brandElement) as UIImage
  535. row.cellConfig["imageView.image"] = imageFolder
  536. row.cellConfig["textLabel.textAlignment"] = NSTextAlignment.right.rawValue
  537. row.cellConfig["textLabel.font"] = UIFont.systemFont(ofSize: 15.0)
  538. section.addFormRow(row)
  539. // Section: Quality
  540. section = XLFormSectionDescriptor.formSection(withTitle: NSLocalizedString("_quality_image_title_", comment: ""))
  541. form.addFormSection(section)
  542. row = XLFormRowDescriptor(tag: "compressionQuality", rowType: XLFormRowDescriptorTypeSlider)
  543. row.value = 0.5
  544. row.title = NSLocalizedString("_quality_medium_", comment: "")
  545. row.cellConfig["slider.minimumTrackTintColor"] = NCBrandColor.sharedInstance.brand
  546. row.cellConfig["slider.maximumValue"] = 1
  547. row.cellConfig["slider.minimumValue"] = 0
  548. row.cellConfig["steps"] = 2
  549. row.cellConfig["textLabel.textAlignment"] = NSTextAlignment.center.rawValue
  550. row.cellConfig["textLabel.font"] = UIFont.systemFont(ofSize: 15.0)
  551. section.addFormRow(row)
  552. // Section: Password
  553. section = XLFormSectionDescriptor.formSection(withTitle: NSLocalizedString("_pdf_password_", comment: ""))
  554. form.addFormSection(section)
  555. row = XLFormRowDescriptor(tag: "password", rowType: XLFormRowDescriptorTypePassword, title: NSLocalizedString("_password_", comment: ""))
  556. row.cellConfig["textLabel.font"] = UIFont.systemFont(ofSize: 15.0)
  557. row.cellConfig["textField.textAlignment"] = NSTextAlignment.right.rawValue
  558. row.cellConfig["textField.font"] = UIFont.systemFont(ofSize: 15.0)
  559. section.addFormRow(row)
  560. // Section: File
  561. section = XLFormSectionDescriptor.formSection(withTitle: NSLocalizedString("_file_creation_", comment: ""))
  562. form.addFormSection(section)
  563. if arrayImages.count == 1 {
  564. row = XLFormRowDescriptor(tag: "filetype", rowType: XLFormRowDescriptorTypeSelectorSegmentedControl, title: NSLocalizedString("_file_type_", comment: ""))
  565. row.selectorOptions = ["PDF","JPG"]
  566. row.value = "PDF"
  567. row.cellConfig["tintColor"] = NCBrandColor.sharedInstance.brand
  568. row.cellConfig["textLabel.font"] = UIFont.systemFont(ofSize: 15.0)
  569. section.addFormRow(row)
  570. }
  571. row = XLFormRowDescriptor(tag: "fileName", rowType: XLFormRowDescriptorTypeAccount, title: NSLocalizedString("_filename_", comment: ""))
  572. row.value = self.fileName
  573. row.cellConfig["textLabel.font"] = UIFont.systemFont(ofSize: 15.0)
  574. row.cellConfig["textField.textAlignment"] = NSTextAlignment.right.rawValue
  575. row.cellConfig["textField.font"] = UIFont.systemFont(ofSize: 15.0)
  576. section.addFormRow(row)
  577. self.form = form
  578. }
  579. override func formRowDescriptorValueHasChanged(_ formRow: XLFormRowDescriptor!, oldValue: Any!, newValue: Any!) {
  580. super.formRowDescriptorValueHasChanged(formRow, oldValue: oldValue, newValue: newValue)
  581. if formRow.tag == "fileName" {
  582. self.form.delegate = nil
  583. let fileNameNew = newValue as? String
  584. if fileNameNew != nil {
  585. self.fileName = CCUtility.removeForbiddenCharactersServer(fileNameNew)
  586. } else {
  587. self.fileName = ""
  588. }
  589. formRow.value = self.fileName
  590. self.updateFormRow(formRow)
  591. self.form.delegate = self
  592. }
  593. if formRow.tag == "compressionQuality" {
  594. self.form.delegate = nil
  595. //let row : XLFormRowDescriptor = self.form.formRow(withTag: "descriptionQuality")!
  596. let newQuality = newValue as? NSNumber
  597. let compressionQuality = (newQuality?.doubleValue)!
  598. if compressionQuality >= 0.0 && compressionQuality <= 0.3 {
  599. formRow.title = NSLocalizedString("_quality_low_", comment: "")
  600. dpiQuality = typeDpiQuality.low
  601. } else if compressionQuality > 0.3 && compressionQuality <= 0.6 {
  602. formRow.title = NSLocalizedString("_quality_medium_", comment: "")
  603. dpiQuality = typeDpiQuality.medium
  604. } else if compressionQuality > 0.6 && compressionQuality <= 1.0 {
  605. formRow.title = NSLocalizedString("_quality_high_", comment: "")
  606. dpiQuality = typeDpiQuality.hight
  607. }
  608. self.updateFormRow(formRow)
  609. self.form.delegate = self
  610. }
  611. if formRow.tag == "password" {
  612. let stringPassword = newValue as? String
  613. if stringPassword != nil {
  614. password = PDFPassword(stringPassword!)
  615. } else {
  616. password = PDFPassword("")
  617. }
  618. }
  619. if formRow.tag == "filetype" {
  620. fileType = newValue as! String
  621. let rowFileName : XLFormRowDescriptor = self.form.formRow(withTag: "fileName")!
  622. let rowPassword : XLFormRowDescriptor = self.form.formRow(withTag: "password")!
  623. // rowFileName
  624. guard var name = rowFileName.value else {
  625. return
  626. }
  627. if name as! String == "" {
  628. name = CCUtility.createFileNameDate("scan", extension: "pdf")
  629. }
  630. let ext = (name as! NSString).pathExtension.uppercased()
  631. var newFileName = ""
  632. if (ext == "") {
  633. newFileName = name as! String + "." + fileType.lowercased()
  634. } else {
  635. newFileName = (name as! NSString).deletingPathExtension + "." + fileType.lowercased()
  636. }
  637. rowFileName.value = newFileName
  638. self.updateFormRow(rowFileName)
  639. // rowPassword
  640. if fileType == "JPG" {
  641. rowPassword.value = ""
  642. password = PDFPassword("")
  643. rowPassword.disabled = true
  644. } else {
  645. rowPassword.disabled = false
  646. }
  647. self.updateFormRow(rowPassword)
  648. }
  649. }
  650. // MARK: - View Life Cycle
  651. override func viewDidLoad() {
  652. super.viewDidLoad()
  653. let saveButton : UIBarButtonItem = UIBarButtonItem(title: NSLocalizedString("_save_", comment: ""), style: UIBarButtonItem.Style.plain, target: self, action: #selector(save))
  654. self.navigationItem.rightBarButtonItem = saveButton
  655. self.navigationController?.navigationBar.isTranslucent = false
  656. self.navigationController?.navigationBar.barTintColor = NCBrandColor.sharedInstance.brand
  657. self.navigationController?.navigationBar.tintColor = NCBrandColor.sharedInstance.brandText
  658. self.navigationController?.navigationBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor: NCBrandColor.sharedInstance.brandText]
  659. self.tableView.separatorStyle = UITableViewCell.SeparatorStyle.none
  660. // self.tableView.sectionHeaderHeight = 10
  661. // self.tableView.sectionFooterHeight = 10
  662. // self.tableView.backgroundColor = NCBrandColor.sharedInstance.backgroundView
  663. // let row : XLFormRowDescriptor = self.form.formRow(withTag: "fileName")!
  664. // let rowCell = row.cell(forForm: self)
  665. // rowCell.becomeFirstResponder()
  666. }
  667. // MARK: - Action
  668. func moveServerUrl(to serverUrlTo: String!, title: String!, type: String!) {
  669. self.serverUrl = serverUrlTo
  670. if let title = title {
  671. self.titleServerUrl = title
  672. } else {
  673. self.titleServerUrl = "/"
  674. }
  675. // Update
  676. let row : XLFormRowDescriptor = self.form.formRow(withTag: "ButtonDestinationFolder")!
  677. row.title = self.titleServerUrl
  678. self.updateFormRow(row)
  679. }
  680. @objc func save() {
  681. let rowFileName : XLFormRowDescriptor = self.form.formRow(withTag: "fileName")!
  682. guard let name = rowFileName.value else {
  683. return
  684. }
  685. if name as! String == "" {
  686. return
  687. }
  688. let ext = (name as! NSString).pathExtension.uppercased()
  689. var fileNameSave = ""
  690. if (ext == "") {
  691. fileNameSave = name as! String + "." + fileType.lowercased()
  692. } else {
  693. fileNameSave = (name as! NSString).deletingPathExtension + "." + fileType.lowercased()
  694. }
  695. guard let directoryID = NCManageDatabase.sharedInstance.getDirectoryID(self.serverUrl) else {
  696. return
  697. }
  698. let metadata = NCManageDatabase.sharedInstance.getMetadata(predicate: NSPredicate(format: "directoryID == %@ AND fileNameView == %@", directoryID, fileNameSave))
  699. if (metadata != nil) {
  700. let alertController = UIAlertController(title: fileNameSave, message: NSLocalizedString("_file_already_exists_", comment: ""), preferredStyle: .alert)
  701. let cancelAction = UIAlertAction(title: NSLocalizedString("_cancel_", comment: ""), style: .default) { (action:UIAlertAction) in
  702. }
  703. let overwriteAction = UIAlertAction(title: NSLocalizedString("_overwrite_", comment: ""), style: .cancel) { (action:UIAlertAction) in
  704. NCManageDatabase.sharedInstance.deleteMetadata(predicate: NSPredicate(format: "directoryID == %@ AND fileNameView == %@", directoryID, fileNameSave), clearDateReadDirectoryID: directoryID)
  705. self.dismissAndUpload(fileNameSave, fileID: directoryID + fileNameSave, directoryID: directoryID)
  706. }
  707. alertController.addAction(cancelAction)
  708. alertController.addAction(overwriteAction)
  709. self.present(alertController, animated: true, completion:nil)
  710. } else {
  711. let directoryID = NCManageDatabase.sharedInstance.getDirectoryID(self.serverUrl)!
  712. dismissAndUpload(fileNameSave, fileID: directoryID + fileNameSave, directoryID: directoryID)
  713. }
  714. }
  715. func dismissAndUpload(_ fileNameSave: String, fileID: String, directoryID: String) {
  716. guard let fileNameGenerateExport = CCUtility.getDirectoryProviderStorageFileID(fileID, fileNameView: fileNameSave) else {
  717. self.appDelegate.messageNotification("_error_", description: "_error_creation_file_", visible: true, delay: TimeInterval(k_dismissAfterSecond), type: TWMessageBarMessageType.info, errorCode: 0)
  718. return
  719. }
  720. if fileType == "PDF" {
  721. var pdfPages = [PDFPage]()
  722. //Generate PDF
  723. for var image in self.arrayImages {
  724. image = changeImageFromQuality(image, dpiQuality: dpiQuality)
  725. guard let data = image.jpegData(compressionQuality: 0.5) else {
  726. self.appDelegate.messageNotification("_error_", description: "_error_creation_file_", visible: true, delay: TimeInterval(k_dismissAfterSecond), type: TWMessageBarMessageType.info, errorCode: 0)
  727. return
  728. }
  729. let page = PDFPage.image(UIImage(data: data)!)
  730. pdfPages.append(page)
  731. }
  732. do {
  733. try PDFGenerator.generate(pdfPages, to: fileNameGenerateExport, password: password)
  734. } catch {
  735. self.appDelegate.messageNotification("_error_", description: "_error_creation_file_", visible: true, delay: TimeInterval(k_dismissAfterSecond), type: TWMessageBarMessageType.info, errorCode: 0)
  736. return
  737. }
  738. }
  739. if fileType == "JPG" {
  740. let image = changeImageFromQuality(self.arrayImages[0], dpiQuality: dpiQuality)
  741. guard let data = image.jpegData(compressionQuality: CGFloat(0.5)) else {
  742. self.appDelegate.messageNotification("_error_", description: "_error_creation_file_", visible: true, delay: TimeInterval(k_dismissAfterSecond), type: TWMessageBarMessageType.info, errorCode: 0)
  743. return
  744. }
  745. do {
  746. try data.write(to: NSURL.fileURL(withPath: fileNameGenerateExport), options: .atomic)
  747. } catch {
  748. self.appDelegate.messageNotification("_error_", description: "_error_creation_file_", visible: true, delay: TimeInterval(k_dismissAfterSecond), type: TWMessageBarMessageType.info, errorCode: 0)
  749. return
  750. }
  751. }
  752. //Create metadata for upload
  753. let metadataForUpload = tableMetadata()
  754. metadataForUpload.account = self.appDelegate.activeAccount
  755. metadataForUpload.date = NSDate()
  756. metadataForUpload.directoryID = directoryID
  757. metadataForUpload.fileID = fileID
  758. metadataForUpload.fileName = fileNameSave
  759. metadataForUpload.fileNameView = fileNameSave
  760. metadataForUpload.session = k_upload_session
  761. metadataForUpload.sessionSelector = selectorUploadFile
  762. metadataForUpload.status = Int(k_metadataStatusWaitUpload)
  763. _ = NCManageDatabase.sharedInstance.addMetadata(metadataForUpload)
  764. self.appDelegate.perform(#selector(self.appDelegate.loadAutoDownloadUpload), on: Thread.main, with: nil, waitUntilDone: true)
  765. NCMainCommon.sharedInstance.reloadDatasource(ServerUrl: self.serverUrl, fileID: nil, action: Int32(k_action_NULL))
  766. // Request delete all image scanned
  767. let alertController = UIAlertController(title: "", message: NSLocalizedString("_delete_all_scanned_images_", comment: ""), preferredStyle: .alert)
  768. let actionYes = UIAlertAction(title: NSLocalizedString("_yes_delete_", comment: ""), style: .default) { (action:UIAlertAction) in
  769. let path = CCUtility.getDirectoryScan()!
  770. do {
  771. let filePaths = try FileManager.default.contentsOfDirectory(atPath: path)
  772. for filePath in filePaths {
  773. try FileManager.default.removeItem(atPath: path + "/" + filePath)
  774. }
  775. } catch let error as NSError {
  776. print("Error: \(error.debugDescription)")
  777. }
  778. self.dismiss(animated: true, completion: nil)
  779. }
  780. let actionNo = UIAlertAction(title: NSLocalizedString("_no_delete_", comment: ""), style: .default) { (action:UIAlertAction) in
  781. self.dismiss(animated: true, completion: nil)
  782. }
  783. alertController.addAction(actionYes)
  784. alertController.addAction(actionNo)
  785. self.present(alertController, animated: true, completion:nil)
  786. }
  787. func cancel() {
  788. self.dismiss(animated: true, completion: nil)
  789. }
  790. @objc func changeDestinationFolder(_ sender: XLFormRowDescriptor) {
  791. self.deselectFormRow(sender)
  792. let storyboard : UIStoryboard = UIStoryboard(name: "CCMove", bundle: nil)
  793. let navigationController = storyboard.instantiateViewController(withIdentifier: "CCMove") as! UINavigationController
  794. let viewController : CCMove = navigationController.topViewController as! CCMove
  795. viewController.delegate = self;
  796. viewController.tintColor = NCBrandColor.sharedInstance.brandText
  797. viewController.barTintColor = NCBrandColor.sharedInstance.brand
  798. viewController.tintColorTitle = NCBrandColor.sharedInstance.brandText
  799. viewController.move.title = NSLocalizedString("_select_", comment: "");
  800. viewController.networkingOperationQueue = appDelegate.netQueue
  801. // E2EE
  802. viewController.includeDirectoryE2EEncryption = true;
  803. navigationController.modalPresentationStyle = UIModalPresentationStyle.formSheet
  804. self.present(navigationController, animated: true, completion: nil)
  805. }
  806. func changeImageFromQuality(_ image: UIImage, dpiQuality: typeDpiQuality) -> UIImage {
  807. let imageWidthInPixels = image.size.width * image.scale
  808. let imageHeightInPixels = image.size.height * image.scale
  809. switch dpiQuality {
  810. case typeDpiQuality.low: // 72 DPI
  811. if imageWidthInPixels > 595 || imageHeightInPixels > 842 {
  812. return CCGraphics.scale(image, to: CGSize(width: 595, height: 842), isAspectRation: true)
  813. }
  814. case typeDpiQuality.medium: // 150 DPI
  815. if imageWidthInPixels > 1240 || imageHeightInPixels > 1754 {
  816. return CCGraphics.scale(image, to: CGSize(width: 1240, height: 1754), isAspectRation: true)
  817. }
  818. case typeDpiQuality.hight: // 200 DPI
  819. if imageWidthInPixels > 1654 || imageHeightInPixels > 2339 {
  820. return CCGraphics.scale(image, to: CGSize(width: 1654, height: 2339), isAspectRation: true)
  821. }
  822. }
  823. return image
  824. }
  825. }
  826. class NCCreateScanDocument : NSObject, ImageScannerControllerDelegate {
  827. @objc static let sharedInstance: NCCreateScanDocument = {
  828. let instance = NCCreateScanDocument()
  829. return instance
  830. }()
  831. let appDelegate = UIApplication.shared.delegate as! AppDelegate
  832. var viewController: UIViewController?
  833. var openScan: Bool = false
  834. @available(iOS 10, *)
  835. func openScannerDocument(viewController: UIViewController, openScan: Bool) {
  836. self.viewController = viewController
  837. self.openScan = openScan
  838. let scannerVC = ImageScannerController()
  839. scannerVC.imageScannerDelegate = self
  840. self.viewController?.present(scannerVC, animated: true, completion: nil)
  841. }
  842. @available(iOS 10, *)
  843. func imageScannerController(_ scanner: ImageScannerController, didFinishScanningWithResults results: ImageScannerResults) {
  844. let fileName = CCUtility.createFileName("scan.png", fileDate: Date(), fileType: PHAssetMediaType.image, keyFileName: k_keyFileNameMask, keyFileNameType: k_keyFileNameType, keyFileNameOriginal: k_keyFileNameOriginal)!
  845. let fileNamePath = CCUtility.getDirectoryScan() + "/" + fileName
  846. do {
  847. try results.scannedImage.pngData()?.write(to: NSURL.fileURL(withPath: fileNamePath), options: .atomic)
  848. } catch { }
  849. scanner.dismiss(animated: true, completion: {
  850. if (self.openScan) {
  851. let storyboard = UIStoryboard(name: "Scan", bundle: nil)
  852. let controller = storyboard.instantiateInitialViewController()!
  853. controller.modalPresentationStyle = UIModalPresentationStyle.pageSheet
  854. self.viewController?.present(controller, animated: true, completion: nil)
  855. }
  856. })
  857. }
  858. @available(iOS 10, *)
  859. func imageScannerControllerDidCancel(_ scanner: ImageScannerController) {
  860. scanner.dismiss(animated: true, completion: nil)
  861. }
  862. @available(iOS 10, *)
  863. func imageScannerController(_ scanner: ImageScannerController, didFailWithError error: Error) {
  864. appDelegate.messageNotification("_error_", description: error.localizedDescription, visible: true, delay: TimeInterval(k_dismissAfterSecond), type: TWMessageBarMessageType.error, errorCode: Int(k_CCErrorInternalError))
  865. }
  866. }