alqindiirsyam vor 2 Jahren
Ursprung
Commit
cbd7f2839b
23 geänderte Dateien mit 291 neuen und 99 gelöschten Zeilen
  1. 2 2
      appbuilder-ios/AppBuilder/AppBuilder.xcodeproj/project.pbxproj
  2. 4 2
      appbuilder-ios/AppBuilder/AppBuilder/FirstTabViewController.swift
  3. 3 3
      appbuilder-ios/AppBuilder/AppBuilder/FourthTabViewController.swift
  4. 2 1
      appbuilder-ios/AppBuilder/AppBuilder/SecondTabViewController.swift
  5. 4 2
      appbuilder-ios/AppBuilder/AppBuilder/ThirdTabViewController.swift
  6. 10 2
      appbuilder-ios/AppBuilder/AppBuilder/ViewController.swift
  7. 30 21
      appbuilder-ios/NexilisLite/NexilisLite/Resource/Palio.storyboard
  8. 36 3
      appbuilder-ios/NexilisLite/NexilisLite/Resource/id.lproj/Localizable.strings
  9. 17 16
      appbuilder-ios/NexilisLite/NexilisLite/Source/Nexilis.swift
  10. 0 6
      appbuilder-ios/NexilisLite/NexilisLite/Source/View/Call/QmeraAudioViewController.swift
  11. 1 1
      appbuilder-ios/NexilisLite/NexilisLite/Source/View/Call/QmeraVideoViewController.swift
  12. 29 8
      appbuilder-ios/NexilisLite/NexilisLite/Source/View/Chat/EditorPersonal.swift
  13. 15 0
      appbuilder-ios/NexilisLite/NexilisLite/Source/View/Contact/ContactCallViewController.swift
  14. 17 3
      appbuilder-ios/NexilisLite/NexilisLite/Source/View/Control/AddFriendTableViewController.swift
  15. 4 3
      appbuilder-ios/NexilisLite/NexilisLite/Source/View/Control/AudienceViewController.swift
  16. 1 0
      appbuilder-ios/NexilisLite/NexilisLite/Source/View/Control/BroadcastMembersTableViewController.swift
  17. 1 0
      appbuilder-ios/NexilisLite/NexilisLite/Source/View/Control/BroadcastModeViewController.swift
  18. 70 9
      appbuilder-ios/NexilisLite/NexilisLite/Source/View/Control/BroadcastViewController.swift
  19. 7 2
      appbuilder-ios/NexilisLite/NexilisLite/Source/View/Control/GroupCreateViewController.swift
  20. 1 0
      appbuilder-ios/NexilisLite/NexilisLite/Source/View/Control/GroupDescViewController.swift
  21. 4 0
      appbuilder-ios/NexilisLite/NexilisLite/Source/View/Control/GroupDetailViewController.swift
  22. 32 14
      appbuilder-ios/NexilisLite/NexilisLite/Source/View/Control/ProfileViewController.swift
  23. 1 1
      appbuilder-ios/NexilisLite/NexilisLite/Source/View/Control/SignUpSignIn.swift

+ 2 - 2
appbuilder-ios/AppBuilder/AppBuilder.xcodeproj/project.pbxproj

@@ -444,7 +444,7 @@
 					"$(inherited)",
 					"@executable_path/Frameworks",
 				);
-				MARKETING_VERSION = 2.2.3;
+				MARKETING_VERSION = 2.2.4;
 				PRODUCT_BUNDLE_IDENTIFIER = io.newuniverse.AppBuilder;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				PROVISIONING_PROFILE_SPECIFIER = "";
@@ -474,7 +474,7 @@
 					"$(inherited)",
 					"@executable_path/Frameworks",
 				);
-				MARKETING_VERSION = 2.2.3;
+				MARKETING_VERSION = 2.2.4;
 				PRODUCT_BUNDLE_IDENTIFIER = io.newuniverse.AppBuilder;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				PROVISIONING_PROFILE_SPECIFIER = "";

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

@@ -281,8 +281,10 @@ class FirstTabViewController: UIViewController, UIScrollViewDelegate, UIGestureR
                   let param1 = dict["param1"] as? Bool else {
                 return
             }
-            if !param1 {
-//                self.webView.evaluateJavaScript("closeModal(true);")
+            if param1 {
+                if self.webView.scrollView.contentOffset.y < 0 { // Move tableView to top
+                    self.webView.scrollView.setContentOffset(CGPoint.zero, animated: true)
+                }
             }
         } else if message.name == "toggleVoiceSearch" {
             if !isAllowSpeech {

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

@@ -486,9 +486,6 @@ public class FourthTabViewController: UIViewController, UITableViewDelegate, UIT
                     let apiKey = Nexilis.sAPIKey
                     var id = UIDevice.current.identifierForVendor?.uuidString ?? "UNK-DEVICE"
                     if let response = Nexilis.writeSync(message: CoreMessage_TMessageBank.getSignUpApi(api: apiKey, p_pin: id), timeout: 30 * 1000) {
-                        self.deleteAllRecordDatabase()
-                        UserDefaults.standard.removeObject(forKey: "device_id")
-                        Nexilis.destroyAll()
                         id = response.getBody(key: CoreMessage_TMessageKey.F_PIN, default_value: "")
                         if(!id.isEmpty){
                             Nexilis.changeUser(f_pin: id)
@@ -496,6 +493,9 @@ public class FourthTabViewController: UIViewController, UITableViewDelegate, UIT
                             Utils.setProfile(value: false)
                             UserDefaults.standard.synchronize()
                             if Utils.getForceAnonymous() {
+                                self.deleteAllRecordDatabase()
+                                UserDefaults.standard.removeObject(forKey: "device_id")
+                                Nexilis.destroyAll()
                                 _ = Nexilis.write(message: CoreMessage_TMessageBank.getPostRegistration(p_pin: id))
                             }
                             DispatchQueue.main.async {

+ 2 - 1
appbuilder-ios/AppBuilder/AppBuilder/SecondTabViewController.swift

@@ -98,7 +98,7 @@ class SecondTabViewController: UIViewController, UIScrollViewDelegate, UIGesture
         var childrenMenu : [UIAction] = []
         
         if(isAdmin){
-            childrenMenu.append(UIAction(title: "Broadcast Message", image: UIImage(systemName: "envelope.open"), handler: {[weak self](_) in
+            childrenMenu.append(UIAction(title: "Broadcast Message".localized(), image: UIImage(systemName: "envelope.open"), handler: {[weak self](_) in
                 let controller = AppStoryBoard.Palio.instance.instantiateViewController(identifier: "broadcastNav")
                 self?.navigationController?.present(controller, animated: true, completion: nil)
             }))
@@ -907,6 +907,7 @@ extension SecondTabViewController: UITableViewDelegate, UITableViewDataSource {
                 content.addSubview(labelNochat)
                 labelNochat.anchor(centerX: content.centerXAnchor, centerY: content.centerYAnchor)
                 cell.separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: .greatestFiniteMagnitude)
+                cell.backgroundColor = .clear
                 return cell
             }
             let data: Chat

+ 4 - 2
appbuilder-ios/AppBuilder/AppBuilder/ThirdTabViewController.swift

@@ -293,8 +293,10 @@ class ThirdTabViewController: UIViewController, UIScrollViewDelegate, UIGestureR
                   let param1 = dict["param1"] as? Bool else {
                 return
             }
-            if !param1 {
-//                self.webView.evaluateJavaScript("closeModal(true);")
+            if param1 {
+                if self.webView.scrollView.contentOffset.y < 0 { // Move tableView to top
+                    self.webView.scrollView.setContentOffset(CGPoint.zero, animated: true)
+                }
             }
         } else if message.name == "toggleVoiceSearch" {
             if !isAllowSpeech {

+ 10 - 2
appbuilder-ios/AppBuilder/AppBuilder/ViewController.swift

@@ -14,7 +14,7 @@ import Speech
 import Alamofire
 import WebKit
 
-class ViewController: UITabBarController, UITabBarControllerDelegate, SettingMABDelegate {
+class ViewController: UITabBarController, UITabBarControllerDelegate, SettingMABDelegate, WKNavigationDelegate {
     let playerController = AVPlayerViewController()
     static var sURL = "https://www.google.com"
     static var tab3 = "0"
@@ -50,6 +50,7 @@ class ViewController: UITabBarController, UITabBarControllerDelegate, SettingMAB
     let termText = "Read our Terms of Service. Tap \"Agree and Continue\" to accept Terms of Service.".localized()
     let term = "Terms of Service.".localized()
     var firstLoad = true
+    let privacyWV = WKWebView()
     
     public static var def: ViewController?
 
@@ -535,7 +536,6 @@ class ViewController: UITabBarController, UITabBarControllerDelegate, SettingMAB
             containerButton.addSubview(titleAgree)
             titleAgree.anchor(left: imageAgree.rightAnchor, right: containerButton.rightAnchor, paddingLeft: 5, centerY: containerButton.centerYAnchor)
             
-            let privacyWV = WKWebView()
             privacyWV.isOpaque = false
             privacyWV.backgroundColor = UIColor.clear
             privacyWV.scrollView.backgroundColor = UIColor.clear
@@ -547,6 +547,7 @@ class ViewController: UITabBarController, UITabBarControllerDelegate, SettingMAB
             }
             privacyWV.load(URLRequest(url: URL(string: urlPrivacyPolicy)!))
             privacyView.addSubview(privacyWV)
+            privacyWV.navigationDelegate = self
             privacyWV.anchor(top: privacyView.safeAreaLayoutGuide.topAnchor, left: privacyView.leftAnchor, right: privacyView.rightAnchor, height: privacyView.bounds.height - 80)
             
         }
@@ -555,6 +556,13 @@ class ViewController: UITabBarController, UITabBarControllerDelegate, SettingMAB
         self.present(privacyPolicyVC, animated: true)
     }
     
+    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
+        let js = "(function() { document.body.style.background='transparent'; })();"
+        privacyWV.evaluateJavaScript(js) { (_, error) in
+            print(error)
+        }
+    }
+    
     func showWelocomeView() {
         if let viewWelcome = welcomeVC.view {
             let bgImage = UIImageView()

+ 30 - 21
appbuilder-ios/NexilisLite/NexilisLite/Resource/Palio.storyboard

@@ -1857,7 +1857,7 @@
         <scene sceneID="LV8-10-m22">
             <objects>
                 <tableViewController storyboardIdentifier="broadcast" title="Broadcast View Controller" modalPresentationStyle="fullScreen" id="R2K-MM-fCQ" customClass="BroadcastViewController" customModule="NexilisLite" customModuleProvider="target" sceneMemberID="viewController">
-                    <tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="grouped" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="10" sectionFooterHeight="10" id="4YE-EM-E1g">
+                    <tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="grouped" rowHeight="44" estimatedRowHeight="-1" sectionHeaderHeight="10" sectionFooterHeight="10" id="4YE-EM-E1g">
                         <rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                         <color key="backgroundColor" red="0.94901960784313721" green="0.94901960784313721" blue="0.96862745098039216" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
@@ -1865,10 +1865,10 @@
                             <tableViewSection id="fls-vl-Jd4">
                                 <cells>
                                     <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" accessoryType="disclosureIndicator" indentationWidth="10" id="LMB-bw-Bw2">
-                                        <rect key="frame" x="0.0" y="10" width="414" height="43.5"/>
+                                        <rect key="frame" x="0.0" y="10" width="414" height="44"/>
                                         <autoresizingMask key="autoresizingMask"/>
                                         <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="LMB-bw-Bw2" id="yfs-8p-jg3">
-                                            <rect key="frame" x="0.0" y="0.0" width="383.5" height="43.5"/>
+                                            <rect key="frame" x="0.0" y="0.0" width="383.5" height="44"/>
                                             <autoresizingMask key="autoresizingMask"/>
                                             <subviews>
                                                 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Target Audience" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="bQi-FR-XdS">
@@ -1892,10 +1892,10 @@
                                         </connections>
                                     </tableViewCell>
                                     <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" accessoryType="disclosureIndicator" indentationWidth="10" id="GLM-eF-OVa">
-                                        <rect key="frame" x="0.0" y="53.5" width="414" height="43.5"/>
+                                        <rect key="frame" x="0.0" y="54" width="414" height="44"/>
                                         <autoresizingMask key="autoresizingMask"/>
                                         <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="GLM-eF-OVa" id="fGs-XI-hzd">
-                                            <rect key="frame" x="0.0" y="0.0" width="383.5" height="43.5"/>
+                                            <rect key="frame" x="0.0" y="0.0" width="383.5" height="44"/>
                                             <autoresizingMask key="autoresizingMask"/>
                                             <subviews>
                                                 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Broadcast Type" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="vy3-7B-AVq">
@@ -1919,10 +1919,10 @@
                                         </connections>
                                     </tableViewCell>
                                     <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" accessoryType="disclosureIndicator" indentationWidth="10" id="kxc-P5-eRH">
-                                        <rect key="frame" x="0.0" y="97" width="414" height="43.5"/>
+                                        <rect key="frame" x="0.0" y="98" width="414" height="44"/>
                                         <autoresizingMask key="autoresizingMask"/>
                                         <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="kxc-P5-eRH" id="Jra-ac-Ppc">
-                                            <rect key="frame" x="0.0" y="0.0" width="383.5" height="43.5"/>
+                                            <rect key="frame" x="0.0" y="0.0" width="383.5" height="44"/>
                                             <autoresizingMask key="autoresizingMask"/>
                                             <subviews>
                                                 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Broadcast Mode" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="9bR-wi-Nl9">
@@ -1946,10 +1946,10 @@
                                         </connections>
                                     </tableViewCell>
                                     <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" accessoryType="disclosureIndicator" indentationWidth="10" id="ZLb-aH-mzP">
-                                        <rect key="frame" x="0.0" y="140.5" width="414" height="43.5"/>
+                                        <rect key="frame" x="0.0" y="142" width="414" height="44"/>
                                         <autoresizingMask key="autoresizingMask"/>
                                         <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="ZLb-aH-mzP" id="Ojf-jm-OaD">
-                                            <rect key="frame" x="0.0" y="0.0" width="383.5" height="43.5"/>
+                                            <rect key="frame" x="0.0" y="0.0" width="383.5" height="44"/>
                                             <autoresizingMask key="autoresizingMask"/>
                                             <subviews>
                                                 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Broadcast Variant" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="lpV-Iz-jU7">
@@ -1972,11 +1972,11 @@
                                             <segue destination="SJ9-Sd-5Zw" kind="show" identifier="br_variant" id="04j-1J-IzO"/>
                                         </connections>
                                     </tableViewCell>
-                                    <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" id="wXr-TC-qEQ">
-                                        <rect key="frame" x="0.0" y="184" width="414" height="43.5"/>
+                                    <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="43" id="wXr-TC-qEQ">
+                                        <rect key="frame" x="0.0" y="186" width="414" height="43"/>
                                         <autoresizingMask key="autoresizingMask"/>
                                         <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="wXr-TC-qEQ" id="hm2-TV-C7B">
-                                            <rect key="frame" x="0.0" y="0.0" width="414" height="43.5"/>
+                                            <rect key="frame" x="0.0" y="0.0" width="414" height="43"/>
                                             <autoresizingMask key="autoresizingMask"/>
                                             <subviews>
                                                 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Start Time" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="K9Y-Bs-wx6">
@@ -1994,10 +1994,10 @@
                                         </tableViewCellContentView>
                                     </tableViewCell>
                                     <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" id="f0m-TO-UFt">
-                                        <rect key="frame" x="0.0" y="227.5" width="414" height="43.5"/>
+                                        <rect key="frame" x="0.0" y="229" width="414" height="44"/>
                                         <autoresizingMask key="autoresizingMask"/>
                                         <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="f0m-TO-UFt" id="KDB-7j-vpa">
-                                            <rect key="frame" x="0.0" y="0.0" width="414" height="43.5"/>
+                                            <rect key="frame" x="0.0" y="0.0" width="414" height="44"/>
                                             <autoresizingMask key="autoresizingMask"/>
                                             <subviews>
                                                 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="End Time" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="4av-J4-1eW">
@@ -2019,10 +2019,10 @@
                             <tableViewSection id="zc4-Ed-az8">
                                 <cells>
                                     <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" id="fOL-Lc-eJm">
-                                        <rect key="frame" x="0.0" y="291" width="414" height="43.5"/>
+                                        <rect key="frame" x="0.0" y="293" width="414" height="44"/>
                                         <autoresizingMask key="autoresizingMask"/>
                                         <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="fOL-Lc-eJm" id="2FZ-Hz-Pkr">
-                                            <rect key="frame" x="0.0" y="0.0" width="414" height="43.5"/>
+                                            <rect key="frame" x="0.0" y="0.0" width="414" height="44"/>
                                             <autoresizingMask key="autoresizingMask"/>
                                             <subviews>
                                                 <textField opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="Title" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="6AP-5K-qKr">
@@ -2039,7 +2039,7 @@
                             <tableViewSection id="1an-41-SCh">
                                 <cells>
                                     <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="80" id="JWO-tQ-Xcw">
-                                        <rect key="frame" x="0.0" y="354.5" width="414" height="80"/>
+                                        <rect key="frame" x="0.0" y="357" width="414" height="80"/>
                                         <autoresizingMask key="autoresizingMask"/>
                                         <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="JWO-tQ-Xcw" id="phr-M5-zSa">
                                             <rect key="frame" x="0.0" y="0.0" width="414" height="80"/>
@@ -2060,7 +2060,7 @@
                             <tableViewSection id="tCR-tM-r50">
                                 <cells>
                                     <tableViewCell hidden="YES" clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="none" indentationWidth="10" rowHeight="200" id="QTr-Of-81K">
-                                        <rect key="frame" x="0.0" y="454.5" width="414" height="200"/>
+                                        <rect key="frame" x="0.0" y="457" width="414" height="200"/>
                                         <autoresizingMask key="autoresizingMask"/>
                                         <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="QTr-Of-81K" id="lxV-Yy-btZ">
                                             <rect key="frame" x="0.0" y="0.0" width="414" height="200"/>
@@ -2138,7 +2138,7 @@
                             <tableViewSection id="lQ2-lH-0zC">
                                 <cells>
                                     <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="none" indentationWidth="10" rowHeight="260" id="CKH-jl-cDo">
-                                        <rect key="frame" x="0.0" y="674.5" width="414" height="260"/>
+                                        <rect key="frame" x="0.0" y="677" width="414" height="260"/>
                                         <autoresizingMask key="autoresizingMask"/>
                                         <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="CKH-jl-cDo" id="lSW-Qf-JDY">
                                             <rect key="frame" x="0.0" y="0.0" width="414" height="260"/>
@@ -2257,7 +2257,7 @@
                             <tableViewSection id="t6y-tt-wQ4">
                                 <cells>
                                     <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" id="PJj-83-c9q">
-                                        <rect key="frame" x="0.0" y="954.5" width="414" height="43.5"/>
+                                        <rect key="frame" x="0.0" y="957" width="414" height="43.5"/>
                                         <autoresizingMask key="autoresizingMask"/>
                                         <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="PJj-83-c9q" id="Mhi-ua-3xb">
                                             <rect key="frame" x="0.0" y="0.0" width="414" height="43.5"/>
@@ -2294,22 +2294,31 @@
                     </navigationItem>
                     <connections>
                         <outlet property="addMemberButton" destination="jXj-wl-ncj" id="JLn-Wf-brn"/>
+                        <outlet property="attachmentLabel" destination="9Up-Gk-VJQ" id="3rQ-El-iU7"/>
                         <outlet property="broadcastModeLabel" destination="Wg8-ri-n7A" id="45K-8d-AAL"/>
+                        <outlet property="broadcastModeTitle" destination="9bR-wi-Nl9" id="XfD-b3-p08"/>
                         <outlet property="broadcastTypeLabel" destination="r2W-QY-Pqz" id="op9-fl-1uI"/>
+                        <outlet property="broadcastTypeTitle" destination="vy3-7B-AVq" id="bbs-Sb-12O"/>
                         <outlet property="broadcastVariantLabel" destination="eql-YM-OUH" id="drB-OB-paa"/>
+                        <outlet property="broadcastVariantTitle" destination="lpV-Iz-jU7" id="pwz-Nk-Oyl"/>
+                        <outlet property="cancelButton" destination="dTj-9H-wyQ" id="IPh-TW-OzV"/>
                         <outlet property="clearAttachButton" destination="6bK-gT-tMC" id="G29-gZ-5K7"/>
                         <outlet property="documentLabel" destination="LTH-tR-4Sf" id="aGl-R7-IrL"/>
                         <outlet property="documentPreview" destination="xJo-k5-w4m" id="Gi1-V9-ur2"/>
+                        <outlet property="doneButton" destination="GlB-rP-5hM" id="lDo-BG-ZGh"/>
                         <outlet property="endTimeCell" destination="f0m-TO-UFt" id="XDa-zB-vuF"/>
                         <outlet property="endTimePicker" destination="7sf-CE-Azt" id="ZTo-r6-nGx"/>
+                        <outlet property="endTimeTitle" destination="4av-J4-1eW" id="RO1-dw-qvk"/>
                         <outlet property="imagePreview" destination="Pea-as-QSa" id="GNS-2M-IqZ"/>
                         <outlet property="linkTextField" destination="dMr-MX-Gea" id="nxA-Fu-gog"/>
+                        <outlet property="memberCell" destination="QTr-Of-81K" id="bpC-KI-cJp"/>
                         <outlet property="memberListLabel" destination="Aft-wF-Mau" id="x3i-v7-3mU"/>
-                        <outlet property="memberSection" destination="QTr-Of-81K" id="DdN-nX-R0E"/>
                         <outlet property="memberTable" destination="pAb-RO-Znf" id="ZoS-pZ-r8c"/>
                         <outlet property="messageTextView" destination="OOI-CC-iJH" id="eX5-Gq-yG7"/>
                         <outlet property="startTimePicker" destination="iC4-pI-Mw2" id="5wb-k5-soe"/>
+                        <outlet property="starttimeTitle" destination="K9Y-Bs-wx6" id="Weq-8l-VAI"/>
                         <outlet property="targetAudienceLabel" destination="8UB-CE-tar" id="r2w-uS-47g"/>
+                        <outlet property="targetAudienceTitle" destination="bQi-FR-XdS" id="c5p-yr-wDH"/>
                         <outlet property="titleTextField" destination="6AP-5K-qKr" id="KJj-Ul-7oc"/>
                     </connections>
                 </tableViewController>

+ 36 - 3
appbuilder-ios/NexilisLite/NexilisLite/Resource/id.lproj/Localizable.strings

@@ -36,6 +36,7 @@
 "Take Video" = "Ambil Video";
 "Cancel" = "Batal";
 "Yes" = "Ya";
+"No" = "Tidak";
 "Send" = "Kirim";
 "Delete" = "Hapus";
 "Delete Conversation" = "Hapus percakapan";
@@ -216,8 +217,40 @@
 "Successfully removed profile picture" = "Berhasil menghapus foto";
 "Successfully changed profile picture" = "Berhasil mengubah foto";
 "Please select the communication media do you want" = "Silakan pilih media komunikasi yang Anda inginkan";
-"Chat with a Representative" = "Mengobrol dengan Perwakilan";
-"Video Call a Representative" = "Panggilan Video dengan Perwakilan";
-"Call a Representative" = "Paggilan Suara dengan Perwakilan";
+"Chat with a Representative" = "Obrolan";
+"Video Call a Representative" = "Panggilan Video";
+"Call a Representative" = "Paggilan Suara";
 "Unfavorite all messages" = "Hapus semua pesan favorit";
 "Successfully changed name" = "Berhasil mengubah nama";
+"Please select your Consultation Topic:" = "Silakan pilih Topik Konsultasi Anda:";
+"Please select the type of topic that you chosen" = "Silakan pilih jenis topik yang Anda pilih";
+"Please select the information option:" = "Silakan pilih opsi informasi:";
+"Sorry, currently all our representatives are busy helping other customers. Do you want us to get back to you as soon as one of them is available?" = "Maaf, saat ini semua perwakilan kami sibuk membantu pelanggan lain. Apakah Anda ingin kami menghubungi Anda segera setelah salah satu dari mereka tersedia?";
+"Please wait while we connect you\nto one of our service representatives" = "Harap menunggu sementara kami menghubungkan Anda\nke salah satu perwakilan layanan kami";
+"Thank you for contacting us,\none of our officers will contact you soon" = "Terima kasih telah menghubungi kami,\nsalah satu petugas kami akan segera menghubungi Anda";
+"Thank you for being awesome,\nhave a great day!" = "Terima kasih telah menjadi luar biasa,\nsemoga harimu menyenangkan!";
+"Successfully Sign-Up" = "Berhasil daftar";
+"Broadcast Message" = "Pesan Siaran";
+"One Time" = "Satu kali";
+"Daily" = "Setiap Hari";
+"Weekly" = "Setiap Minggu";
+"Monthly" = "Setiap Bulan";
+"Customer" = "Pelanggan";
+"Team" = "Tim";
+"All User" = "Semua Pengguna";
+"Group" = "Grup";
+"Merchant Member" = "Anggota Pedagang";
+"Target Audience" = "Target Sasaran";
+"Broadcast Type" = "Tipe Siaran";
+"Broadcast Mode" = "Mode Siaran";
+"Broadcast Variant" = "Varian Siaran";
+"Start Time" = "Waktu Mulai";
+"End Time" = "Waktu selesai";
+"Message" = "Pesan";
+"Notification" = "Notifikasi";
+"In App" = "Masuk Aplikasi";
+"Attachment (Optional)" = "Lampiran (Opsional)";
+"Link (Optional)" = "Tautan (Opsional)";
+"Title and message must not be empty" = "Judul dan pesan tidak boleh kosong";
+"Please select at least one contact" = "Harap pilih setidaknya satu kontak";
+"Broadcast Message Sent" = "Pesan Siaran Terkirim";

+ 17 - 16
appbuilder-ios/NexilisLite/NexilisLite/Source/Nexilis.swift

@@ -73,16 +73,9 @@ public class Nexilis: NSObject {
             
             IncomingThread.default.run()
             
-            if let _ = UserDefaults.standard.stringArray(forKey: "address") {
-                
-            }
-            else {
-                let address = Nexilis.getAddress(apiKey:apiKey)
-                if !address.isEmpty {
-                    UserDefaults.standard.set(address, forKey: "address")
-                    UserDefaults.standard.set(address[0], forKey: "server")
-                }
-            }
+            let address = Nexilis.getAddress(apiKey:apiKey)
+            UserDefaults.standard.set(address, forKey: "address")
+            UserDefaults.standard.set(address[0], forKey: "server")
             
             Nexilis.dispatch = DispatchGroup()
             Nexilis.dispatch?.enter()
@@ -1599,17 +1592,18 @@ extension Nexilis: CallDelegate {
             if (state == 21 && message.split(separator: ",")[1] != "joining Ac.room on channel 0") {
                 if onGoingCC.isEmpty {
                     let backgroundTaskIdentifier = UIApplication.shared.beginBackgroundTask(expirationHandler: nil)
+                    let data = User.getData(pin: String(deviceId))
+                    if data == nil {
+                        DispatchQueue.main.asyncAfter(deadline: .now() + 0.5, execute: {
+                            API.terminateCall(sParty: nil)
+                        })
+                        return
+                    }
                     self.displayIncomingCall(uuid: UUID(), handle: String(deviceId), hasVideo: false) { error in
                         UIApplication.shared.endBackgroundTask(backgroundTaskIdentifier)
                     }
                 } else {
                     DispatchQueue.main.asyncAfter(deadline: .now() + isShowAlert!, execute: {
-                        do {
-                            try AVAudioSession.sharedInstance().setCategory(.playAndRecord)
-                            try AVAudioSession.sharedInstance().setMode(.voiceChat)
-                            try AVAudioSession.sharedInstance().overrideOutputAudioPort(.none)
-                        } catch {
-                        }
                         let controller = QmeraAudioViewController()
                         controller.user = User.getData(pin: String(deviceId))
                         controller.isOnGoing = true
@@ -1624,6 +1618,13 @@ extension Nexilis: CallDelegate {
                     })
                 }
             } else if (state != -3 && state != 21) {
+                let dataUser = User.getData(pin: String(deviceId))
+                if dataUser == nil {
+                    DispatchQueue.main.asyncAfter(deadline: .now() + 0.5, execute: {
+                        API.terminateCall(sParty: nil)
+                    })
+                    return
+                }
                 let fpin = deviceId
                 var data: [String: String?] = [:]
                 Database.shared.database?.inTransaction({ (fmdb, rollback) in

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

@@ -246,12 +246,6 @@ class QmeraAudioViewController: UIViewController {
                 if onGoingCC.isEmpty {
                     Nexilis.shared.callManager.startCall(handle: u.pin)
                 } else {
-                    do {
-                        try AVAudioSession.sharedInstance().setCategory(.playAndRecord)
-                        try AVAudioSession.sharedInstance().setMode(.voiceChat)
-                        try AVAudioSession.sharedInstance().overrideOutputAudioPort(.none)
-                    } catch {
-                    }
                     API.initiateCCall(sParty: u.pin)
                 }
             }

+ 1 - 1
appbuilder-ios/NexilisLite/NexilisLite/Source/View/Call/QmeraVideoViewController.swift

@@ -364,7 +364,7 @@ class QmeraVideoViewController: UIViewController {
         ])
         if isInisiator {
             labelIncomingOutgoing.text = "Outgoing video call".localized() + "..."
-            API.initiateCCall(sParty: dataPerson[0]["f_pin"]!, nCamIdx: 1, nResIdx: 2, nVQuality: 2, ivRemoteView: listRemoteViewFix, ivLocalView: cameraView, ivRemoteZ: zoomView)
+            API.initiateCCall(sParty: dataPerson[0]["f_pin"]!, nCamIdx: 1, nResIdx: 2, nVQuality: 4, ivRemoteView: listRemoteViewFix, ivLocalView: cameraView, ivRemoteZ: zoomView)
         } else {
             let systemSoundID: SystemSoundID = 1254
             AudioServicesPlaySystemSound(systemSoundID)

+ 29 - 8
appbuilder-ios/NexilisLite/NexilisLite/Source/View/Chat/EditorPersonal.swift

@@ -551,6 +551,9 @@ public class EditorPersonal: UIViewController, ImageVideoPickerDelegate, UIGestu
             chatbot()
         }
         
+        let exblock = User.getData(pin: self.dataPerson["f_pin"]!!)?.ex_block
+        blocking = exblock == nil ? "0" : exblock!.isEmpty ? "0" : exblock!
+        
         changeAppBar()
         getData()
         
@@ -749,10 +752,11 @@ public class EditorPersonal: UIViewController, ImageVideoPickerDelegate, UIGestu
                 imageProfile.backgroundColor = .lightGray
             }
             
-            var titleNavigation = UILabel(frame: CGRect(x: 35, y: 0, width: viewAppBar.frame.size.width - 150, height: 44))
-            if dataPerson["f_pin"]!! != "-999"  && !isContactCenter && (blocking == "-1" || blocking == "1") {
-                titleNavigation = UILabel(frame: CGRect(x: 35, y: 0, width: viewAppBar.frame.size.width - 250, height: 44))
+            var titleNavigation = UILabel(frame: CGRect(x: 35, y: 0, width: viewAppBar.frame.size.width - 250, height: 44))
+            if blocking == "-1" || blocking == "1" {
+                titleNavigation = UILabel(frame: CGRect(x: 35, y: 0, width: viewAppBar.frame.size.width - 150, height: 44))
             } else if isContactCenter {
+                titleNavigation = UILabel(frame: CGRect(x: 35, y: 0, width: viewAppBar.frame.size.width - 150, height: 44))
                 if users.count > 0 {
                     titleNavigation = UILabel(frame: CGRect(x: 35 * (CGFloat(users.count)) - (CGFloat((users.count - 1) * 15)), y: 0, width: viewAppBar.frame.size.width - 150 - (35 * (CGFloat(users.count - 1)) - (CGFloat((users.count - 1) * 15))), height: 44))
                 }
@@ -762,12 +766,14 @@ public class EditorPersonal: UIViewController, ImageVideoPickerDelegate, UIGestu
                 var name = dataPerson["name"]!!
                 if (isContactCenter) {
                     name = name + " " + "Contact Center".localized()
+                    titleNavigation.text = name
+                } else {
+                    titleNavigation.set(image: UIImage(named: "ic_official_flag", in: Bundle.resourceBundle(for: Nexilis.self), with: nil)!, with: "  \(name)", size: 15, y: -4)
                 }
-                titleNavigation.set(image: UIImage(named: "ic_official_flag", in: Bundle.resourceBundle(for: Nexilis.self), with: nil)!, with: "  \(name)", size: 15, y: -4)
-            } else if User.isVerified(official_account: (dataPerson["isOfficial"] ?? "")!) {
+            } else if User.isVerified(official_account: (dataPerson["isOfficial"] ?? "")!) && !isContactCenter {
                 let name = dataPerson["name"]!!
                 titleNavigation.set(image: UIImage(named: "ic_verified", in: Bundle.resourceBundle(for: Nexilis.self), with: nil)!, with: "  \(name)", size: 15, y: -4)
-            } else if User.isInternal(userType: (dataPerson["user_type"] ?? "")!) {
+            } else if User.isInternal(userType: (dataPerson["user_type"] ?? "")!) && !isContactCenter {
                 let name = dataPerson["name"]!!
                 titleNavigation.set(image: UIImage(named: "ic_internal", in: Bundle.resourceBundle(for: Nexilis.self), with: nil)!, with: "  \(name)", size: 15, y: -4)
             } else {
@@ -1857,6 +1863,13 @@ public class EditorPersonal: UIViewController, ImageVideoPickerDelegate, UIGestu
                 return
             }
             if let pin = dataPerson["f_pin"] {
+                if !CheckConnection.isConnectedToNetwork() {
+                    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
+                }
                 let controller = QmeraAudioViewController()
                 controller.user = User.getData(pin: pin)
                 controller.isOutgoing = true
@@ -1878,6 +1891,13 @@ public class EditorPersonal: UIViewController, ImageVideoPickerDelegate, UIGestu
             } else if goVideoCall == -1 {
                 return
             }
+            if !CheckConnection.isConnectedToNetwork() {
+                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
+            }
             let videoVC = AppStoryBoard.Palio.instance.instantiateViewController(withIdentifier: "videoVCQmera") as! QmeraVideoViewController
             videoVC.dataPerson.append(dataPerson)
             self.show(videoVC, sender: nil)
@@ -2351,7 +2371,7 @@ public class EditorPersonal: UIViewController, ImageVideoPickerDelegate, UIGestu
                             row["message_id"] = ""
                             row["chat_date"] = "Today".localized()
                             row["attachment_flag"] = "504"
-                            let listStringName: [String] = ["Yes", "No"]
+                            let listStringName: [String] = ["Yes".localized(), "No".localized()]
                             var data : [CategoryCC] = []
                             for i in 0..<listStringName.count {
                                 data.append(CategoryCC(id: "level\(self.dataMessages.count + 1)_\(i)", service_id: service_id, service_name: listStringName[i], parent: "", description: "", is_tablet: "0"))
@@ -3839,7 +3859,8 @@ extension EditorPersonal: UITableViewDelegate, UITableViewDataSource {
                 messageText.bottomAnchor.constraint(equalTo: containerMessage.bottomAnchor, constant: -15).isActive = true
                 messageText.trailingAnchor.constraint(equalTo: containerMessage.trailingAnchor, constant: -15).isActive = true
                 if category_cc[0].id.contains("level0_") || dataMessages[indexPath.row]["attachment_flag"] != nil && dataMessages[indexPath.row]["attachment_flag"] as! String == "503" {
-                    messageText.text = "Welcome to".localized() + " " + dataPerson["name"]!! + " " + "Contact Center".localized() + "\n" + "\n" + "Please select the communication media do you want".localized()
+                    messageText.text = "Welcome to".localized() + " " + dataPerson["name"]!! + " " + "Contact Center".localized()
+                    // + "\n" + "\n" + "Please select the communication media do you want".localized()
                 } else if category_cc[0].id.contains("level1_") {
                     messageText.text = "Please select your Consultation Topic:".localized()
                 } else if !category_cc[0].id.contains("level1_") && dataMessages[indexPath.row]["attachment_flag"] == nil {

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

@@ -7,6 +7,7 @@
 
 import UIKit
 import nuSDKService
+import NotificationBannerSwift
 
 class ContactCallViewController: UIViewController {
     
@@ -28,6 +29,13 @@ class ContactCallViewController: UIViewController {
     
     override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
         if (segue.identifier == "videoVC") {
+            if !CheckConnection.isConnectedToNetwork() {
+                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
+            }
             let destination = segue.destination as! QmeraVideoViewController
             let index = sender as! UIButton
             destination.dataPerson.append(dataPerson[index.tag])
@@ -231,6 +239,13 @@ extension ContactCallViewController: UITableViewDataSource {
     @objc func call(sender: Any) {
         let index = sender as! UIButton
         if let pin = dataPerson[index.tag]["f_pin"] {
+            if !CheckConnection.isConnectedToNetwork() {
+                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
+            }
             let controller = QmeraAudioViewController()
             controller.user = User.getData(pin: pin)
             controller.isOutgoing = true

+ 17 - 3
appbuilder-ios/NexilisLite/NexilisLite/Source/View/Control/AddFriendTableViewController.swift

@@ -48,9 +48,13 @@ class AddFriendTableViewController: UITableViewController {
         
         title = "Add Friends".localized()
         
-        navigationController?.navigationBar.backgroundColor = .mainColor
-        navigationController?.navigationBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
-        navigationController?.navigationBar.largeTitleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
+        let attributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
+        let navBarAppearance = UINavigationBarAppearance()
+        navBarAppearance.configureWithOpaqueBackground()
+        navBarAppearance.backgroundColor = UIColor.mainColor
+        navBarAppearance.titleTextAttributes = attributes
+        navigationController?.navigationBar.standardAppearance = navBarAppearance
+        navigationController?.navigationBar.scrollEdgeAppearance = navBarAppearance
         
         navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Cancel".localized(), style: .plain, target: self, action: #selector(cancel(sender:)))
         
@@ -132,6 +136,16 @@ class AddFriendTableViewController: UITableViewController {
         }
     }
     
+    func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {
+        searchBar.showsCancelButton = true
+        let cBtn = searchBar.value(forKey: "cancelButton") as! UIButton
+        cBtn.setTitle("Cancel".localized(), for: .normal)
+    }
+    
+    func searchBarTextDidEndEditing(_ searchBar: UISearchBar) {
+        searchBar.showsCancelButton = false
+    }
+    
     // MARK: - Table view data source
     
     override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {

+ 4 - 3
appbuilder-ios/NexilisLite/NexilisLite/Source/View/Control/AudienceViewController.swift

@@ -48,11 +48,11 @@ class AudienceViewController: UITableViewController {
             destination.targetAudienceLabel.tag = cell.tag
             destination.dest = "\(cell.tag + 1)"
             if(destination.dest == BroadcastViewController.DESTINATION_GROUP || destination.dest == BroadcastViewController.DESTINATION_SPESIFIC) {
-                destination.memberSection.isHidden = false
+                destination.memberCell.isHidden = false
             }
             else {
-                destination.memberSection.frame.size.height = 0.0
-                destination.memberSection.isHidden = true
+                destination.memberCell.frame.size.height = 0.0
+                destination.memberCell.isHidden = true
             }
             if(destination.dest == BroadcastViewController.DESTINATION_GROUP){
                 destination.memberListLabel.text = "Groups"
@@ -61,6 +61,7 @@ class AudienceViewController: UITableViewController {
                 destination.memberListLabel.text = "Members"
             }
             destination.memberTable.reloadData()
+            destination.tableView.reloadData()
         }
     }
 }

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

@@ -362,6 +362,7 @@ class BroadcastMembersTableViewController: UITableViewController, UISearchContro
             print("CONTACTS")
             print(destination.contacts)
             destination.memberTable.reloadData()
+            destination.tableView.reloadData()
         }
     }
 

+ 1 - 0
appbuilder-ios/NexilisLite/NexilisLite/Source/View/Control/BroadcastModeViewController.swift

@@ -42,6 +42,7 @@ class BroadcastModeViewController: UITableViewController {
             else {
                 destination.endTimeCell.isHidden = false
             }
+            destination.tableView.reloadData()
         }
     }
 

+ 70 - 9
appbuilder-ios/NexilisLite/NexilisLite/Source/View/Control/BroadcastViewController.swift

@@ -9,15 +9,22 @@ import UIKit
 import AVKit
 import AVFoundation
 import FMDB
+import NotificationBannerSwift
 
 class BroadcastViewController: UITableViewController, UITextFieldDelegate, UITextViewDelegate, ImageVideoPickerDelegate, DocumentPickerDelegate {
 
     @IBOutlet weak var targetAudienceLabel: UILabel!
+    @IBOutlet weak var targetAudienceTitle: UILabel!
     @IBOutlet weak var broadcastTypeLabel: UILabel!
+    @IBOutlet weak var broadcastTypeTitle: UILabel!
     @IBOutlet weak var broadcastModeLabel: UILabel!
+    @IBOutlet weak var broadcastModeTitle: UILabel!
     @IBOutlet weak var broadcastVariantLabel: UILabel!
+    @IBOutlet weak var broadcastVariantTitle: UILabel!
     @IBOutlet weak var startTimePicker: UIDatePicker!
+    @IBOutlet weak var starttimeTitle: UILabel!
     @IBOutlet weak var endTimeCell: UITableViewCell!
+    @IBOutlet weak var endTimeTitle: UILabel!
     @IBOutlet weak var endTimePicker: UIDatePicker!
     @IBOutlet weak var titleTextField: UITextField!
     @IBOutlet weak var messageTextView: UITextView!
@@ -28,9 +35,12 @@ class BroadcastViewController: UITableViewController, UITextFieldDelegate, UITex
     @IBOutlet weak var documentLabel: UILabel!
     @IBOutlet weak var addMemberButton: UIButton!
     @IBOutlet weak var memberTable: UITableView!
-    @IBOutlet weak var memberSection: UITableViewCell!
+    @IBOutlet weak var memberCell: UITableViewCell!
     @IBOutlet weak var memberListLabel: UILabel!
-    let placeholder = "Message"
+    @IBOutlet weak var cancelButton: UIBarButtonItem!
+    @IBOutlet weak var doneButton: UIBarButtonItem!
+    @IBOutlet weak var attachmentLabel: UILabel!
+    let placeholder = "Message".localized()
     
     static let FLAG_NEW_POST = "0"
     static let FLAG_EDIT_POST = "1"
@@ -102,6 +112,21 @@ class BroadcastViewController: UITableViewController, UITextFieldDelegate, UITex
         let textAttributes = [NSAttributedString.Key.foregroundColor:UIColor.white]
         navigationController?.navigationBar.titleTextAttributes = textAttributes
         
+        title = "Broadcast Message".localized()
+        cancelButton.title = "Cancel".localized()
+        doneButton.title = "Submit".localized()
+        
+        targetAudienceTitle.text = "Target Audience".localized()
+        broadcastTypeTitle.text = "Broadcast Type".localized()
+        broadcastModeTitle.text = "Broadcast Mode".localized()
+        broadcastVariantTitle.text = "Broadcast Variant".localized()
+        starttimeTitle.text = "Start Time".localized()
+        endTimeTitle.text = "End Time".localized()
+        titleTextField.placeholder = "Title".localized()
+        attachmentLabel.text = "Attachment (Optional)".localized()
+        attachmentLabel.textColor = .lightGray
+        linkTextField.placeholder = "Link (Optional)".localized()
+        
         titleTextField.delegate = self
         messageTextView.delegate = self
         linkTextField.delegate = self
@@ -348,6 +373,13 @@ class BroadcastViewController: UITableViewController, UITextFieldDelegate, UITex
         print("thumb_id: \(thumbId)")
         print("file_id: \(fileId)")
         print("members: \(membersInvited)")
+        if !CheckConnection.isConnectedToNetwork() {
+            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
+        }
         showActivityIndicatory()
         if(form == BroadcastViewController.FORM_NOT_FORM){
             if(fileType == BroadcastViewController.FILE_TYPE_IMAGE){
@@ -539,9 +571,17 @@ class BroadcastViewController: UITableViewController, UITextFieldDelegate, UITex
         if let response = Nexilis.writeSync(message: message) {
             if (response.getBody(key: CoreMessage_TMessageKey.ERRCOD, default_value: "99") == "00") {
                 DispatchQueue.main.async {
+                    let imageView = UIImageView(image: UIImage(systemName: "checkmark.circle.fill"))
+                    imageView.tintColor = .white
+                    let banner = FloatingNotificationBanner(title: "Broadcast Message Sent".localized(), subtitle: nil, titleFont: UIFont.systemFont(ofSize: 16), titleColor: nil, titleTextAlign: .left, subtitleFont: nil, subtitleColor: nil, subtitleTextAlign: nil, leftView: imageView, rightView: nil, style: .success, colors: nil, iconPosition: .center)
+                    banner.show()
                     self.navigationController?.presentingViewController?.dismiss(animated: true)
                 }
             } else {
+                let imageView = UIImageView(image: UIImage(systemName: "xmark.circle.fill"))
+                imageView.tintColor = .white
+                let banner = FloatingNotificationBanner(title: "Unable to access servers. Try again later".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()
                 self.loadingView.dismiss(animated: true)
             }
         }
@@ -592,7 +632,6 @@ class BroadcastViewController: UITableViewController, UITextFieldDelegate, UITex
                 }
                 content.textProperties.font = UIFont.systemFont(ofSize: 14)
                 mcell.contentConfiguration = content
-                
             }
             else if(dest == BroadcastViewController.DESTINATION_GROUP){
                 var content = mcell.defaultContentConfiguration()
@@ -628,6 +667,7 @@ class BroadcastViewController: UITableViewController, UITextFieldDelegate, UITex
             groups.remove(at: index)
         }
         memberTable.reloadData()
+        tableView.reloadData()
     }
     
     override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
@@ -648,13 +688,13 @@ class BroadcastViewController: UITableViewController, UITextFieldDelegate, UITex
     }
     
     override func numberOfSections(in tableView: UITableView) -> Int {
-            if(tableView == memberTable){
-                return 1
-            }
-            else {
-                return super.numberOfSections(in: tableView)
-            }
+        if(tableView == memberTable){
+            return 1
+        }
+        else {
+            return super.numberOfSections(in: tableView)
         }
+    }
     
     func set(image: UIImage, with text: String, size: CGFloat, y: CGFloat, colorText: UIColor = UIColor.black) -> NSAttributedString {
         let attachment = NSTextAttachment()
@@ -672,6 +712,27 @@ class BroadcastViewController: UITableViewController, UITextFieldDelegate, UITex
         
         return mutableAttributedString
     }
+    
+    override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
+        if indexPath.section == 0 && broadcastModeLabel.text == "One Time".localized() {
+            if indexPath.row == 5 {
+                return 0
+            }
+        }
+        if indexPath.section == 3 && (targetAudienceLabel.text != "Group".localized() && targetAudienceLabel.text != "User".localized()) {
+            return 0
+        }
+        if indexPath.section == 3 {
+            if targetAudienceLabel.text == "Group".localized() {
+                return CGFloat(44 + (44 * groups.count) + 7)
+            }
+            return CGFloat(44 + (44 * contacts.count) + 7)
+        }
+        if indexPath.section == 4 {
+            return 260
+        }
+        return 44
+    }
 
 }
 

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

@@ -20,8 +20,13 @@ class GroupCreateViewController: UITableViewController {
         
         title = "Create Group".localized()
         
-        navigationController?.navigationBar.backgroundColor = .mainColor
-        navigationController?.navigationBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
+        let attributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
+        let navBarAppearance = UINavigationBarAppearance()
+        navBarAppearance.configureWithOpaqueBackground()
+        navBarAppearance.backgroundColor = UIColor.mainColor
+        navBarAppearance.titleTextAttributes = attributes
+        navigationController?.navigationBar.standardAppearance = navBarAppearance
+        navigationController?.navigationBar.scrollEdgeAppearance = navBarAppearance
 
         navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Cancel".localized(), style: .plain, target: self, action: #selector(cancel(sender:)))
         navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Save".localized(), style: .done, target: self, action: #selector(save(sender:)))

+ 1 - 0
appbuilder-ios/NexilisLite/NexilisLite/Source/View/Control/GroupDescViewController.swift

@@ -25,6 +25,7 @@ class GroupDescViewController: UITableViewController {
         navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Save".localized(), style: .plain, target: self, action: #selector(save(sender:)))
         navigationItem.rightBarButtonItem?.isEnabled = false
         descText.text = quote
+        navigationController?.navigationBar.backgroundColor = .mainColor
         
         descText.addTarget(self, action: #selector(didChanged(sender:)), for: .editingChanged)
         descText.placeholder = "Description".localized()

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

@@ -279,6 +279,10 @@ class GroupDetailViewController: UITableViewController {
                     self.reload()
                 }
                 let navController = UINavigationController(rootViewController: controller)
+                let cancelButtonAttributes: [NSAttributedString.Key: Any] = [NSAttributedString.Key.foregroundColor: UIColor.white]
+                UIBarButtonItem.appearance().setTitleTextAttributes(cancelButtonAttributes, for: .normal)
+                let textAttributes = [NSAttributedString.Key.foregroundColor:UIColor.white]
+                navController.navigationBar.titleTextAttributes = textAttributes
                 navigationController?.present(navController, animated: true)
             }
             

+ 32 - 14
appbuilder-ios/NexilisLite/NexilisLite/Source/View/Control/ProfileViewController.swift

@@ -61,6 +61,8 @@ public class ProfileViewController: UITableViewController {
     
     var fromListFriend = false
     
+    var isLoadingAddFriend = false
+    
     private func reload() {
         if let user = self.user {
             self.navigationController?.navigationBar.topItem?.title = "\(user.firstName) \(user.lastName)"
@@ -151,6 +153,8 @@ public class ProfileViewController: UITableViewController {
     public override func viewWillAppear(_ animated: Bool) {
         if navigationController?.navigationBar.backgroundColor != .clear {
             navigationController?.navigationBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
+            navigationController?.navigationBar.tintColor = .white
+            navigationItem.rightBarButtonItem?.tintColor = .white
         } else {
             navigationController?.navigationBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.black]
         }
@@ -286,7 +290,6 @@ public class ProfileViewController: UITableViewController {
             self.switchPrivateAccount.setOn(!value, animated: true)
             return
         }
-        Nexilis.showLoader()
         DispatchQueue.global().async {
             let tMessage = CoreMessage_TMessageBank.getChangePersonInfo_New(p_f_pin: self.data)
             tMessage.mBodies[CoreMessage_TMessageKey.PRIVACY_FLAG] = value ? "1" : "0"
@@ -298,22 +301,18 @@ public class ProfileViewController: UITableViewController {
                         ], _where: "f_pin = '\(self.data)'")
                     })
                     DispatchQueue.main.async {
-                        Nexilis.hideLoader {
-                            let imageView = UIImageView(image: UIImage(systemName: "checkmark.circle.fill"))
-                            imageView.tintColor = .white
-                            let banner = FloatingNotificationBanner(title: "Successfully changed".localized(), subtitle: nil, titleFont: UIFont.systemFont(ofSize: 16), titleColor: nil, titleTextAlign: .left, subtitleFont: nil, subtitleColor: nil, subtitleTextAlign: nil, leftView: imageView, rightView: nil, style: .success, colors: nil, iconPosition: .center)
-                            banner.show()
-                        }
+                        let imageView = UIImageView(image: UIImage(systemName: "checkmark.circle.fill"))
+                        imageView.tintColor = .white
+                        let banner = FloatingNotificationBanner(title: "Successfully changed".localized(), subtitle: nil, titleFont: UIFont.systemFont(ofSize: 16), titleColor: nil, titleTextAlign: .left, subtitleFont: nil, subtitleColor: nil, subtitleTextAlign: nil, leftView: imageView, rightView: nil, style: .success, colors: nil, iconPosition: .center)
+                        banner.show()
                     }
                 } else {
                     DispatchQueue.main.async {
-                        Nexilis.hideLoader {
-                            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: .center)
-                            banner.show()
-                            self.switchPrivateAccount.setOn(!value, animated: true)
-                        }
+                        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: .center)
+                        banner.show()
+                        self.switchPrivateAccount.setOn(!value, animated: true)
                     }
                 }
             }
@@ -348,6 +347,13 @@ public class ProfileViewController: UITableViewController {
             banner.show()
             return
         }
+        if !CheckConnection.isConnectedToNetwork() {
+            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
+        }
         let controller = QmeraAudioViewController()
         controller.user = user
         controller.isOutgoing = true
@@ -368,6 +374,13 @@ public class ProfileViewController: UITableViewController {
             banner.show()
             return
         }
+        if !CheckConnection.isConnectedToNetwork() {
+            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
+        }
         if let user = user {
             let videoVC = AppStoryBoard.Palio.instance.instantiateViewController(withIdentifier: "videoVCQmera") as! QmeraVideoViewController
             videoVC.fPin = user.pin
@@ -474,6 +487,10 @@ public class ProfileViewController: UITableViewController {
     }
     
     @objc func didTapAdd(sender: Any) {
+        if isLoadingAddFriend {
+            return
+        }
+        isLoadingAddFriend = true
         addFriend { result in
             DispatchQueue.main.async {
                 if result {
@@ -488,6 +505,7 @@ public class ProfileViewController: UITableViewController {
                     imageView.tintColor = .white
                     let banner = FloatingNotificationBanner(title: "Server busy, please try again later".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()
+                    self.isLoadingAddFriend = false
                 }
             }
         }

+ 1 - 1
appbuilder-ios/NexilisLite/NexilisLite/Source/View/Control/SignUpSignIn.swift

@@ -319,7 +319,7 @@ public class SignUpSignIn: UIViewController {
                             Nexilis.hideLoader(completion: {
                                 let imageView = UIImageView(image: UIImage(systemName: "checkmark.circle.fill"))
                                 imageView.tintColor = .white
-                                let banner = FloatingNotificationBanner(title: "Successfully changed".localized(), subtitle: nil, titleFont: UIFont.systemFont(ofSize: 16), titleColor: nil, titleTextAlign: .left, subtitleFont: nil, subtitleColor: nil, subtitleTextAlign: nil, leftView: imageView, rightView: nil, style: .success, colors: nil, iconPosition: .center)
+                                let banner = FloatingNotificationBanner(title: "Successfully Sign-Up".localized(), subtitle: nil, titleFont: UIFont.systemFont(ofSize: 16), titleColor: nil, titleTextAlign: .left, subtitleFont: nil, subtitleColor: nil, subtitleTextAlign: nil, leftView: imageView, rightView: nil, style: .success, colors: nil, iconPosition: .center)
                                 banner.show()
                                 if self.fromChangeNamePass{
                                     var vc = self.navigationController?.presentingViewController