Browse Source

update fix bugs

alqindiirsyam 2 years ago
parent
commit
1b7562a174
20 changed files with 210 additions and 37 deletions
  1. 1 0
      appbuilder-ios/AppBuilder/AppBuilder/AppDelegate.swift
  2. 36 2
      appbuilder-ios/AppBuilder/AppBuilder/FirstTabViewController.swift
  3. 3 0
      appbuilder-ios/AppBuilder/AppBuilder/FourthTabViewController.swift
  4. 13 3
      appbuilder-ios/AppBuilder/AppBuilder/SecondTabViewController.swift
  5. 36 3
      appbuilder-ios/AppBuilder/AppBuilder/ThirdTabViewController.swift
  6. 9 1
      appbuilder-ios/AppBuilder/AppBuilder/ViewController.swift
  7. 2 0
      appbuilder-ios/NexilisLite/NexilisLite/Resource/id.lproj/Localizable.strings
  8. 9 2
      appbuilder-ios/NexilisLite/NexilisLite/Source/Nexilis.swift
  9. 11 0
      appbuilder-ios/NexilisLite/NexilisLite/Source/View/Call/QmeraAudioViewController.swift
  10. 2 2
      appbuilder-ios/NexilisLite/NexilisLite/Source/View/Call/QmeraCallContactViewController.swift
  11. 1 1
      appbuilder-ios/NexilisLite/NexilisLite/Source/View/Chat/EditorGroup.swift
  12. 48 3
      appbuilder-ios/NexilisLite/NexilisLite/Source/View/Chat/EditorPersonal.swift
  13. 2 2
      appbuilder-ios/NexilisLite/NexilisLite/Source/View/Contact/ContactCallViewController.swift
  14. 5 4
      appbuilder-ios/NexilisLite/NexilisLite/Source/View/Control/AddFriendTableViewController.swift
  15. 2 2
      appbuilder-ios/NexilisLite/NexilisLite/Source/View/Control/BroadcastMembersTableViewController.swift
  16. 2 2
      appbuilder-ios/NexilisLite/NexilisLite/Source/View/Control/ContactChatViewController.swift
  17. 22 4
      appbuilder-ios/NexilisLite/NexilisLite/Source/View/Control/GroupDetailViewController.swift
  18. 2 2
      appbuilder-ios/NexilisLite/NexilisLite/Source/View/Control/GroupMemberViewController.swift
  19. 2 2
      appbuilder-ios/NexilisLite/NexilisLite/Source/View/Streaming/QmeraGroupChooserViewController.swift
  20. 2 2
      appbuilder-ios/NexilisLite/NexilisLite/Source/View/Streaming/QmeraUserChooserViewController.swift

+ 1 - 0
appbuilder-ios/AppBuilder/AppBuilder/AppDelegate.swift

@@ -191,6 +191,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
     }
 
     func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
+        Nexilis.destroyAll()
         // Called when the user discards a scene session.
         // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
         // Use this method to release any resources that were specific to the discarded scenes, as they will not return.

+ 36 - 2
appbuilder-ios/AppBuilder/AppBuilder/FirstTabViewController.swift

@@ -116,6 +116,40 @@ class FirstTabViewController: UIViewController, UIScrollViewDelegate, UIGestureR
         navigationController?.setNavigationBarHidden(!isBurger, animated: false)
     }
     
+    override func viewDidAppear(_ animated: Bool) {
+        if self.isUsingMyWebview() && self.webView.url != nil && !self.webView.url!.absoluteString.contains("nexilis/pages/tab1-main-only") && !self.webView.url!.absoluteString.contains("nexilis/pages/tab3-main-only") && !self.webView.url!.absoluteString.contains("nexilis/pages/tab1-main") && !self.webView.url!.absoluteString.contains("nexilis/pages/tab3-commerce") && !self.webView.url!.absoluteString.contains("nexilis/pages/tab1-video") && !self.webView.url!.absoluteString.contains("nexilis/pages/tab3-main") {
+            ViewController.alwaysHideButton = true
+            self.hideTabBar()
+            ThirdTabViewController.atFirstPage = false
+        } else {
+            DispatchQueue.main.asyncAfter(deadline: .now() + 0.2, execute: {
+                var viewController = UIApplication.shared.windows.first!.rootViewController
+                if !(viewController is ViewController) {
+                    viewController = self.parent
+                }
+                if ViewController.middleButton.isHidden {
+                    ViewController.isExpandButton = false
+                    if let viewController = viewController as? ViewController {
+                        if viewController.tabBar.isHidden {
+                            viewController.tabBar.isHidden = false
+                            ViewController.middleButton.isHidden = false
+                            ViewController.alwaysHideButton = false
+                        }
+                    }
+                } else if PrefsUtil.getCpaasMode() != PrefsUtil.CPAAS_MODE_DOCKED {
+                    DispatchQueue.main.async {
+                        if let viewController = viewController as? ViewController {
+                            if viewController.tabBar.isHidden {
+                                viewController.tabBar.isHidden = false
+                                ViewController.alwaysHideButton = false
+                            }
+                        }
+                    }
+                }
+            })
+        }
+    }
+    
     @objc func onShowAC(notification: NSNotification) {
         self.webView.evaluateJavaScript("{if(pauseAll){pauseAll();}}")
         view.endEditing(true)
@@ -235,7 +269,7 @@ class FirstTabViewController: UIViewController, UIScrollViewDelegate, UIGestureR
                 return
             }
             if !param1 {
-                self.webView.evaluateJavaScript("closeModal(true);")
+//                self.webView.evaluateJavaScript("closeModal(true);")
             }
         } else if message.name == "toggleVoiceSearch" {
             if !isAllowSpeech {
@@ -476,7 +510,7 @@ extension FirstTabViewController: WKUIDelegate, WKNavigationDelegate {
             if let urlStr = navigationAction.request.url?.absoluteString {
                 print("url: \(urlStr)")
                 collapseDocked()
-                if urlStr.contains("nexilis/pages/tab1-main-only") || urlStr.contains("nexilis/pages/tab3-main-only") || urlStr.contains("nexilis/pages/tab1-main") || urlStr.contains("nexilis/pages/tab3-commerce") || urlStr.contains("nexilis/pages/tab1-video") {
+                if urlStr.contains("nexilis/pages/tab1-main-only") || urlStr.contains("nexilis/pages/tab3-main-only") || urlStr.contains("nexilis/pages/tab1-main") || urlStr.contains("nexilis/pages/tab3-commerce") || urlStr.contains("nexilis/pages/tab1-video") || urlStr.contains("nexilis/pages/tab3-main") {
                     ViewController.alwaysHideButton = false
                     showTabBar()
                 } else if isUsingMyWebview() {

+ 3 - 0
appbuilder-ios/AppBuilder/AppBuilder/FourthTabViewController.swift

@@ -258,6 +258,9 @@ public class FourthTabViewController: UIViewController, UITableViewDelegate, UIT
     }
     
     override public func viewWillAppear(_ animated: Bool) {
+        tabBarController?.navigationItem.leftBarButtonItem = nil
+        tabBarController?.navigationItem.searchController = nil
+        tabBarController?.navigationItem.rightBarButtonItem = nil
         backgroundImage.backgroundColor = .white
         backgroundImage.image = nil
         DispatchQueue.global().async {

+ 13 - 3
appbuilder-ios/AppBuilder/AppBuilder/SecondTabViewController.swift

@@ -58,7 +58,7 @@ class SecondTabViewController: UIViewController, UIScrollViewDelegate, UIGesture
     var fillteredData: [Any] = []
     
     var isSearchBarEmpty: Bool {
-        return searchController.searchBar.text?.isEmpty ?? true
+        return searchController.searchBar.text!.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty
     }
     
     var isFilltering: Bool {
@@ -337,7 +337,11 @@ class SecondTabViewController: UIViewController, UIScrollViewDelegate, UIGesture
             segment.setTitle("Chats".localized(), forSegmentAt: 0)
             segment.setTitle("Groups".localized(), forSegmentAt: 1)
         }
-        searchController.searchBar.placeholder = "Search chats & messages".localized()
+        if segment.selectedSegmentIndex == 0 {
+            searchController.searchBar.placeholder = "Search chats & messages".localized()
+        } else {
+            searchController.searchBar.placeholder = "Search groups name".localized()
+        }
         removeAllData()
         getData()
     }
@@ -376,6 +380,12 @@ class SecondTabViewController: UIViewController, UIScrollViewDelegate, UIGesture
     }
     
     @objc func segmentChanged(sender: Any) {
+        switch segment.selectedSegmentIndex {
+        case 1:
+            searchController.searchBar.placeholder = "Search groups name".localized()
+        default:
+            searchController.searchBar.placeholder = "Search chats & messages".localized()
+        }
         filterContentForSearchText(searchController.searchBar.text!)
     }
     
@@ -1081,7 +1091,7 @@ extension SecondTabViewController: UITableViewDelegate, UITableViewDataSource {
 extension SecondTabViewController: UISearchControllerDelegate, UISearchBarDelegate, UISearchResultsUpdating {
     
     func updateSearchResults(for searchController: UISearchController) {
-        filterContentForSearchText(searchController.searchBar.text!)
+        filterContentForSearchText(searchController.searchBar.text!.trimmingCharacters(in: .whitespacesAndNewlines))
     }
     
     func searchBarBookmarkButtonClicked(_ searchBar: UISearchBar) {

+ 36 - 3
appbuilder-ios/AppBuilder/AppBuilder/ThirdTabViewController.swift

@@ -124,6 +124,40 @@ class ThirdTabViewController: UIViewController, UIScrollViewDelegate, UIGestureR
         navigationController?.setNavigationBarHidden(!isBurger, animated: false)
     }
     
+    override func viewDidAppear(_ animated: Bool) {
+        DispatchQueue.main.asyncAfter(deadline: .now() + 0.2, execute: {
+            if self.isUsingMyWebview() && self.webView.url != nil && !self.webView.url!.absoluteString.contains("nexilis/pages/tab1-main-only") && !self.webView.url!.absoluteString.contains("nexilis/pages/tab3-main-only") && !self.webView.url!.absoluteString.contains("nexilis/pages/tab1-main") && !self.webView.url!.absoluteString.contains("nexilis/pages/tab3-commerce") && !self.webView.url!.absoluteString.contains("nexilis/pages/tab1-video") && !self.webView.url!.absoluteString.contains("nexilis/pages/tab3-main") {
+                ViewController.alwaysHideButton = true
+                self.hideTabBar()
+                ThirdTabViewController.atFirstPage = false
+            } else {
+                var viewController = UIApplication.shared.windows.first!.rootViewController
+                if !(viewController is ViewController) {
+                    viewController = self.parent
+                }
+                if ViewController.middleButton.isHidden {
+                    ViewController.isExpandButton = false
+                    if let viewController = viewController as? ViewController {
+                        if viewController.tabBar.isHidden {
+                            viewController.tabBar.isHidden = false
+                            ViewController.middleButton.isHidden = false
+                            ViewController.alwaysHideButton = false
+                        }
+                    }
+                } else if PrefsUtil.getCpaasMode() != PrefsUtil.CPAAS_MODE_DOCKED {
+                    DispatchQueue.main.async {
+                        if let viewController = viewController as? ViewController {
+                            if viewController.tabBar.isHidden {
+                                viewController.tabBar.isHidden = false
+                                ViewController.alwaysHideButton = false
+                            }
+                        }
+                    }
+                }
+            }
+        })
+    }
+    
     @objc func onShowAC(notification: NSNotification) {
         self.webView.evaluateJavaScript("{if(pauseAll){pauseAll();}}")
         view.endEditing(true)
@@ -248,7 +282,7 @@ class ThirdTabViewController: UIViewController, UIScrollViewDelegate, UIGestureR
                 return
             }
             if !param1 {
-                self.webView.evaluateJavaScript("closeModal(true);")
+//                self.webView.evaluateJavaScript("closeModal(true);")
             }
         } else if message.name == "toggleVoiceSearch" {
             if !isAllowSpeech {
@@ -488,9 +522,8 @@ extension ThirdTabViewController: WKUIDelegate {
       func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
 
             if let urlStr = navigationAction.request.url?.absoluteString {
-                print("kacau \(urlStr)")
                 collapseDocked()
-                if urlStr.contains("nexilis/pages/tab1-main-only") || urlStr.contains("nexilis/pages/tab3-main-only") || urlStr.contains("nexilis/pages/tab1-main") || urlStr.contains("nexilis/pages/tab3-commerce") || urlStr.contains("nexilis/pages/tab1-video") {
+                if urlStr.contains("nexilis/pages/tab1-main-only") || urlStr.contains("nexilis/pages/tab3-main-only") || urlStr.contains("nexilis/pages/tab1-main") || urlStr.contains("nexilis/pages/tab3-commerce") || urlStr.contains("nexilis/pages/tab1-video") || urlStr.contains("nexilis/pages/tab3-main") {
                     ViewController.alwaysHideButton = false
                     showTabBar()
                 } else if isUsingMyWebview() {

+ 9 - 1
appbuilder-ios/AppBuilder/AppBuilder/ViewController.swift

@@ -383,7 +383,15 @@ class ViewController: UITabBarController, UITabBarControllerDelegate, SettingMAB
     }
     
     func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
-        print("select tabbar")
+        if viewController != secondTab {
+            let idxTabChat = self.viewControllers?.firstIndex(where: {$0 == secondTab})
+            if idxTabChat != nil {
+                let vcTabChats = self.viewControllers![idxTabChat!] as! SecondTabViewController
+                if vcTabChats.searchController.isActive {
+                    vcTabChats.searchController.isActive = false
+                }
+            }
+        }
         let cpaasMode = PrefsUtil.getCpaasMode()
         var childrenMenu = [UIAction]()
         if(cpaasMode == PrefsUtil.CPAAS_MODE_BURGER){

+ 2 - 0
appbuilder-ios/NexilisLite/NexilisLite/Resource/id.lproj/Localizable.strings

@@ -190,3 +190,5 @@
 "of" = "dari";
 "matches" = "cocok";
 "Not found" = "Tidak ditemukan";
+"Suggestions" = "Saran";
+"Search groups name" = "Cari nama grup";

+ 9 - 2
appbuilder-ios/NexilisLite/NexilisLite/Source/Nexilis.swift

@@ -133,8 +133,15 @@ public class Nexilis: NSObject {
             }
             
             if let me = UserDefaults.standard.string(forKey: "me") {
-                if Utils.getForceAnonymous() {
-                    _ = Nexilis.write(message: CoreMessage_TMessageBank.getPostRegistration(p_pin: me))
+                if Utils.getForceAnonymous() || (!Utils.getForceAnonymous() && Utils.getSetProfile()) {
+                    Database.shared.database?.inTransaction({ (fmdb, rollback) in
+                        if let cursorData = Database.shared.getRecords(fmdb: fmdb, query: "SELECT * FROM BUDDY where f_pin = '\(me)' ") {
+                            if !cursorData.next() {
+                                _ = Nexilis.write(message: CoreMessage_TMessageBank.getPostRegistration(p_pin: me))
+                            }
+                            cursorData.close()
+                        }
+                    })
                     DispatchQueue.global().asyncAfter(deadline: .now() + 1.5, execute: {
                         Database.shared.database?.inTransaction({ (fmdb, rollback) in
                             if let cursorData = Database.shared.getRecords(fmdb: fmdb, query: "SELECT image_id FROM GROUPZ where group_type = 1 AND official = 1"), cursorData.next() {

+ 11 - 0
appbuilder-ios/NexilisLite/NexilisLite/Source/View/Call/QmeraAudioViewController.swift

@@ -621,6 +621,17 @@ class QmeraAudioViewController: UIViewController {
                             self.didEnd(sender: true)
                         }
                         return
+                    } else {
+                        DispatchQueue.main.async {
+                            self.timer?.invalidate()
+                            self.timer = nil
+                            self.status.text = "Audio Call Ended"
+                            self.end.isEnabled = false
+                        }
+                        DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
+                            self.didEnd(sender: true)
+                        }
+                        return
                     }
                 }
                 if users.count == 0 {

+ 2 - 2
appbuilder-ios/NexilisLite/NexilisLite/Source/View/Call/QmeraCallContactViewController.swift

@@ -23,7 +23,7 @@ class QmeraCallContactViewController: UITableViewController {
     private var fillteredUser: [User] = []
     
     private var isSearchBarEmpty: Bool {
-        return searchController.searchBar.text?.isEmpty ?? true
+        return searchController.searchBar.text!.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty
     }
     
     private var isFilltering: Bool {
@@ -219,7 +219,7 @@ class QmeraCallContactViewController: UITableViewController {
 extension QmeraCallContactViewController: UISearchControllerDelegate, UISearchBarDelegate, UISearchResultsUpdating {
     
     func updateSearchResults(for searchController: UISearchController) {
-        filterContentForSearchText(searchController.searchBar.text!)
+        filterContentForSearchText(searchController.searchBar.text!.trimmingCharacters(in: .whitespacesAndNewlines))
     }
     
     func set(image: UIImage, with text: String, size: CGFloat, y: CGFloat) -> NSAttributedString {

+ 1 - 1
appbuilder-ios/NexilisLite/NexilisLite/Source/View/Chat/EditorGroup.swift

@@ -3945,7 +3945,7 @@ extension EditorGroup: UITableViewDelegate, UITableViewDataSource {
 extension EditorGroup: UISearchBarDelegate {
     
     public func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
-        textSearch = searchText
+        textSearch = searchText.trimmingCharacters(in: .whitespacesAndNewlines)
         countMatchesSearch = 0
         titleSearchMatches.isHidden = true
         tableChatView.reloadData()

+ 48 - 3
appbuilder-ios/NexilisLite/NexilisLite/Source/View/Chat/EditorPersonal.swift

@@ -226,7 +226,48 @@ public class EditorPersonal: UIViewController, ImageVideoPickerDelegate, UIGestu
     
     private func setRightButtonItem() {
         navigationItem.rightBarButtonItems = nil
-        var menu = UIMenu()
+        var menu = UIMenu(title: "", children: [
+            UIAction(title: "Search".localized(), handler: {(_) in
+                self.isSearching = true
+                if self.reffId != nil {
+                    self.deleteReplyView()
+                }
+                DispatchQueue.main.asyncAfter(deadline: .now() + 0.35) {
+                    let cancelButton = UIBarButtonItem(title: "Cancel".localized(), style: .plain, target: self, action: #selector(self.cancelAction))
+                    if self.dataPerson["f_pin"] != "-999" && !self.isContactCenter {
+                        self.navigationItem.rightBarButtonItems = nil
+                    }
+                    self.navigationItem.rightBarButtonItem = cancelButton
+                    if self.isContactCenter || self.fromNotification {
+                        self.navigationItem.leftBarButtonItem = nil
+                    }
+                    self.changeAppBar()
+                    self.addMultipleSelectSession()
+                }
+            }),
+            UIAction(title: "Delete Conversation".localized(), handler: {(_) in
+                if !self.isContactCenter {
+                    let alert = UIAlertController(title: "", message: "Are you sure to delete all message in this conversation?".localized(), preferredStyle: .alert)
+                    alert.addAction(UIAlertAction(title: "Cancel".localized(), style: UIAlertAction.Style.default, handler: nil))
+                    alert.addAction(UIAlertAction(title: "Delete".localized(), style: .destructive, handler: {(_) in
+                        Database.shared.database?.inTransaction({ (fmdb, rollback) in
+                            _ = Database.shared.deleteRecord(fmdb: fmdb, table: "MESSAGE", _where: "(f_pin='\(self.dataPerson["f_pin"]!!)' or l_pin='\(self.dataPerson["f_pin"]!!)') and (message_scope_id='3' or message_scope_id='18') and is_call_center = 0")
+                            _ = Database.shared.deleteRecord(fmdb: fmdb, table: "MESSAGE_SUMMARY", _where: "l_pin='\(self.dataPerson["f_pin"]!!)'")
+                        })
+                        NotificationCenter.default.post(name: NSNotification.Name(rawValue: "reloadTabChats"), object: nil, userInfo: nil)
+                        if self.fromNotification {
+                            self.didTapExit()
+                        } else {
+                            self.navigationController?.popViewController(animated: true)
+                        }
+//                        self.dataMessages.removeAll()
+//                        self.dataDates.removeAll()
+//                        self.tableChatView.reloadData()
+                    }))
+                    self.present(alert, animated: true, completion: nil)
+                }
+            })
+        ])
         let exblock = User.getData(pin: self.dataPerson["f_pin"]!!)?.ex_block
         blocking = exblock == nil ? "0" : exblock!.isEmpty ? "0" : exblock!
         if blocking == "1" && self.dataPerson["f_pin"]!! != "-999" {
@@ -3084,7 +3125,10 @@ extension EditorPersonal: UIContextMenuInteractionDelegate {
             if self.viewAttachment.isHidden {
                 self.viewAttachment.isHidden = false
             }
-            if !self.isSearching {
+            if self.containerAction.isHidden {
+                self.containerAction.isHidden = false
+            }
+            if !self.isSearching && (self.copySession || self.forwardSession || self.deleteSession){
                 self.constraintBottomTableViewWithTextfield.constant = self.constraintBottomTableViewWithTextfield.constant + 70
                 DispatchQueue.main.asyncAfter(deadline: .now() + 0.3, execute: {
                     if (self.currentIndexpath != nil) {
@@ -3116,6 +3160,7 @@ extension EditorPersonal: UIContextMenuInteractionDelegate {
     private func addMultipleSelectSession() {
         viewTextfield.isHidden = true
         viewAttachment.isHidden = true
+        containerAction.isHidden = true
         constraintBottomTableViewWithTextfield.constant = constraintBottomTableViewWithTextfield.constant - 70
         view.addSubview(containerMultpileSelectSession)
         containerMultpileSelectSession.translatesAutoresizingMaskIntoConstraints = false
@@ -5320,7 +5365,7 @@ extension UIImage {
 extension EditorPersonal: UISearchBarDelegate {
     
     public func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
-        textSearch = searchText
+        textSearch = searchText.trimmingCharacters(in: .whitespacesAndNewlines)
         countMatchesSearch = 0
         titleSearchMatches.isHidden = true
         tableChatView.reloadData()

+ 2 - 2
appbuilder-ios/NexilisLite/NexilisLite/Source/View/Contact/ContactCallViewController.swift

@@ -20,7 +20,7 @@ class ContactCallViewController: UIViewController {
     var isDismiss: (([String: String?]) -> ())?
     var searchController: UISearchController!
     var isSearchBarEmpty: Bool {
-        return searchController.searchBar.text?.isEmpty ?? true
+        return searchController.searchBar.text!.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty
     }
     var isFilltering: Bool {
         return searchController.isActive && !isSearchBarEmpty
@@ -284,6 +284,6 @@ extension ContactCallViewController {
 extension ContactCallViewController: UISearchControllerDelegate, UISearchBarDelegate, UISearchResultsUpdating {
     
     func updateSearchResults(for searchController: UISearchController) {
-        filterContentForSearchText(searchController.searchBar.text!)
+        filterContentForSearchText(searchController.searchBar.text!.trimmingCharacters(in: .whitespacesAndNewlines))
     }
 }

+ 5 - 4
appbuilder-ios/NexilisLite/NexilisLite/Source/View/Control/AddFriendTableViewController.swift

@@ -16,7 +16,7 @@ class AddFriendTableViewController: UITableViewController {
     var fillteredData: [User] = []
     
     var isSearchBarEmpty: Bool {
-        return searchController.searchBar.text?.isEmpty ?? true
+        return searchController.searchBar.text!.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty
     }
     
     var isFilltering: Bool {
@@ -48,7 +48,7 @@ class AddFriendTableViewController: UITableViewController {
         
         navigationController?.navigationBar.prefersLargeTitles = true
         
-        navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(cancel(sender:)))
+        navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Cancel".localized(), style: .plain, target: self, action: #selector(cancel(sender:)))
         
         searchController = UISearchController(searchResultsController: nil)
         searchController.delegate = self
@@ -56,6 +56,7 @@ class AddFriendTableViewController: UITableViewController {
         searchController.searchBar.autocapitalizationType = .none
         searchController.searchBar.delegate = self
         searchController.obscuresBackgroundDuringPresentation = false
+        searchController.searchBar.placeholder = "Search".localized()
         
         definesPresentationContext = true
         
@@ -126,7 +127,7 @@ class AddFriendTableViewController: UITableViewController {
     // MARK: - Table view data source
     
     override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
-        return "Suggestions"
+        return "Suggestions".localized()
     }
     
     override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
@@ -185,7 +186,7 @@ class AddFriendTableViewController: UITableViewController {
 extension AddFriendTableViewController: UISearchControllerDelegate, UISearchBarDelegate, UISearchResultsUpdating {
     
     func updateSearchResults(for searchController: UISearchController) {
-        filterContentForSearchText(searchController.searchBar.text!)
+        filterContentForSearchText(searchController.searchBar.text!.trimmingCharacters(in: .whitespacesAndNewlines))
     }
     
 }

+ 2 - 2
appbuilder-ios/NexilisLite/NexilisLite/Source/View/Control/BroadcastMembersTableViewController.swift

@@ -10,7 +10,7 @@ import FMDB
 
 class BroadcastMembersTableViewController: UITableViewController, UISearchControllerDelegate, UISearchResultsUpdating, UISearchBarDelegate {
     func updateSearchResults(for searchController: UISearchController) {
-        filterContentForSearchText(searchController.searchBar.text!)
+        filterContentForSearchText(searchController.searchBar.text!.trimmingCharacters(in: .whitespacesAndNewlines))
     }
     
     
@@ -27,7 +27,7 @@ class BroadcastMembersTableViewController: UITableViewController, UISearchContro
     var fillteredData: [Any] = []
     
     var isSearchBarEmpty: Bool {
-        return searchController.searchBar.text?.isEmpty ?? true
+        return searchController.searchBar.text!.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty
     }
     
     var isFilltering: Bool {

+ 2 - 2
appbuilder-ios/NexilisLite/NexilisLite/Source/View/Control/ContactChatViewController.swift

@@ -36,7 +36,7 @@ class ContactChatViewController: UITableViewController {
     var fillteredData: [Any] = []
     
     var isSearchBarEmpty: Bool {
-        return searchController.searchBar.text?.isEmpty ?? true
+        return searchController.searchBar.text!.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty
     }
     
     var isFilltering: Bool {
@@ -977,7 +977,7 @@ extension ContactChatViewController {
 extension ContactChatViewController: UISearchControllerDelegate, UISearchBarDelegate, UISearchResultsUpdating {
     
     func updateSearchResults(for searchController: UISearchController) {
-        filterContentForSearchText(searchController.searchBar.text!)
+        filterContentForSearchText(searchController.searchBar.text!.trimmingCharacters(in: .whitespacesAndNewlines))
     }
     
     func set(image: UIImage, with text: String, size: CGFloat, y: CGFloat) -> NSAttributedString {

+ 22 - 4
appbuilder-ios/NexilisLite/NexilisLite/Source/View/Control/GroupDetailViewController.swift

@@ -910,20 +910,26 @@ extension GroupDetailViewController: ImageVideoPickerDelegate {
     
     func didSelect(imagevideo: Any?) {
         if let info = imagevideo as? [UIImagePickerController.InfoKey: Any], let cell = tableView.cellForRow(at: IndexPath(row: 0, section: 0)) as? ProfileCell, let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
-            
+            if !CheckConnection.isConnectedToNetwork()  || API.nGetCLXConnState() == 0 {
+                let imageView = UIImageView(image: UIImage(systemName: "xmark.circle.fill"))
+                imageView.tintColor = .white
+                let banner = FloatingNotificationBanner(title: "Check your connection".localized(), subtitle: nil, titleFont: UIFont.systemFont(ofSize: 16), titleColor: nil, titleTextAlign: .left, subtitleFont: nil, subtitleColor: nil, subtitleTextAlign: nil, leftView: imageView, rightView: nil, style: .danger, colors: nil, iconPosition: .center)
+                banner.show()
+                return
+            }
             guard let g = group else {
                 return
             }
             
-            self.tempImage = image
-            cell.profile.image = self.tempImage
-            
             DispatchQueue.global().async {
                 let resize = image.resize(target: CGSize(width: 800, height: 600))
                 let documentDir = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
                 let fileDir = documentDir.appendingPathComponent("THUMB_\(g.id)\(Date().currentTimeMillis().toHex())")
                 if !FileManager.default.fileExists(atPath: fileDir.path), let data = resize.jpegData(compressionQuality: 0.8) {
                     try! data.write(to: fileDir)
+                    DispatchQueue.main.async {
+                        Nexilis.showLoader()
+                    }
                     Network().upload(name: fileDir.lastPathComponent) { result, progress in
                         guard result, progress == 100 else {
                             return
@@ -931,7 +937,19 @@ extension GroupDetailViewController: ImageVideoPickerDelegate {
                         if let response = Nexilis.writeAndWait(message: CoreMessage_TMessageBank.getChangeGroupInfo(p_group_id: g.id, p_thumb_id: fileDir.lastPathComponent)), response.isOk() {
                             Database.shared.database?.inTransaction({ fmdb, rollback in
                                 _ = Database.shared.updateRecord(fmdb: fmdb, table: "GROUPZ", cvalues: ["image_id": fileDir.lastPathComponent], _where: "group_id = '\(g.id)'")
+                                DispatchQueue.main.async {
+                                    Nexilis.hideLoader()
+                                    self.tempImage = image
+                                    cell.profile.image = self.tempImage
+                                }
                             })
+                        } else {
+                            DispatchQueue.main.async {
+                                let imageView = UIImageView(image: UIImage(systemName: "xmark.circle.fill"))
+                                imageView.tintColor = .white
+                                let banner = FloatingNotificationBanner(title: "Unable to access servers".localized(), subtitle: nil, titleFont: UIFont.systemFont(ofSize: 16), titleColor: nil, titleTextAlign: .left, subtitleFont: nil, subtitleColor: nil, subtitleTextAlign: nil, leftView: imageView, rightView: nil, style: .danger, colors: nil, iconPosition: .top)
+                                banner.show()
+                            }
                         }
                     }
                 }

+ 2 - 2
appbuilder-ios/NexilisLite/NexilisLite/Source/View/Control/GroupMemberViewController.swift

@@ -22,7 +22,7 @@ class GroupMemberViewController: UITableViewController {
     private var fillteredUser: [User] = []
     
     private var isSearchBarEmpty: Bool {
-        return searchController.searchBar.text?.isEmpty ?? true
+        return searchController.searchBar.text!.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty
     }
     
     private var isFilltering: Bool {
@@ -211,7 +211,7 @@ class GroupMemberViewController: UITableViewController {
 extension GroupMemberViewController: UISearchControllerDelegate, UISearchBarDelegate, UISearchResultsUpdating {
     
     func updateSearchResults(for searchController: UISearchController) {
-        filterContentForSearchText(searchController.searchBar.text!)
+        filterContentForSearchText(searchController.searchBar.text!.trimmingCharacters(in: .whitespacesAndNewlines))
     }
     
     func set(image: UIImage, with text: String, size: CGFloat, y: CGFloat) -> NSAttributedString {

+ 2 - 2
appbuilder-ios/NexilisLite/NexilisLite/Source/View/Streaming/QmeraGroupChooserViewController.swift

@@ -20,7 +20,7 @@ class QmeraGroupStreamingViewController: UITableViewController {
     private var filltered: [Group] = []
     
     private var isSearchBarEmpty: Bool {
-        return searchController.searchBar.text?.isEmpty ?? true
+        return searchController.searchBar.text!.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty
     }
     
     private var isFilltering: Bool {
@@ -185,7 +185,7 @@ class QmeraGroupStreamingViewController: UITableViewController {
 extension QmeraGroupStreamingViewController: UISearchControllerDelegate, UISearchBarDelegate, UISearchResultsUpdating {
     
     func updateSearchResults(for searchController: UISearchController) {
-        filterContentForSearchText(searchController.searchBar.text!)
+        filterContentForSearchText(searchController.searchBar.text!.trimmingCharacters(in: .whitespacesAndNewlines))
     }
     
 }

+ 2 - 2
appbuilder-ios/NexilisLite/NexilisLite/Source/View/Streaming/QmeraUserChooserViewController.swift

@@ -20,7 +20,7 @@ class QmeraUserChooserViewController: UITableViewController {
     private var fillteredUser: [User] = []
     
     private var isSearchBarEmpty: Bool {
-        return searchController.searchBar.text?.isEmpty ?? true
+        return searchController.searchBar.text!.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty
     }
     
     private var isFilltering: Bool {
@@ -185,7 +185,7 @@ class QmeraUserChooserViewController: UITableViewController {
 extension QmeraUserChooserViewController: UISearchControllerDelegate, UISearchBarDelegate, UISearchResultsUpdating {
     
     func updateSearchResults(for searchController: UISearchController) {
-        filterContentForSearchText(searchController.searchBar.text!)
+        filterContentForSearchText(searchController.searchBar.text!.trimmingCharacters(in: .whitespacesAndNewlines))
     }
     
 }