Browse Source

crop images after selecting them

cyberta 5 years ago
parent
commit
1139eb54f1

+ 9 - 9
deltachat-ios/Controller/EditSettingsController.swift

@@ -161,16 +161,16 @@ class EditSettingsController: UITableViewController, MediaPickerDelegate {
 
     func onMediaSelected(url: NSURL) {
         logger.info("onMediaSelected: \(url)")
+    }
+
+    func onImageSelected(image: UIImage) {
+        AvatarHelper.saveSelfAvatarImage(image: image)
+
+        self.tableView.beginUpdates()
+        let indexPath = IndexPath(row: section1PictureAndName, section: section1)
+        self.tableView.reloadRows(at: [indexPath], with: UITableView.RowAnimation.none)
+        self.tableView.endUpdates()
 
-        DispatchQueue.global(qos: .userInitiated).async {
-            //[weak self] in
-            AvatarHelper.setSelfAvatarFile(fileUrl: URL(fileURLWithPath: url.path ?? ""))
-            /*if let image = self?.dcContext.getSelfAvatarImage() {
-                DispatchQueue.main.async {
-                    self?.pictureAndNameCell.badge = InitialsBadge(image: image, size: 72)
-                }
-            }*/
-        }
     }
 
     func onDismiss() { }

+ 1 - 1
deltachat-ios/Coordinator/AppCoordinator.swift

@@ -204,7 +204,7 @@ class EditSettingsCoordinator: Coordinator {
     }
 
     func showPhotoPicker(delegate: MediaPickerDelegate) {
-        mediaPicker.showPhotoLibrary(delegate: delegate)
+        mediaPicker.showImageCropper(delegate: delegate)
     }
 }
 

+ 38 - 1
deltachat-ios/Helper/AvatarHelper.swift

@@ -1,5 +1,5 @@
 import Foundation
-
+import UIKit
 
 class AvatarHelper {
 
@@ -8,6 +8,43 @@ class AvatarHelper {
     static let selfAvatarFile = "contact_avatar_self.jpg"
     private static let avatarPath = "avatars"
 
+    static func saveSelfAvatarImage(image: UIImage) {
+        if let data = image.jpegData(compressionQuality: 0.8) {
+            let filemanager = FileManager.default
+            let docDir = filemanager.urls(for: .documentDirectory, in: .userDomainMask)[0]
+            let avatarDir = docDir.appendingPathComponent(avatarPath)
+            let avatarFile = avatarDir.appendingPathComponent(selfAvatarFile)
+            do {
+                try filemanager.createDirectory(atPath: avatarDir.path,
+                                                withIntermediateDirectories: false)
+            } catch let error as NSError {
+                logger.info("\(error.localizedDescription)")
+            }
+
+            if !filemanager.changeCurrentDirectoryPath(avatarDir.path) {
+                logger.warning("Could not change into avatar directory")
+                return
+            }
+
+            if filemanager.fileExists(atPath: avatarFile.path) {
+                do {
+                    try filemanager.removeItem(atPath: avatarFile.path)
+                } catch let error {
+                    logger.warning("Error: \(error.localizedDescription)")
+                }
+            }
+
+            do {
+                try data.write(to: avatarFile)
+            } catch let error {
+                logger.warning("Error: \(error.localizedDescription)")
+                return
+            }
+
+            DcConfig.selfavatar = avatarFile.path
+        }
+    }
+
     // blocking method (reads/writes to storage)
     static func setSelfAvatarFile(fileUrl: URL) {
         let filemanager = FileManager.default

+ 19 - 1
deltachat-ios/Helper/MediaPicker.swift

@@ -1,9 +1,11 @@
 import UIKit
 import Photos
 import MobileCoreServices
+import ALCameraViewController
 
 protocol MediaPickerDelegate: class {
     func onMediaSelected(url: NSURL)
+    func onImageSelected(image: UIImage)
     func onDismiss()
 }
 
@@ -15,6 +17,22 @@ class MediaPicker: NSObject, UINavigationControllerDelegate, UIImagePickerContro
         self.navigationController = navigationController
     }
 
+    func showImageCropper(delegate: MediaPickerDelegate) {
+        let croppingParameters = CroppingParameters(isEnabled: true,
+                                                    allowResizing: true,
+                                                    allowMoving: true,
+                                                    minimumSize: CGSize(width: 70, height: 70))
+
+        let controller = CameraViewController.imagePickerViewController(croppingParameters: croppingParameters,
+                                                                        completion: { [weak self] image, asset in
+                                                                            if let image = image {
+                                                                                self?.delegate?.onImageSelected(image: image)
+                                                                            }
+                                                                            self?.navigationController.dismiss(animated: true, completion: delegate.onDismiss)})
+        self.delegate = delegate
+        navigationController.present(controller, animated: true, completion: nil)
+    }
+
     func showPhotoLibrary(delegate: MediaPickerDelegate) {
         if PHPhotoLibrary.authorizationStatus() != .authorized {
             PHPhotoLibrary.requestAuthorization { status in
@@ -39,7 +57,7 @@ class MediaPicker: NSObject, UINavigationControllerDelegate, UIImagePickerContro
             photoPicker.title = String.localized("photo")
             photoPicker.delegate = self
             photoPicker.sourceType = .photoLibrary
-            photoPicker.allowsEditing = false
+            photoPicker.allowsEditing = true
             photoPicker.mediaTypes = UIImagePickerController.availableMediaTypes(for: .photoLibrary) ?? []
             navigationController.present(photoPicker, animated: true, completion: nil)
             self.delegate = delegate