Kaynağa Gözat

Merge remote-tracking branch 'origin/master'

kevin 2 yıl önce
ebeveyn
işleme
83b79958d6

+ 31 - 31
appbuilder-ios/DigiXLite/DigiXLite.xcodeproj/project.pbxproj

@@ -598,7 +598,6 @@
 				CD1E71502A0BA86100BF871F /* WhiteboardCanvas.swift */,
 				CD1E71AF2A0BA86100BF871F /* WhiteboardDelegate.swift */,
 				CD1E715B2A0BA86100BF871F /* WhiteboardReceiver.swift */,
-				CD5A73AA2A736761000541A5 /* ListGroupImages.swift */,
 			);
 			path = Source;
 			sourceTree = "<group>";
@@ -658,13 +657,15 @@
 		CD1E716D2A0BA86100BF871F /* Chat */ = {
 			isa = PBXGroup;
 			children = (
-				CD1E716E2A0BA86100BF871F /* EditorStarMessages.swift */,
-				CD1E716F2A0BA86100BF871F /* PreviewAttachmentImageVideo.xib */,
+				CD1E71742A0BA86100BF871F /* CustomTextView.swift */,
+				CD1E71722A0BA86100BF871F /* EditorGroup.swift */,
 				CD1E71702A0BA86100BF871F /* EditorPersonal.swift */,
+				CD1E716E2A0BA86100BF871F /* EditorStarMessages.swift */,
 				CD1E71712A0BA86100BF871F /* FormEditor.swift */,
-				CD1E71722A0BA86100BF871F /* EditorGroup.swift */,
+				CD5A73AA2A736761000541A5 /* ListGroupImages.swift */,
+				CD1E71A32A0BA86100BF871F /* MessageInfo.swift */,
 				CD1E71732A0BA86100BF871F /* PreviewAttachmentImageVideo.swift */,
-				CD1E71742A0BA86100BF871F /* CustomTextView.swift */,
+				CD1E716F2A0BA86100BF871F /* PreviewAttachmentImageVideo.xib */,
 			);
 			path = Chat;
 			sourceTree = "<group>";
@@ -708,42 +709,41 @@
 		CD1E71892A0BA86100BF871F /* Control */ = {
 			isa = PBXGroup;
 			children = (
-				CD1E718A2A0BA86100BF871F /* GroupCreateViewController.swift */,
+				CD1E71AB2A0BA86100BF871F /* AddFriendTableViewController.swift */,
+				CD1E71AD2A0BA86100BF871F /* AudienceViewController.swift */,
+				CD1E719B2A0BA86100BF871F /* BackupRestoreOption.swift */,
+				CD1E71A52A0BA86100BF871F /* BackupRestoreView.swift */,
 				CD1E718B2A0BA86100BF871F /* BroadcastMembersTableViewCell.swift */,
-				CD1E718C2A0BA86100BF871F /* QRScannerView.swift */,
-				CD1E718D2A0BA86100BF871F /* GroupDescViewController.swift */,
-				CD1E718E2A0BA86100BF871F /* HistoryBroadcastViewController.swift */,
-				CD1E718F2A0BA86100BF871F /* CheckConnection.swift */,
-				CD1E71902A0BA86100BF871F /* SignUpSignIn.swift */,
-				CD1E71912A0BA86100BF871F /* GroupDetailViewController.swift */,
+				CD1E71A72A0BA86100BF871F /* BroadcastMembersTableViewController.swift */,
+				CD1E719A2A0BA86100BF871F /* BroadcastModeViewController.swift */,
+				CD1E71A22A0BA86100BF871F /* BroadcastVariantViewController.swift */,
+				CD1E71A82A0BA86100BF871F /* BroadcastViewController.swift */,
+				CD1E71942A0BA86100BF871F /* ChangeDeviceViewController.swift */,
 				CD1E71922A0BA86100BF871F /* ChangeNamePassswordViewController.swift */,
+				CD1E719D2A0BA86100BF871F /* ChangeNameTableViewController.swift */,
+				CD1E71962A0BA86100BF871F /* ChangePasswordViewController.swift */,
+				CD1E718F2A0BA86100BF871F /* CheckConnection.swift */,
 				CD1E71932A0BA86100BF871F /* ContactChatViewController.swift */,
-				CD1E71942A0BA86100BF871F /* ChangeDeviceViewController.swift */,
 				CD1E71952A0BA86100BF871F /* DocumentPicker.swift */,
-				CD1E71962A0BA86100BF871F /* ChangePasswordViewController.swift */,
+				CD1E718A2A0BA86100BF871F /* GroupCreateViewController.swift */,
+				CD1E718D2A0BA86100BF871F /* GroupDescViewController.swift */,
+				CD1E71912A0BA86100BF871F /* GroupDetailViewController.swift */,
+				CD1E71A92A0BA86100BF871F /* GroupMemberViewController.swift */,
 				CD1E71972A0BA86100BF871F /* GroupNameViewController.swift */,
 				CD1E71982A0BA86100BF871F /* GroupTopicViewController.swift */,
-				CD1E71992A0BA86100BF871F /* SettingTableViewController.swift */,
-				CD1E719A2A0BA86100BF871F /* BroadcastModeViewController.swift */,
-				CD1E719B2A0BA86100BF871F /* BackupRestoreOption.swift */,
+				CD1E718E2A0BA86100BF871F /* HistoryBroadcastViewController.swift */,
 				CD1E719C2A0BA86100BF871F /* HistoryCCViewController.swift */,
-				CD1E719D2A0BA86100BF871F /* ChangeNameTableViewController.swift */,
-				CD1E719E2A0BA86100BF871F /* NotificationSound.swift */,
-				CD1E719F2A0BA86100BF871F /* TypeViewController.swift */,
-				CD1E71A02A0BA86100BF871F /* VerifyEmail.swift */,
-				CD1E71A12A0BA86100BF871F /* SetInternalCSAccount.swift */,
-				CD1E71A22A0BA86100BF871F /* BroadcastVariantViewController.swift */,
-				CD1E71A32A0BA86100BF871F /* MessageInfo.swift */,
 				CD1E71A42A0BA86100BF871F /* ImageVideoPicker.swift */,
-				CD1E71A52A0BA86100BF871F /* BackupRestoreView.swift */,
+				CD1E719E2A0BA86100BF871F /* NotificationSound.swift */,
 				CD1E71A62A0BA86100BF871F /* ProfileViewController.swift */,
-				CD1E71A72A0BA86100BF871F /* BroadcastMembersTableViewController.swift */,
-				CD1E71A82A0BA86100BF871F /* BroadcastViewController.swift */,
-				CD1E71A92A0BA86100BF871F /* GroupMemberViewController.swift */,
-				CD1E71AA2A0BA86100BF871F /* SetOfficerBNI.swift */,
-				CD1E71AB2A0BA86100BF871F /* AddFriendTableViewController.swift */,
+				CD1E718C2A0BA86100BF871F /* QRScannerView.swift */,
 				CD1E71AC2A0BA86100BF871F /* ScannerViewController.swift */,
-				CD1E71AD2A0BA86100BF871F /* AudienceViewController.swift */,
+				CD1E71A12A0BA86100BF871F /* SetInternalCSAccount.swift */,
+				CD1E71AA2A0BA86100BF871F /* SetOfficerBNI.swift */,
+				CD1E71992A0BA86100BF871F /* SettingTableViewController.swift */,
+				CD1E71902A0BA86100BF871F /* SignUpSignIn.swift */,
+				CD1E719F2A0BA86100BF871F /* TypeViewController.swift */,
+				CD1E71A02A0BA86100BF871F /* VerifyEmail.swift */,
 			);
 			path = Control;
 			sourceTree = "<group>";

BIN
appbuilder-ios/DigiXLite/DigiXLite.xcworkspace/xcuserdata/akhmadalqindiirsyam.xcuserdatad/UserInterfaceState.xcuserstate


+ 34 - 26
appbuilder-ios/DigiXLite/DigiXLite/Source/DigiX.swift

@@ -1503,19 +1503,19 @@ extension UIFont {
     static var isOverrided: Bool = false
     static let FONT_SELECT = 0
 
-    @objc class func libSystemFont(ofSize size: CGFloat) -> UIFont {
+    @objc class func libSystemFont(ofSize size: CGFloat) -> UIFont? {
         jbs_registerFont(withFilenameString: LibFontName.regular)
-        return UIFont(name: LibFontName.regular, size: size)!
+        return UIFont(name: LibFontName.regular, size: size)
     }
 
-    @objc class func libBoldSystemFont(ofSize size: CGFloat) -> UIFont {
+    @objc class func libBoldSystemFont(ofSize size: CGFloat) -> UIFont? {
         jbs_registerFont(withFilenameString: LibFontName.bold)
-        return UIFont(name: LibFontName.bold, size: size)!
+        return UIFont(name: LibFontName.bold, size: size)
     }
 
-    @objc class func libItalicSystemFont(ofSize size: CGFloat) -> UIFont {
+    @objc class func libItalicSystemFont(ofSize size: CGFloat) -> UIFont? {
         jbs_registerFont(withFilenameString: LibFontName.italic)
-        return UIFont(name: LibFontName.italic, size: size)!
+        return UIFont(name: LibFontName.italic, size: size)
     }
 
     @objc convenience init(myCoder aDecoder: NSCoder) {
@@ -1568,29 +1568,37 @@ extension UIFont {
     
     class func jbs_registerFont(withFilenameString filenameString: String) {
 
-        guard let pathForResourceString = Bundle.resourceBundle(for: DigiX.self).path(forResource: filenameString, ofType: "ttf") else { //resourcesMediaBundle
-            //print(("UIFont+:  Failed to register font - path for resource not found.")
-            return
-        }
-
-        guard let fontData = NSData(contentsOfFile: pathForResourceString) else {
-            //print(("UIFont+:  Failed to register font - font data could not be loaded.")
-            return
-        }
-
-        guard let dataProvider = CGDataProvider(data: fontData) else {
-            //print(("UIFont+:  Failed to register font - data provider could not be loaded.")
-            return
-        }
-
-        guard let font = CGFont(dataProvider) else {
-            //print(("UIFont+:  Failed to register font - font could not be loaded.")
+//        guard let pathForResourceString = Bundle.resourceBundle(for: Nexilis.self).path(forResource: filenameString, ofType: "ttf") else { //resourcesMediaBundle
+//            //print("UIFont+:  Failed to register font - path for resource not found.")
+//            return
+//        }
+        
+        guard let pathForResourceURL = Bundle.resourceBundle(for: DigiX.self).url(forResource: filenameString, withExtension: "ttf") else { //resourcesMediaBundle
+            //print("UIFont+:  Failed to register font - path for resource not found.")
             return
         }
-
+        
         var errorRef: Unmanaged<CFError>? = nil
-        if (CTFontManagerRegisterGraphicsFont(font, &errorRef) == false) {
-        }
+        CTFontManagerRegisterFontsForURL(pathForResourceURL as CFURL, .process, &errorRef)
+
+//        guard let fontData = NSData(contentsOfFile: pathForResourceString) else {
+//            //print("UIFont+:  Failed to register font - font data could not be loaded.")
+//            return
+//        }
+//
+//        guard let dataProvider = CGDataProvider(data: fontData) else {
+//            //print("UIFont+:  Failed to register font - data provider could not be loaded.")
+//            return
+//        }
+//
+//        guard let font = CGFont(dataProvider) else {
+//            //print("UIFont+:  Failed to register font - font could not be loaded.")
+//            return
+//        }
+//
+//        var errorRef: Unmanaged<CFError>? = nil
+//        if (CTFontManagerRegisterGraphicsFont(font, &errorRef) == false) {
+//        }
     }
 }
 

+ 92 - 30
appbuilder-ios/DigiXLite/DigiXLite/Source/View/Chat/EditorPersonal.swift

@@ -1641,7 +1641,13 @@ public class EditorPersonal: UIViewController, ImageVideoPickerDelegate, UIGestu
                 let idMe = UserDefaults.standard.string(forKey: "me")!
                 if chatData[CoreMessage_TMessageKey.F_PIN] == self.dataPerson["f_pin"]!! || chatData[CoreMessage_TMessageKey.L_PIN] == self.dataPerson["f_pin"]!! || chatData[CoreMessage_TMessageKey.L_PIN] == self.fPinContacCenter || requester == idMe {
                     if (chatData.keys.contains(CoreMessage_TMessageKey.MESSAGE_ID) && !(chatData[CoreMessage_TMessageKey.MESSAGE_ID]!).contains("-2,")) {
-                        let idx = self.dataMessages.firstIndex(where: { $0["message_id"] as? String == chatData[CoreMessage_TMessageKey.MESSAGE_ID]! })
+                        var idx = self.dataMessages.firstIndex(where: { $0["message_id"] as? String == chatData[CoreMessage_TMessageKey.MESSAGE_ID]! })
+                        if let idxMessageIdParent = self.groupImages.firstIndex(where: { $0.value.contains(where: { $0.messageId == chatData[CoreMessage_TMessageKey.MESSAGE_ID]! }) }) {
+                            if let idxInImages = self.groupImages[idxMessageIdParent].value.firstIndex(where: { $0.messageId == chatData[CoreMessage_TMessageKey.MESSAGE_ID]! }) {
+                                self.groupImages[idxMessageIdParent].value[idxInImages].status = chatData[CoreMessage_TMessageKey.STATUS]!
+                            }
+                            idx = self.dataMessages.firstIndex(where: { $0["message_id"] as? String == self.groupImages[idxMessageIdParent].key })
+                        }
                         if (idx != nil) {
                             if (chatData[CoreMessage_TMessageKey.DELETE_MESSAGE_FLAG] == "1") {
                                 self.dataMessages[idx!]["lock"] = "1"
@@ -1671,7 +1677,13 @@ public class EditorPersonal: UIViewController, ImageVideoPickerDelegate, UIGestu
                         }
                     }
                     else if (chatData.keys.contains("message_id")) {
-                        let idx = self.dataMessages.firstIndex(where: { "'\(String(describing: $0["message_id"] as? String))'" == chatData["message_id"]! })
+                        var idx = self.dataMessages.firstIndex(where: { "'\(String(describing: $0["message_id"] as? String))'" == chatData["message_id"]! })
+                        if let idxMessageIdParent = self.groupImages.firstIndex(where: { $0.value.contains(where: { $0.messageId == chatData["message_id"]! }) }) {
+                            if let idxInImages = self.groupImages[idxMessageIdParent].value.firstIndex(where: { $0.messageId == chatData["message_id"]! }) {
+                                self.groupImages[idxMessageIdParent].value[idxInImages].status = chatData[CoreMessage_TMessageKey.STATUS]!
+                            }
+                            idx = self.dataMessages.firstIndex(where: { $0["message_id"] as? String == self.groupImages[idxMessageIdParent].key })
+                        }
                         if (idx != nil) {
                             if (chatData[CoreMessage_TMessageKey.DELETE_MESSAGE_FLAG] == "1") {
                                 self.dataMessages[idx!]["lock"] = "1"
@@ -1702,7 +1714,13 @@ public class EditorPersonal: UIViewController, ImageVideoPickerDelegate, UIGestu
                     }
                     else {
                         let messageId = chatData[CoreMessage_TMessageKey.MESSAGE_ID]!.split(separator: ",")[1]
-                        let idx = self.dataMessages.firstIndex(where: { $0["message_id"] as? String ?? "" == messageId })
+                        var idx = self.dataMessages.firstIndex(where: { $0["message_id"] as? String ?? "" == messageId })
+                        if let idxMessageIdParent = self.groupImages.firstIndex(where: { $0.value.contains(where: { $0.messageId == messageId }) }) {
+                            if let idxInImages = self.groupImages[idxMessageIdParent].value.firstIndex(where: { $0.messageId == messageId }) {
+                                self.groupImages[idxMessageIdParent].value[idxInImages].status = chatData[CoreMessage_TMessageKey.STATUS]!
+                            }
+                            idx = self.dataMessages.firstIndex(where: { $0["message_id"] as? String == self.groupImages[idxMessageIdParent].key })
+                        }
                         if (idx != nil) {
                             self.dataMessages[idx!]["status"] = chatData[CoreMessage_TMessageKey.STATUS]!
                             let section = self.dataDates.firstIndex(of: self.dataMessages[idx!]["chat_date"] as! String)
@@ -2690,41 +2708,85 @@ public class EditorPersonal: UIViewController, ImageVideoPickerDelegate, UIGestu
             return
         }
         DispatchQueue.global().async {
-            Database.shared.database?.inTransaction({ (fmdb, rollback) in
-                _ = Database.shared.updateRecord(fmdb: fmdb, table: "MESSAGE", cvalues: [
-                    "status" : "4"
-                ], _where: "message_id = '\(message_id)'")
-            })
-            message.mStatus = CoreMessage_TMessageUtil.getTID()
-            message.mBodies[CoreMessage_TMessageKey.L_PIN] = f_pin
-            message.mBodies[CoreMessage_TMessageKey.MESSAGE_ID] = "-2,\(message_id)"
-            _ = DigiX.write(message: message)
+            if let listGroupImages = self.groupImages.first(where: { $0.key == message_id }) {
+                let valueListGroupImages = listGroupImages.value
+                for i in 0..<valueListGroupImages.count {
+                    Database.shared.database?.inTransaction({ (fmdb, rollback) in
+                        _ = Database.shared.updateRecord(fmdb: fmdb, table: "MESSAGE", cvalues: [
+                            "status" : "4"
+                        ], _where: "message_id = '\(valueListGroupImages[i].messageId)'")
+                    })
+                    message.mStatus = CoreMessage_TMessageUtil.getTID()
+                    message.mBodies[CoreMessage_TMessageKey.L_PIN] = f_pin
+                    message.mBodies[CoreMessage_TMessageKey.MESSAGE_ID] = "-2,\(valueListGroupImages[i].messageId)"
+                    _ = DigiX.write(message: message)
+                }
+            } else {
+                Database.shared.database?.inTransaction({ (fmdb, rollback) in
+                    _ = Database.shared.updateRecord(fmdb: fmdb, table: "MESSAGE", cvalues: [
+                        "status" : "4"
+                    ], _where: "message_id = '\(message_id)'")
+                })
+                message.mStatus = CoreMessage_TMessageUtil.getTID()
+                message.mBodies[CoreMessage_TMessageKey.L_PIN] = f_pin
+                message.mBodies[CoreMessage_TMessageKey.MESSAGE_ID] = "-2,\(message_id)"
+                _ = DigiX.write(message: message)
+            }
         }
         if let index = dataMessages.firstIndex(where: {$0["message_id"] as? String == message_id}) {
             dataMessages[index]["status"] = "4"
             let auto = UserDefaults.standard.bool(forKey: "autoDownload")
             if auto {
                 if dataMessages[index]["image_id"] as? String != nil && !((dataMessages[index]["image_id"] as? String)!.isEmpty) {
-                    Download().startHTTP(forKey:dataMessages[index]["image_id"] as! String) { (name, progress) in
-                        guard progress == 100 else {
-                            return
-                        }
-                        let nsDocumentDirectory = FileManager.SearchPathDirectory.documentDirectory
-                        let nsUserDomainMask = FileManager.SearchPathDomainMask.userDomainMask
-                        let paths = NSSearchPathForDirectoriesInDomains(nsDocumentDirectory, nsUserDomainMask, true)
-                        if let dirPath = paths.first {
-                            let imageURL = URL(fileURLWithPath: dirPath).appendingPathComponent(self.dataMessages[index]["image_id"] as! String)
-                            let image    = UIImage(contentsOfFile: imageURL.path)
-                            let save = UserDefaults.standard.bool(forKey: "saveToGallery")
-                            if save {
-                                UIImageWriteToSavedPhotosAlbum(image!, nil, nil, nil)
+                    if let listGroupImages = self.groupImages.first(where: { $0.key == message_id }) {
+                        let valueListGroupImages = listGroupImages.value
+                        for i in 0..<valueListGroupImages.count {
+                            Download().startHTTP(forKey:valueListGroupImages[i].imageId) { (name, progress) in
+                                guard progress == 100 else {
+                                    return
+                                }
+                                let nsDocumentDirectory = FileManager.SearchPathDirectory.documentDirectory
+                                let nsUserDomainMask = FileManager.SearchPathDomainMask.userDomainMask
+                                let paths = NSSearchPathForDirectoriesInDomains(nsDocumentDirectory, nsUserDomainMask, true)
+                                if let dirPath = paths.first {
+                                    let imageURL = URL(fileURLWithPath: dirPath).appendingPathComponent(valueListGroupImages[i].imageId)
+                                    let image    = UIImage(contentsOfFile: imageURL.path)
+                                    let save = UserDefaults.standard.bool(forKey: "saveToGallery")
+                                    if save {
+                                        UIImageWriteToSavedPhotosAlbum(image!, nil, nil, nil)
+                                    }
+                                }
+                                DispatchQueue.main.async { [self] in
+                                    let section = dataDates.firstIndex(of: dataMessages[index]["chat_date"] as! String)
+                                    let row = dataMessages.filter({$0["chat_date"] as! String == dataMessages[index]["chat_date"] as! String}).firstIndex(where: { $0["message_id"] as? String == message_id})
+                                    if row != nil && section != nil{
+                                        tableChatView.reloadRows(at: [IndexPath(row: row!, section: section!)], with: .none)
+                                    }
+                                }
                             }
                         }
-                        DispatchQueue.main.async { [self] in
-                            let section = dataDates.firstIndex(of: dataMessages[index]["chat_date"] as! String)
-                            let row = dataMessages.filter({$0["chat_date"] as! String == dataMessages[index]["chat_date"] as! String}).firstIndex(where: { $0["message_id"] as? String == message_id})
-                            if row != nil && section != nil{
-                                tableChatView.reloadRows(at: [IndexPath(row: row!, section: section!)], with: .none)
+                    } else {
+                        Download().startHTTP(forKey:dataMessages[index]["image_id"] as! String) { (name, progress) in
+                            guard progress == 100 else {
+                                return
+                            }
+                            let nsDocumentDirectory = FileManager.SearchPathDirectory.documentDirectory
+                            let nsUserDomainMask = FileManager.SearchPathDomainMask.userDomainMask
+                            let paths = NSSearchPathForDirectoriesInDomains(nsDocumentDirectory, nsUserDomainMask, true)
+                            if let dirPath = paths.first {
+                                let imageURL = URL(fileURLWithPath: dirPath).appendingPathComponent(self.dataMessages[index]["image_id"] as! String)
+                                let image    = UIImage(contentsOfFile: imageURL.path)
+                                let save = UserDefaults.standard.bool(forKey: "saveToGallery")
+                                if save {
+                                    UIImageWriteToSavedPhotosAlbum(image!, nil, nil, nil)
+                                }
+                            }
+                            DispatchQueue.main.async { [self] in
+                                let section = dataDates.firstIndex(of: dataMessages[index]["chat_date"] as! String)
+                                let row = dataMessages.filter({$0["chat_date"] as! String == dataMessages[index]["chat_date"] as! String}).firstIndex(where: { $0["message_id"] as? String == message_id})
+                                if row != nil && section != nil{
+                                    tableChatView.reloadRows(at: [IndexPath(row: row!, section: section!)], with: .none)
+                                }
                             }
                         }
                     }

+ 18 - 1
appbuilder-ios/DigiXLite/DigiXLite/Source/ListGroupImages.swift → appbuilder-ios/DigiXLite/DigiXLite/Source/View/Chat/ListGroupImages.swift

@@ -32,6 +32,23 @@ class ListGroupImages: UIViewController, UITableViewDataSource, UITableViewDeleg
         tableViewImages.anchor(top: self.view.safeAreaLayoutGuide.topAnchor, left: self.view.safeAreaLayoutGuide.leftAnchor, bottom: self.view.safeAreaLayoutGuide.bottomAnchor, right: self.view.safeAreaLayoutGuide.rightAnchor)
         
         tableViewImages.scrollToRow(at: IndexPath(row: imageTapped, section: 0), at: .top, animated: false)
+        
+        let center: NotificationCenter = NotificationCenter.default
+        center.addObserver(self, selector: #selector(onStatusChat(notification:)), name: NSNotification.Name(rawValue: Nexilis.listenerStatusChat), object: nil)
+    }
+    
+    @objc func onStatusChat(notification: NSNotification) {
+        DispatchQueue.main.async { [self] in
+            let data:[AnyHashable : Any] = notification.userInfo!
+            if let dataMessage = data["message"] as? TMessage {
+                var messageId = dataMessage.getBody(key: CoreMessage_TMessageKey.MESSAGE_ID)
+                messageId = messageId.contains("-2") ? String(messageId.split(separator: ",")[1]) : messageId
+                if let idx = listGroupingImages.firstIndex(where: { $0.messageId == messageId }) {
+                    listGroupingImages[idx].status = dataMessage.getBody(key: CoreMessage_TMessageKey.STATUS)
+                    tableViewImages.reloadRows(at: [IndexPath(row: idx, section: 0)], with: .none)
+                }
+            }
+        }
     }
     
     func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
@@ -46,7 +63,7 @@ class ListGroupImages: UIViewController, UITableViewDataSource, UITableViewDeleg
         
         let containerImages = UIImageView()
         cell.contentView.addSubview(containerImages)
-        containerImages.anchor(top: cell.contentView.topAnchor, left: cell.contentView.leftAnchor, bottom: cell.contentView.bottomAnchor, right: cell.contentView.rightAnchor, paddingBottom: 15, height: view.bounds.height - 44)
+        containerImages.anchor(top: cell.contentView.topAnchor, left: cell.contentView.leftAnchor, bottom: cell.contentView.bottomAnchor, right: cell.contentView.rightAnchor, paddingBottom: 15, height: UIScreen.main.bounds.height - 104)
         
         let nsDocumentDirectory = FileManager.SearchPathDirectory.documentDirectory
         let nsUserDomainMask = FileManager.SearchPathDomainMask.userDomainMask

+ 0 - 0
appbuilder-ios/DigiXLite/DigiXLite/Source/View/Control/MessageInfo.swift → appbuilder-ios/DigiXLite/DigiXLite/Source/View/Chat/MessageInfo.swift


+ 92 - 30
appbuilder-ios/NexilisLite/NexilisLite/Source/View/Chat/EditorPersonal.swift

@@ -1642,7 +1642,13 @@ public class EditorPersonal: UIViewController, ImageVideoPickerDelegate, UIGestu
                 let idMe = UserDefaults.standard.string(forKey: "me")!
                 if chatData[CoreMessage_TMessageKey.F_PIN] == self.dataPerson["f_pin"]!! || chatData[CoreMessage_TMessageKey.L_PIN] == self.dataPerson["f_pin"]!! || chatData[CoreMessage_TMessageKey.L_PIN] == self.fPinContacCenter || requester == idMe {
                     if (chatData.keys.contains(CoreMessage_TMessageKey.MESSAGE_ID) && !(chatData[CoreMessage_TMessageKey.MESSAGE_ID]!).contains("-2,")) {
-                        let idx = self.dataMessages.firstIndex(where: { $0["message_id"] as? String == chatData[CoreMessage_TMessageKey.MESSAGE_ID]! })
+                        var idx = self.dataMessages.firstIndex(where: { $0["message_id"] as? String == chatData[CoreMessage_TMessageKey.MESSAGE_ID]! })
+                        if let idxMessageIdParent = self.groupImages.firstIndex(where: { $0.value.contains(where: { $0.messageId == chatData[CoreMessage_TMessageKey.MESSAGE_ID]! }) }) {
+                            if let idxInImages = self.groupImages[idxMessageIdParent].value.firstIndex(where: { $0.messageId == chatData[CoreMessage_TMessageKey.MESSAGE_ID]! }) {
+                                self.groupImages[idxMessageIdParent].value[idxInImages].status = chatData[CoreMessage_TMessageKey.STATUS]!
+                            }
+                            idx = self.dataMessages.firstIndex(where: { $0["message_id"] as? String == self.groupImages[idxMessageIdParent].key })
+                        }
                         if (idx != nil) {
                             if (chatData[CoreMessage_TMessageKey.DELETE_MESSAGE_FLAG] == "1") {
                                 self.dataMessages[idx!]["lock"] = "1"
@@ -1672,7 +1678,13 @@ public class EditorPersonal: UIViewController, ImageVideoPickerDelegate, UIGestu
                         }
                     }
                     else if (chatData.keys.contains("message_id")) {
-                        let idx = self.dataMessages.firstIndex(where: { "'\(String(describing: $0["message_id"] as? String))'" == chatData["message_id"]! })
+                        var idx = self.dataMessages.firstIndex(where: { "'\(String(describing: $0["message_id"] as? String))'" == chatData["message_id"]! })
+                        if let idxMessageIdParent = self.groupImages.firstIndex(where: { $0.value.contains(where: { $0.messageId == chatData["message_id"]! }) }) {
+                            if let idxInImages = self.groupImages[idxMessageIdParent].value.firstIndex(where: { $0.messageId == chatData["message_id"]! }) {
+                                self.groupImages[idxMessageIdParent].value[idxInImages].status = chatData[CoreMessage_TMessageKey.STATUS]!
+                            }
+                            idx = self.dataMessages.firstIndex(where: { $0["message_id"] as? String == self.groupImages[idxMessageIdParent].key })
+                        }
                         if (idx != nil) {
                             if (chatData[CoreMessage_TMessageKey.DELETE_MESSAGE_FLAG] == "1") {
                                 self.dataMessages[idx!]["lock"] = "1"
@@ -1703,7 +1715,13 @@ public class EditorPersonal: UIViewController, ImageVideoPickerDelegate, UIGestu
                     }
                     else {
                         let messageId = chatData[CoreMessage_TMessageKey.MESSAGE_ID]!.split(separator: ",")[1]
-                        let idx = self.dataMessages.firstIndex(where: { $0["message_id"] as? String ?? "" == messageId })
+                        var idx = self.dataMessages.firstIndex(where: { $0["message_id"] as? String ?? "" == messageId })
+                        if let idxMessageIdParent = self.groupImages.firstIndex(where: { $0.value.contains(where: { $0.messageId == messageId }) }) {
+                            if let idxInImages = self.groupImages[idxMessageIdParent].value.firstIndex(where: { $0.messageId == messageId }) {
+                                self.groupImages[idxMessageIdParent].value[idxInImages].status = chatData[CoreMessage_TMessageKey.STATUS]!
+                            }
+                            idx = self.dataMessages.firstIndex(where: { $0["message_id"] as? String == self.groupImages[idxMessageIdParent].key })
+                        }
                         if (idx != nil) {
                             self.dataMessages[idx!]["status"] = chatData[CoreMessage_TMessageKey.STATUS]!
                             let section = self.dataDates.firstIndex(of: self.dataMessages[idx!]["chat_date"] as! String)
@@ -2700,41 +2718,85 @@ public class EditorPersonal: UIViewController, ImageVideoPickerDelegate, UIGestu
             return
         }
         DispatchQueue.global().async {
-            Database.shared.database?.inTransaction({ (fmdb, rollback) in
-                _ = Database.shared.updateRecord(fmdb: fmdb, table: "MESSAGE", cvalues: [
-                    "status" : "4"
-                ], _where: "message_id = '\(message_id)'")
-            })
-            message.mStatus = CoreMessage_TMessageUtil.getTID()
-            message.mBodies[CoreMessage_TMessageKey.L_PIN] = f_pin
-            message.mBodies[CoreMessage_TMessageKey.MESSAGE_ID] = "-2,\(message_id)"
-            _ = Nexilis.write(message: message)
+            if let listGroupImages = self.groupImages.first(where: { $0.key == message_id }) {
+                let valueListGroupImages = listGroupImages.value
+                for i in 0..<valueListGroupImages.count {
+                    Database.shared.database?.inTransaction({ (fmdb, rollback) in
+                        _ = Database.shared.updateRecord(fmdb: fmdb, table: "MESSAGE", cvalues: [
+                            "status" : "4"
+                        ], _where: "message_id = '\(valueListGroupImages[i].messageId)'")
+                    })
+                    message.mStatus = CoreMessage_TMessageUtil.getTID()
+                    message.mBodies[CoreMessage_TMessageKey.L_PIN] = f_pin
+                    message.mBodies[CoreMessage_TMessageKey.MESSAGE_ID] = "-2,\(valueListGroupImages[i].messageId)"
+                    _ = Nexilis.write(message: message)
+                }
+            } else {
+                Database.shared.database?.inTransaction({ (fmdb, rollback) in
+                    _ = Database.shared.updateRecord(fmdb: fmdb, table: "MESSAGE", cvalues: [
+                        "status" : "4"
+                    ], _where: "message_id = '\(message_id)'")
+                })
+                message.mStatus = CoreMessage_TMessageUtil.getTID()
+                message.mBodies[CoreMessage_TMessageKey.L_PIN] = f_pin
+                message.mBodies[CoreMessage_TMessageKey.MESSAGE_ID] = "-2,\(message_id)"
+                _ = Nexilis.write(message: message)
+            }
         }
         if let index = dataMessages.firstIndex(where: {$0["message_id"] as? String == message_id}) {
             dataMessages[index]["status"] = "4"
             let auto = UserDefaults.standard.bool(forKey: "autoDownload")
             if auto {
                 if dataMessages[index]["image_id"] as? String != nil && !((dataMessages[index]["image_id"] as? String)!.isEmpty) {
-                    Download().startHTTP(forKey:dataMessages[index]["image_id"] as! String) { (name, progress) in
-                        guard progress == 100 else {
-                            return
-                        }
-                        let nsDocumentDirectory = FileManager.SearchPathDirectory.documentDirectory
-                        let nsUserDomainMask = FileManager.SearchPathDomainMask.userDomainMask
-                        let paths = NSSearchPathForDirectoriesInDomains(nsDocumentDirectory, nsUserDomainMask, true)
-                        if let dirPath = paths.first {
-                            let imageURL = URL(fileURLWithPath: dirPath).appendingPathComponent(self.dataMessages[index]["image_id"] as! String)
-                            let image    = UIImage(contentsOfFile: imageURL.path)
-                            let save = UserDefaults.standard.bool(forKey: "saveToGallery")
-                            if save {
-                                UIImageWriteToSavedPhotosAlbum(image!, nil, nil, nil)
+                    if let listGroupImages = self.groupImages.first(where: { $0.key == message_id }) {
+                        let valueListGroupImages = listGroupImages.value
+                        for i in 0..<valueListGroupImages.count {
+                            Download().startHTTP(forKey:valueListGroupImages[i].imageId) { (name, progress) in
+                                guard progress == 100 else {
+                                    return
+                                }
+                                let nsDocumentDirectory = FileManager.SearchPathDirectory.documentDirectory
+                                let nsUserDomainMask = FileManager.SearchPathDomainMask.userDomainMask
+                                let paths = NSSearchPathForDirectoriesInDomains(nsDocumentDirectory, nsUserDomainMask, true)
+                                if let dirPath = paths.first {
+                                    let imageURL = URL(fileURLWithPath: dirPath).appendingPathComponent(valueListGroupImages[i].imageId)
+                                    let image    = UIImage(contentsOfFile: imageURL.path)
+                                    let save = UserDefaults.standard.bool(forKey: "saveToGallery")
+                                    if save {
+                                        UIImageWriteToSavedPhotosAlbum(image!, nil, nil, nil)
+                                    }
+                                }
+                                DispatchQueue.main.async { [self] in
+                                    let section = dataDates.firstIndex(of: dataMessages[index]["chat_date"] as! String)
+                                    let row = dataMessages.filter({$0["chat_date"] as! String == dataMessages[index]["chat_date"] as! String}).firstIndex(where: { $0["message_id"] as? String == message_id})
+                                    if row != nil && section != nil{
+                                        tableChatView.reloadRows(at: [IndexPath(row: row!, section: section!)], with: .none)
+                                    }
+                                }
                             }
                         }
-                        DispatchQueue.main.async { [self] in
-                            let section = dataDates.firstIndex(of: dataMessages[index]["chat_date"] as! String)
-                            let row = dataMessages.filter({$0["chat_date"] as! String == dataMessages[index]["chat_date"] as! String}).firstIndex(where: { $0["message_id"] as? String == message_id})
-                            if row != nil && section != nil{
-                                tableChatView.reloadRows(at: [IndexPath(row: row!, section: section!)], with: .none)
+                    } else {
+                        Download().startHTTP(forKey:dataMessages[index]["image_id"] as! String) { (name, progress) in
+                            guard progress == 100 else {
+                                return
+                            }
+                            let nsDocumentDirectory = FileManager.SearchPathDirectory.documentDirectory
+                            let nsUserDomainMask = FileManager.SearchPathDomainMask.userDomainMask
+                            let paths = NSSearchPathForDirectoriesInDomains(nsDocumentDirectory, nsUserDomainMask, true)
+                            if let dirPath = paths.first {
+                                let imageURL = URL(fileURLWithPath: dirPath).appendingPathComponent(self.dataMessages[index]["image_id"] as! String)
+                                let image    = UIImage(contentsOfFile: imageURL.path)
+                                let save = UserDefaults.standard.bool(forKey: "saveToGallery")
+                                if save {
+                                    UIImageWriteToSavedPhotosAlbum(image!, nil, nil, nil)
+                                }
+                            }
+                            DispatchQueue.main.async { [self] in
+                                let section = dataDates.firstIndex(of: dataMessages[index]["chat_date"] as! String)
+                                let row = dataMessages.filter({$0["chat_date"] as! String == dataMessages[index]["chat_date"] as! String}).firstIndex(where: { $0["message_id"] as? String == message_id})
+                                if row != nil && section != nil{
+                                    tableChatView.reloadRows(at: [IndexPath(row: row!, section: section!)], with: .none)
+                                }
                             }
                         }
                     }

+ 18 - 1
appbuilder-ios/NexilisLite/NexilisLite/Source/View/Control/ListGroupImages.swift → appbuilder-ios/NexilisLite/NexilisLite/Source/View/Chat/ListGroupImages.swift

@@ -32,6 +32,23 @@ class ListGroupImages: UIViewController, UITableViewDataSource, UITableViewDeleg
         tableViewImages.anchor(top: self.view.safeAreaLayoutGuide.topAnchor, left: self.view.safeAreaLayoutGuide.leftAnchor, bottom: self.view.safeAreaLayoutGuide.bottomAnchor, right: self.view.safeAreaLayoutGuide.rightAnchor)
         
         tableViewImages.scrollToRow(at: IndexPath(row: imageTapped, section: 0), at: .top, animated: false)
+        
+        let center: NotificationCenter = NotificationCenter.default
+        center.addObserver(self, selector: #selector(onStatusChat(notification:)), name: NSNotification.Name(rawValue: Nexilis.listenerStatusChat), object: nil)
+    }
+    
+    @objc func onStatusChat(notification: NSNotification) {
+        DispatchQueue.main.async { [self] in
+            let data:[AnyHashable : Any] = notification.userInfo!
+            if let dataMessage = data["message"] as? TMessage {
+                var messageId = dataMessage.getBody(key: CoreMessage_TMessageKey.MESSAGE_ID)
+                messageId = messageId.contains("-2") ? String(messageId.split(separator: ",")[1]) : messageId
+                if let idx = listGroupingImages.firstIndex(where: { $0.messageId == messageId }) {
+                    listGroupingImages[idx].status = dataMessage.getBody(key: CoreMessage_TMessageKey.STATUS)
+                    tableViewImages.reloadRows(at: [IndexPath(row: idx, section: 0)], with: .none)
+                }
+            }
+        }
     }
     
     func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
@@ -46,7 +63,7 @@ class ListGroupImages: UIViewController, UITableViewDataSource, UITableViewDeleg
         
         let containerImages = UIImageView()
         cell.contentView.addSubview(containerImages)
-        containerImages.anchor(top: cell.contentView.topAnchor, left: cell.contentView.leftAnchor, bottom: cell.contentView.bottomAnchor, right: cell.contentView.rightAnchor, paddingBottom: 15, height: view.bounds.height - 44)
+        containerImages.anchor(top: cell.contentView.topAnchor, left: cell.contentView.leftAnchor, bottom: cell.contentView.bottomAnchor, right: cell.contentView.rightAnchor, paddingBottom: 15, height: UIScreen.main.bounds.height - 104)
         
         let nsDocumentDirectory = FileManager.SearchPathDirectory.documentDirectory
         let nsUserDomainMask = FileManager.SearchPathDomainMask.userDomainMask

+ 0 - 0
appbuilder-ios/NexilisLite/NexilisLite/Source/View/Control/MessageInfo.swift → appbuilder-ios/NexilisLite/NexilisLite/Source/View/Chat/MessageInfo.swift