From e9df2e954c8f89619f9882b271c98e87b4631d9c Mon Sep 17 00:00:00 2001
From: Mustafa Merza <mustafa.merza95@gmail.com>
Date: Mon, 12 Aug 2024 15:03:03 +0300
Subject: [PATCH] - Added compressing scanned item after being rendered in
 scanner screen.

---
 .../Repositores/ScanSessionsRepository.swift  | 13 ++----
 .../Managers/ImageCompressManager.swift       | 44 +++++++++++++++++++
 .../MultiPageScanSession.swift                | 21 +++++++++
 .../Scan/ScannerViewController.swift          | 11 ++++-
 4 files changed, 77 insertions(+), 12 deletions(-)

diff --git a/MiniScanner/Features/ScanSession/Data/Repositores/ScanSessionsRepository.swift b/MiniScanner/Features/ScanSession/Data/Repositores/ScanSessionsRepository.swift
index f2b666b..88c31b4 100644
--- a/MiniScanner/Features/ScanSession/Data/Repositores/ScanSessionsRepository.swift
+++ b/MiniScanner/Features/ScanSession/Data/Repositores/ScanSessionsRepository.swift
@@ -184,16 +184,9 @@ extension ScanSessionsRepository {
                 let compressedOriginalImage = ImageCompressManager.compress(image: originalImage)
                 let compressedRenderedImage = ImageCompressManager.compress(image: renderedImage)
                 
-                let newScannedItem = ScannedItem(originalImage: compressedOriginalImage,
-                                                 renderImage: compressedRenderedImage,
-                                                 quad: item.quad,
-                                                 colorOption: item.colorOption,
-                                                 type: .local)
-                
-                newScannedItem.rotation = item.rotation
-                newScannedItem.signaturePosition = item.signaturePosition
-                newScannedItem.size = item.size
-                newScannedItem.rotate = item.rotate
+                let newScannedItem = item.createItem(originalImage: compressedOriginalImage,
+                                                     renderedImage: compressedRenderedImage,
+                                                     type: .local)
                 
                 if let imageUrl = item.newOriginalImage {
                     try? FileManager.default.removeItem(at: imageUrl)
diff --git a/MiniScanner/Managers/ImageCompressManager.swift b/MiniScanner/Managers/ImageCompressManager.swift
index 546b009..c07882a 100644
--- a/MiniScanner/Managers/ImageCompressManager.swift
+++ b/MiniScanner/Managers/ImageCompressManager.swift
@@ -10,9 +10,15 @@ import Foundation
 
 class ImageCompressManager {
     
+    @Inject private static var deleteScanSessionUseCase: DeleteScanSessionUseCase
+    
     class func compress(image: UIImage) -> UIImage {
         wxCompress(image: image)
     }
+    
+    class func compress(scannedItem: ScannedItem) -> ScannedItem {
+        wxCompress(scannedItem: scannedItem)
+    }
 }
 
 extension ImageCompressManager {
@@ -20,4 +26,42 @@ extension ImageCompressManager {
     private class func wxCompress(image: UIImage) -> UIImage {
         image.wxCompress()
     }
+    
+    private class func wxCompress(scannedItem: ScannedItem) -> ScannedItem {
+        
+        guard let originalImage = scannedItem.newOriginalImage?.retrieveImage(),
+              let renderedImage = scannedItem.newRenderedImage?.retrieveImage()
+                
+        else { return scannedItem }
+        
+        // Remove the scanned item old files
+        removeScannedItemFile(scannedItem: scannedItem)
+        
+        let compressedOriginalImage = compress(image: originalImage)
+        let compressedRenderedImage = compress(image: renderedImage)
+        
+        let newScannedItem = scannedItem.createItem(originalImage: compressedOriginalImage,
+                                                    renderedImage: compressedRenderedImage,
+                                                    type: scannedItem.type)
+        
+        if let imageUrl = scannedItem.newOriginalImage {
+            try? FileManager.default.removeItem(at: imageUrl)
+        }
+        
+        if let imageUrl = scannedItem.newRenderedImage {
+            try? FileManager.default.removeItem(at: imageUrl)
+        }
+        
+        return newScannedItem
+    }
+    
+    private class func removeScannedItemFile(scannedItem: ScannedItem) {
+        
+        let scanSession = ScanSession(id: UUID(),
+                                      name: "",
+                                      creationDate: .now,
+                                      scannedItems: [scannedItem])
+        
+        deleteScanSessionUseCase.execute(with: scanSession)
+    }
 }
diff --git a/MiniScanner/Supporting Files/Frameworks/CustomWeScan/MultiPageSession/MultiPageScanSession.swift b/MiniScanner/Supporting Files/Frameworks/CustomWeScan/MultiPageSession/MultiPageScanSession.swift
index 897ea5d..318bc3b 100644
--- a/MiniScanner/Supporting Files/Frameworks/CustomWeScan/MultiPageSession/MultiPageScanSession.swift	
+++ b/MiniScanner/Supporting Files/Frameworks/CustomWeScan/MultiPageSession/MultiPageScanSession.swift	
@@ -140,6 +140,27 @@ extension ScannedItem: Equatable {
     }
 }
 
+extension ScannedItem {
+    
+    func createItem(originalImage: UIImage,
+                    renderedImage: UIImage,
+                    type: ScannedItemType) -> ScannedItem {
+        
+        let newScannedItem = ScannedItem(originalImage: originalImage,
+                                         renderImage: renderedImage,
+                                         quad: quad,
+                                         colorOption: colorOption,
+                                         type: type)
+        
+        newScannedItem.rotation = rotation
+        newScannedItem.signaturePosition = signaturePosition
+        newScannedItem.size = size
+        newScannedItem.rotate = rotate
+        
+        return newScannedItem
+    }
+}
+
 public class MultiPageScanSession: Codable {
     
     public private(set) var scannedItems:Array<ScannedItem> = []
diff --git a/MiniScanner/Supporting Files/Frameworks/CustomWeScan/Scan/ScannerViewController.swift b/MiniScanner/Supporting Files/Frameworks/CustomWeScan/Scan/ScannerViewController.swift
index 81e8dae..c5939a6 100644
--- a/MiniScanner/Supporting Files/Frameworks/CustomWeScan/Scan/ScannerViewController.swift	
+++ b/MiniScanner/Supporting Files/Frameworks/CustomWeScan/Scan/ScannerViewController.swift	
@@ -462,9 +462,16 @@ extension ScannerViewController: RectangleDetectionDelegateProtocol {
         
         scannedItem.rotation = self.getCurrentRotationAngle()
         scannedItem.colorOption = self.options.defaultColorRenderOption
-        scannedItem.render { (_) in self.updateCounterButton() }
         
-        scanSession.add(item: scannedItem)
+        scannedItem.render { [weak self] _ in
+            guard let self else { return }
+            
+            let compressedScannedItem = ImageCompressManager.compress(scannedItem: scannedItem)
+            
+            scanSession.add(item: compressedScannedItem)
+            
+            updateCounterButton()
+        }
         
         self.captureSessionManager?.start()
     }
-- 
GitLab