ソースを参照

add status and secret message

alqindiirsyam 6 ヶ月 前
コミット
5687918112

+ 21 - 0
NexilisLite/NexilisLite/Resource/Assets.xcassets/pb_icon_ack_msg_on.imageset/Contents.json

@@ -0,0 +1,21 @@
+{
+  "images" : [
+    {
+      "filename" : "pb_icon_ack_msg_on.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
NexilisLite/NexilisLite/Resource/Assets.xcassets/pb_icon_ack_msg_on.imageset/pb_icon_ack_msg_on.png


+ 21 - 0
NexilisLite/NexilisLite/Resource/Assets.xcassets/pb_icon_conf_msg_on.imageset/Contents.json

@@ -0,0 +1,21 @@
+{
+  "images" : [
+    {
+      "filename" : "pb_icon_conf_msg_on.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
NexilisLite/NexilisLite/Resource/Assets.xcassets/pb_icon_conf_msg_on.imageset/pb_icon_conf_msg_on.png


+ 21 - 0
NexilisLite/NexilisLite/Resource/Assets.xcassets/pb_icon_secret_msg_on.imageset/Contents.json

@@ -0,0 +1,21 @@
+{
+  "images" : [
+    {
+      "filename" : "pb_icon_secret_msg_on.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
NexilisLite/NexilisLite/Resource/Assets.xcassets/pb_icon_secret_msg_on.imageset/pb_icon_secret_msg_on.png


+ 80 - 16
NexilisLite/NexilisLite/Resource/Palio.storyboard

@@ -761,16 +761,46 @@
                                                 <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="qrcode" catalog="system" translatesAutoresizingMaskIntoConstraints="NO" id="DO0-Q1-buB">
                                                     <rect key="frame" x="266" y="51" width="88" height="83.5"/>
                                                 </imageView>
+                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="zJO-fc-bwa">
+                                                    <rect key="frame" x="20" y="114" width="109" height="65"/>
+                                                    <subviews>
+                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Status: " textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Y9j-ww-76p">
+                                                            <rect key="frame" x="0.0" y="0.0" width="109" height="17"/>
+                                                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                                                            <nil key="textColor"/>
+                                                            <nil key="highlightedColor"/>
+                                                        </label>
+                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="KeQ-qi-YAX">
+                                                            <rect key="frame" x="0.0" y="14" width="109" height="51"/>
+                                                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                                                            <nil key="highlightedColor"/>
+                                                        </label>
+                                                    </subviews>
+                                                    <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                                    <constraints>
+                                                        <constraint firstAttribute="trailing" secondItem="Y9j-ww-76p" secondAttribute="trailing" id="2Cr-lv-mLw"/>
+                                                        <constraint firstItem="KeQ-qi-YAX" firstAttribute="leading" secondItem="zJO-fc-bwa" secondAttribute="leading" id="2YV-n5-UrZ"/>
+                                                        <constraint firstItem="Y9j-ww-76p" firstAttribute="top" secondItem="zJO-fc-bwa" secondAttribute="top" id="beT-lQ-tFz"/>
+                                                        <constraint firstItem="Y9j-ww-76p" firstAttribute="leading" secondItem="zJO-fc-bwa" secondAttribute="leading" id="ecR-XW-C3K"/>
+                                                        <constraint firstItem="KeQ-qi-YAX" firstAttribute="top" secondItem="zJO-fc-bwa" secondAttribute="top" constant="14" id="jnb-Sc-Der"/>
+                                                        <constraint firstAttribute="height" constant="65" id="kIh-LW-QXy"/>
+                                                        <constraint firstAttribute="bottom" secondItem="KeQ-qi-YAX" secondAttribute="bottom" id="mQ1-7G-Xss"/>
+                                                        <constraint firstAttribute="trailing" secondItem="KeQ-qi-YAX" secondAttribute="trailing" id="yUS-ls-pcX"/>
+                                                    </constraints>
+                                                </view>
                                             </subviews>
                                             <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                                             <constraints>
                                                 <constraint firstAttribute="trailingMargin" secondItem="40M-iH-oyA" secondAttribute="trailing" id="2Dq-Mc-H4d"/>
+                                                <constraint firstAttribute="bottomMargin" secondItem="zJO-fc-bwa" secondAttribute="bottom" constant="10" id="5c1-k2-GzU"/>
                                                 <constraint firstAttribute="bottom" secondItem="0K5-VL-Mqq" secondAttribute="bottom" id="7fF-SI-jIM"/>
                                                 <constraint firstItem="4Od-Bu-62G" firstAttribute="top" secondItem="Al4-Bd-c6i" secondAttribute="bottom" constant="8" symbolic="YES" id="A2c-If-gTE"/>
                                                 <constraint firstItem="0K5-VL-Mqq" firstAttribute="top" secondItem="lop-Ow-tJu" secondAttribute="top" id="KSw-ew-NOs"/>
                                                 <constraint firstItem="DO0-Q1-buB" firstAttribute="top" secondItem="Al4-Bd-c6i" secondAttribute="top" id="MbT-5H-j0z"/>
+                                                <constraint firstItem="Al4-Bd-c6i" firstAttribute="leading" secondItem="zJO-fc-bwa" secondAttribute="trailing" constant="8" symbolic="YES" id="OVD-60-3Ja"/>
                                                 <constraint firstItem="Al4-Bd-c6i" firstAttribute="centerX" secondItem="lop-Ow-tJu" secondAttribute="centerX" id="RCV-tS-V7i"/>
                                                 <constraint firstItem="4Od-Bu-62G" firstAttribute="centerX" secondItem="lop-Ow-tJu" secondAttribute="centerX" id="WaS-Yt-ldB"/>
+                                                <constraint firstItem="zJO-fc-bwa" firstAttribute="leading" secondItem="lop-Ow-tJu" secondAttribute="leadingMargin" id="Zc0-FQ-Jx5"/>
                                                 <constraint firstItem="DO0-Q1-buB" firstAttribute="leading" secondItem="Al4-Bd-c6i" secondAttribute="trailing" constant="29" id="bXi-AA-C5d"/>
                                                 <constraint firstItem="0K5-VL-Mqq" firstAttribute="leading" secondItem="lop-Ow-tJu" secondAttribute="leading" id="dG1-3T-Dc8"/>
                                                 <constraint firstAttribute="trailing" secondItem="0K5-VL-Mqq" secondAttribute="trailing" id="dvH-ey-GNH"/>
@@ -797,23 +827,23 @@
                                                 <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="VAe-OS-2Uz">
                                                     <rect key="frame" x="0.0" y="0.0" width="374" height="56"/>
                                                     <subviews>
-                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Private Account Mode" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Nvg-uC-lAp">
-                                                            <rect key="frame" x="8" y="10" width="151" height="18"/>
+                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Status : " textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="cfz-be-1yu">
+                                                            <rect key="frame" x="8" y="10" width="56.5" height="18"/>
                                                             <constraints>
-                                                                <constraint firstAttribute="height" constant="18" id="Jn1-al-TPl"/>
+                                                                <constraint firstAttribute="height" constant="18" id="HGg-MY-reS"/>
                                                             </constraints>
                                                             <fontDescription key="fontDescription" type="system" pointSize="15"/>
                                                             <nil key="textColor"/>
                                                             <nil key="highlightedColor"/>
                                                         </label>
                                                         <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Change Password" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="UZm-64-k1t">
-                                                            <rect key="frame" x="8" y="48" width="123" height="18"/>
+                                                            <rect key="frame" x="8" y="86" width="123" height="18"/>
                                                             <fontDescription key="fontDescription" type="system" pointSize="15"/>
                                                             <nil key="textColor"/>
                                                             <nil key="highlightedColor"/>
                                                         </label>
                                                         <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Accept Call" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="OlC-4h-ULU">
-                                                            <rect key="frame" x="8" y="86" width="78" height="18"/>
+                                                            <rect key="frame" x="8" y="124" width="78" height="18"/>
                                                             <constraints>
                                                                 <constraint firstAttribute="height" constant="18" id="GCl-H2-MeB"/>
                                                             </constraints>
@@ -822,23 +852,23 @@
                                                             <nil key="highlightedColor"/>
                                                         </label>
                                                         <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="NYg-hJ-SNM">
-                                                            <rect key="frame" x="8" y="124" width="358" height="34.5"/>
+                                                            <rect key="frame" x="8" y="162" width="358" height="34.5"/>
                                                             <color key="tintColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                                                             <state key="normal" title="Button"/>
                                                             <buttonConfiguration key="configuration" style="filled" title="Contact Center History"/>
                                                         </button>
                                                         <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="9ck-VQ-0zT">
-                                                            <rect key="frame" x="8" y="178.5" width="358" height="34.5"/>
+                                                            <rect key="frame" x="8" y="216.5" width="358" height="34.5"/>
                                                             <color key="tintColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                                                             <state key="normal" title="Button"/>
                                                             <buttonConfiguration key="configuration" style="filled" title="Contact Center History"/>
                                                         </button>
                                                         <switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" translatesAutoresizingMaskIntoConstraints="NO" id="oaQ-vC-3bV">
-                                                            <rect key="frame" x="315" y="4" width="51" height="30"/>
+                                                            <rect key="frame" x="315" y="41.5" width="51" height="31"/>
                                                             <color key="onTintColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                                                         </switch>
                                                         <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="ndh-T2-T4k">
-                                                            <rect key="frame" x="334" y="45" width="30" height="24"/>
+                                                            <rect key="frame" x="334" y="84" width="30" height="22"/>
                                                             <constraints>
                                                                 <constraint firstAttribute="width" constant="30" id="gGC-QS-Ghx"/>
                                                             </constraints>
@@ -847,32 +877,61 @@
                                                             <state key="normal" image="pencil" catalog="system"/>
                                                         </button>
                                                         <switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="imY-6r-cWB">
-                                                            <rect key="frame" x="315" y="81" width="51" height="28"/>
+                                                            <rect key="frame" x="315" y="117.5" width="51" height="31"/>
                                                             <color key="onTintColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                                                         </switch>
+                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Private Account Mode" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Nvg-uC-lAp">
+                                                            <rect key="frame" x="8" y="48" width="151" height="18"/>
+                                                            <constraints>
+                                                                <constraint firstAttribute="height" constant="18" id="Jn1-al-TPl"/>
+                                                            </constraints>
+                                                            <fontDescription key="fontDescription" type="system" pointSize="15"/>
+                                                            <nil key="textColor"/>
+                                                            <nil key="highlightedColor"/>
+                                                        </label>
+                                                        <textField opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="248" contentHorizontalAlignment="left" contentVerticalAlignment="center" textAlignment="natural" minimumFontSize="15" translatesAutoresizingMaskIntoConstraints="NO" id="XDp-0n-1Ac">
+                                                            <rect key="frame" x="72.5" y="10" width="253.5" height="18.5"/>
+                                                            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                                            <color key="textColor" white="0.33333333333333331" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                                                            <textInputTraits key="textInputTraits"/>
+                                                        </textField>
+                                                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="QTX-kG-4PZ">
+                                                            <rect key="frame" x="334" y="8" width="30" height="22.5"/>
+                                                            <constraints>
+                                                                <constraint firstAttribute="width" constant="30" id="ODM-eh-vGn"/>
+                                                            </constraints>
+                                                            <color key="tintColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                                            <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                                                            <state key="normal" image="tray.and.arrow.down.fill" catalog="system"/>
+                                                        </button>
                                                     </subviews>
-                                                    <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                                     <constraints>
+                                                        <constraint firstItem="cfz-be-1yu" firstAttribute="top" secondItem="VAe-OS-2Uz" secondAttribute="top" constant="10" id="0vt-TS-e7P"/>
                                                         <constraint firstAttribute="trailing" secondItem="9ck-VQ-0zT" secondAttribute="trailing" constant="8" id="3qz-IZ-OXh"/>
                                                         <constraint firstItem="UZm-64-k1t" firstAttribute="leading" secondItem="VAe-OS-2Uz" secondAttribute="leading" constant="8" id="4n3-85-Ctg"/>
                                                         <constraint firstItem="NYg-hJ-SNM" firstAttribute="leading" secondItem="9ck-VQ-0zT" secondAttribute="leading" id="7ce-4Q-obd"/>
                                                         <constraint firstItem="9ck-VQ-0zT" firstAttribute="leading" secondItem="VAe-OS-2Uz" secondAttribute="leading" constant="8" id="8aj-Af-5I0"/>
+                                                        <constraint firstItem="cfz-be-1yu" firstAttribute="leading" secondItem="VAe-OS-2Uz" secondAttribute="leading" constant="8" id="9pb-sd-rYj"/>
+                                                        <constraint firstItem="QTX-kG-4PZ" firstAttribute="leading" secondItem="XDp-0n-1Ac" secondAttribute="trailing" constant="8" symbolic="YES" id="BM5-5R-LiY"/>
                                                         <constraint firstItem="Nvg-uC-lAp" firstAttribute="centerY" secondItem="oaQ-vC-3bV" secondAttribute="centerY" id="H4C-Gj-Rf3"/>
                                                         <constraint firstAttribute="trailing" secondItem="NYg-hJ-SNM" secondAttribute="trailing" constant="8" id="LnI-x9-osh"/>
                                                         <constraint firstItem="OlC-4h-ULU" firstAttribute="top" secondItem="UZm-64-k1t" secondAttribute="bottom" constant="20" id="MSs-KT-Nbb"/>
                                                         <constraint firstItem="NYg-hJ-SNM" firstAttribute="leading" secondItem="VAe-OS-2Uz" secondAttribute="leading" constant="8" id="Nwb-nO-veO"/>
                                                         <constraint firstItem="NYg-hJ-SNM" firstAttribute="trailing" secondItem="9ck-VQ-0zT" secondAttribute="trailing" id="OTx-pJ-KGk"/>
-                                                        <constraint firstItem="oaQ-vC-3bV" firstAttribute="top" secondItem="VAe-OS-2Uz" secondAttribute="top" constant="4" id="PdZ-sO-FkE"/>
                                                         <constraint firstItem="UZm-64-k1t" firstAttribute="centerY" secondItem="ndh-T2-T4k" secondAttribute="centerY" id="Vqx-zA-7Ll"/>
+                                                        <constraint firstItem="XDp-0n-1Ac" firstAttribute="leading" secondItem="cfz-be-1yu" secondAttribute="trailing" constant="8" symbolic="YES" id="Wbj-7A-frl"/>
+                                                        <constraint firstAttribute="trailing" secondItem="QTX-kG-4PZ" secondAttribute="trailing" constant="10" id="YqU-cM-HZG"/>
                                                         <constraint firstItem="Nvg-uC-lAp" firstAttribute="leading" secondItem="VAe-OS-2Uz" secondAttribute="leading" constant="8" id="aPf-gw-zHh"/>
-                                                        <constraint firstItem="Nvg-uC-lAp" firstAttribute="top" secondItem="VAe-OS-2Uz" secondAttribute="top" constant="10" id="dL5-hu-okT"/>
+                                                        <constraint firstItem="QTX-kG-4PZ" firstAttribute="centerY" secondItem="cfz-be-1yu" secondAttribute="centerY" id="bfH-ti-D23"/>
+                                                        <constraint firstItem="XDp-0n-1Ac" firstAttribute="centerY" secondItem="cfz-be-1yu" secondAttribute="centerY" id="fUN-Hq-QMT"/>
                                                         <constraint firstAttribute="trailing" secondItem="ndh-T2-T4k" secondAttribute="trailing" constant="10" id="gYT-v9-fMl"/>
+                                                        <constraint firstItem="Nvg-uC-lAp" firstAttribute="top" secondItem="cfz-be-1yu" secondAttribute="bottom" constant="20" id="h4O-UV-P7b"/>
                                                         <constraint firstItem="9ck-VQ-0zT" firstAttribute="top" secondItem="NYg-hJ-SNM" secondAttribute="bottom" constant="20" id="hd8-cb-3cf"/>
-                                                        <constraint firstItem="ndh-T2-T4k" firstAttribute="top" secondItem="oaQ-vC-3bV" secondAttribute="bottom" constant="11" id="hjp-T9-vfG"/>
                                                         <constraint firstItem="OlC-4h-ULU" firstAttribute="leading" secondItem="VAe-OS-2Uz" secondAttribute="leading" constant="8" id="jyO-T1-gct"/>
                                                         <constraint firstItem="UZm-64-k1t" firstAttribute="top" secondItem="Nvg-uC-lAp" secondAttribute="bottom" constant="20" id="m0i-iW-ewF"/>
                                                         <constraint firstAttribute="trailing" secondItem="oaQ-vC-3bV" secondAttribute="trailing" constant="10" id="mOt-ZV-H73"/>
-                                                        <constraint firstItem="imY-6r-cWB" firstAttribute="top" secondItem="ndh-T2-T4k" secondAttribute="bottom" constant="12" id="ou6-U8-wKO"/>
                                                         <constraint firstItem="OlC-4h-ULU" firstAttribute="centerY" secondItem="imY-6r-cWB" secondAttribute="centerY" id="pYl-dW-VUg"/>
                                                         <constraint firstItem="NYg-hJ-SNM" firstAttribute="top" secondItem="OlC-4h-ULU" secondAttribute="bottom" constant="20" id="vRo-9J-ngF"/>
                                                         <constraint firstAttribute="trailing" secondItem="imY-6r-cWB" secondAttribute="trailing" constant="10" id="zBO-83-eUD"/>
@@ -897,7 +956,7 @@
                                                             <state key="normal" image="message.fill" catalog="system"/>
                                                         </button>
                                                     </subviews>
-                                                    <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                                 </stackView>
                                             </subviews>
                                             <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
@@ -927,8 +986,11 @@
                         <outlet property="buttonEditpass" destination="ndh-T2-T4k" id="d12-ra-06C"/>
                         <outlet property="buttonGroup" destination="iZk-GF-RJR" id="mQl-wh-jCZ"/>
                         <outlet property="buttonHistoryCC" destination="NYg-hJ-SNM" id="1ah-Tv-T3l"/>
+                        <outlet property="buttonSaveStatus" destination="QTX-kG-4PZ" id="IoL-uz-dzf"/>
                         <outlet property="call" destination="8T1-2m-3h5" id="i1Z-n0-cmD"/>
+                        <outlet property="contStatusFriend" destination="zJO-fc-bwa" id="WO5-qS-g14"/>
                         <outlet property="countFriend" destination="yNx-gJ-gXq" id="d2Q-CD-5xn"/>
+                        <outlet property="editTextStatus" destination="XDp-0n-1Ac" id="njW-Pa-Lu4"/>
                         <outlet property="imageUserType" destination="yKV-8p-D06" id="TfH-As-6uv"/>
                         <outlet property="labelAcceptCall" destination="OlC-4h-ULU" id="1Qo-ss-UzI"/>
                         <outlet property="labelChangePassword" destination="UZm-64-k1t" id="VZy-hO-WMj"/>
@@ -938,6 +1000,7 @@
                         <outlet property="myViewGroup" destination="VAe-OS-2Uz" id="kTG-Mv-YKl"/>
                         <outlet property="profile" destination="Al4-Bd-c6i" id="skq-v9-LHa"/>
                         <outlet property="qrImage" destination="DO0-Q1-buB" id="V7M-Ge-e41"/>
+                        <outlet property="statusFriend" destination="KeQ-qi-YAX" id="wP6-UV-CBm"/>
                         <outlet property="switchAcceptCall" destination="imY-6r-cWB" id="Klz-Le-70y"/>
                         <outlet property="switchPrivateAccount" destination="oaQ-vC-3bV" id="bTI-fM-xc6"/>
                         <outlet property="video" destination="Opk-qK-mSQ" id="DkR-nl-nae"/>
@@ -3351,6 +3414,7 @@
         <image name="speaker.slash.fill" catalog="system" width="115" height="128"/>
         <image name="speaker.wave.3.fill" catalog="system" width="128" height="84"/>
         <image name="trash.circle.fill" catalog="system" width="128" height="123"/>
+        <image name="tray.and.arrow.down.fill" catalog="system" width="128" height="115"/>
         <image name="video" catalog="system" width="128" height="82"/>
         <image name="video.fill" catalog="system" width="128" height="81"/>
         <image name="xmark.circle.fill" catalog="system" width="128" height="123"/>

+ 13 - 1
NexilisLite/NexilisLite/Source/CoreMessage_TMessageBank.swift

@@ -147,7 +147,7 @@ public class CoreMessage_TMessageBank {
         return tmessage
     }
     
-    public static func sendMessage(message_id: String = "", l_pin: String, message_scope_id: String, status: String, message_text: String, credential: String, attachment_flag: String, ex_blog_id: String, message_large_text: String, ex_format: String, image_id: String, audio_id: String, video_id: String, file_id: String, thumb_id: String, reff_id: String, read_receipts: String, chat_id: String, is_call_center: String, call_center_id: String, opposite_pin: String, gif_id: String = "", isForwarded: String = "") -> TMessage {
+    public static func sendMessage(message_id: String = "", l_pin: String, message_scope_id: String, status: String, message_text: String, credential: String, attachment_flag: String, ex_blog_id: String, message_large_text: String, ex_format: String, image_id: String, audio_id: String, video_id: String, file_id: String, thumb_id: String, reff_id: String, read_receipts: String, chat_id: String, is_call_center: String, call_center_id: String, opposite_pin: String, gif_id: String = "", isForwarded: String = "", isSecret: String = "") -> TMessage {
         let me = User.getMyPin()!
         let tmessage = TMessage()
         tmessage.mCode = CoreMessage_TMessageCode.SEND_CHAT
@@ -202,6 +202,7 @@ public class CoreMessage_TMessageBank {
             tmessage.mBodies[CoreMessage_TMessageKey.GIF_ID] = gif_id
         }
         tmessage.mBodies[CoreMessage_TMessageKey.IS_FORWARDED_MESSAGE] = isForwarded
+        tmessage.mBodies[CoreMessage_TMessageKey.IS_SECRET] = isSecret
         return tmessage
     }
     
@@ -1129,6 +1130,17 @@ public class CoreMessage_TMessageBank {
         tmessage.mBodies[CoreMessage_TMessageKey.LAST_NAME] = lastname
         return tmessage
     }
+    public static func getChangePersonInfoAutoQuote(f_pin: String, autoQuoteType: String, autoQuote: String) -> TMessage {
+        let me = User.getMyPin()!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.SET_AUTO_QUOTE
+        tmessage.mPIN = f_pin
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mBodies[CoreMessage_TMessageKey.AUTO_QUOTE] = autoQuote
+        tmessage.mBodies[CoreMessage_TMessageKey.AUTO_QUOTE_TYPE] = autoQuoteType
+        tmessage.mBodies[CoreMessage_TMessageKey.CREATED_DATE] = "\(Date().currentTimeMillis())"
+        return tmessage
+    }
     public static func getChangePersonInfoEmail(email:String) -> TMessage {
         let me = User.getMyPin()!
         let tmessage = TMessage()

+ 10 - 5
NexilisLite/NexilisLite/Source/Model/User.swift

@@ -21,6 +21,7 @@ public class User: Model {
     public var ex_block: String?
     public var ex_offmp: String?
     public var device_id: String
+    public var status: String
     
     public var isSelected: Bool = false
     public var isMuted: Bool = false
@@ -36,9 +37,10 @@ public class User: Model {
         self.ex_block = ""
         self.ex_offmp = ""
         self.device_id = ""
+        self.status = ""
     }
     
-    public init(pin: String, firstName: String, lastName: String, thumb: String, userType: String = "0", privacy_flag: String = "", offline_mode: String = "", ex_block: String = "", official: String = "", ex_offmp: String = "", device_id: String = "") {
+    public init(pin: String, firstName: String, lastName: String, thumb: String, userType: String = "0", privacy_flag: String = "", offline_mode: String = "", ex_block: String = "", official: String = "", ex_offmp: String = "", device_id: String = "", status: String = "") {
         self.pin = pin
         self.firstName = firstName
         self.lastName = lastName
@@ -50,6 +52,7 @@ public class User: Model {
         self.ex_block = ex_block
         self.ex_offmp = ex_offmp
         self.device_id = device_id
+        self.status = status
     }
     
     public static func == (lhs: User, rhs: User) -> Bool {
@@ -130,7 +133,7 @@ public class User: Model {
         }
         var user: User?
         if fmdb != nil {
-            if let cursor = Database.shared.getRecords(fmdb: fmdb!, query: "select f_pin, first_name, last_name, image_id, user_type, privacy_flag, offline_mode, ex_block, device_id, official_account from BUDDY where f_pin = '\(pin)' OR device_id = '\(pin)'"), cursor.next() {
+            if let cursor = Database.shared.getRecords(fmdb: fmdb!, query: "select f_pin, first_name, last_name, image_id, user_type, privacy_flag, offline_mode, ex_block, device_id, official_account, quote from BUDDY where f_pin = '\(pin)' OR device_id = '\(pin)'"), cursor.next() {
                 user = User(pin: cursor.string(forColumnIndex: 0) ?? "",
                             firstName: cursor.string(forColumnIndex: 1) ?? "",
                             lastName: cursor.string(forColumnIndex: 2) ?? "",
@@ -140,7 +143,8 @@ public class User: Model {
                             offline_mode: cursor.string(forColumnIndex: 6) ?? "",
                             ex_block: cursor.string(forColumnIndex: 7) ?? "",
                             official: cursor.string(forColumnIndex: 9) ?? "",
-                            device_id: cursor.string(forColumnIndex: 8) ?? "")
+                            device_id: cursor.string(forColumnIndex: 8) ?? "",
+                            status: cursor.string(forColumnIndex: 10) ?? "")
                 cursor.close()
             } else {
                 user = User(pin: pin,
@@ -155,7 +159,7 @@ public class User: Model {
         } else {
             Database.shared.database?.inTransaction({ fmdb, rollback in
                 do {
-                    if let cursor = Database.shared.getRecords(fmdb: fmdb, query: "select f_pin, first_name, last_name, image_id, user_type, privacy_flag, offline_mode, ex_block, device_id, official_account from BUDDY where f_pin = '\(pin)' OR device_id = '\(pin)'"), cursor.next() {
+                    if let cursor = Database.shared.getRecords(fmdb: fmdb, query: "select f_pin, first_name, last_name, image_id, user_type, privacy_flag, offline_mode, ex_block, device_id, official_account, quote from BUDDY where f_pin = '\(pin)' OR device_id = '\(pin)'"), cursor.next() {
                         user = User(pin: cursor.string(forColumnIndex: 0) ?? "",
                                     firstName: cursor.string(forColumnIndex: 1) ?? "",
                                     lastName: cursor.string(forColumnIndex: 2) ?? "",
@@ -165,7 +169,8 @@ public class User: Model {
                                     offline_mode: cursor.string(forColumnIndex: 6) ?? "",
                                     ex_block: cursor.string(forColumnIndex: 7) ?? "",
                                     official: cursor.string(forColumnIndex: 9) ?? "",
-                                    device_id: cursor.string(forColumnIndex: 8) ?? "")
+                                    device_id: cursor.string(forColumnIndex: 8) ?? "",
+                                    status: cursor.string(forColumnIndex: 10) ?? "")
                         cursor.close()
                     } else {
                         user = User(pin: pin,

+ 7 - 1
NexilisLite/NexilisLite/Source/Nexilis.swift

@@ -3568,7 +3568,13 @@ extension Nexilis: MessageDelegate {
                 let messageScopeId = CoreMessage_TMessageKey.MESSAGE_SCOPE_ID
                 let messageText = CoreMessage_TMessageKey.MESSAGE_TEXT
                 let credential = CoreMessage_TMessageKey.CREDENTIAL
-                if !message.getBody(key: imageId).isEmpty {
+                let gif_id = CoreMessage_TMessageKey.GIF_ID
+                let is_secret = CoreMessage_TMessageKey.IS_SECRET
+                if message.getBody(key: is_secret) == "1" {
+                  text = "You got messages..."
+                } else if message.getBody(key: gif_id) != "" {
+                  text = "Sent GIF 🎬"
+                } else if !message.getBody(key: imageId).isEmpty {
                     text = "Sent Image 📷"
                 } else if message.getBody(key: attachmentFlag) == "11" {
                     text = "Sent Sticker ❤️"

+ 20 - 8
NexilisLite/NexilisLite/Source/View/Chat/EditorGroup.swift

@@ -236,7 +236,7 @@ public class EditorGroup: UIViewController, CLLocationManagerDelegate {
         if dataMessageForward != nil {
             for i in 0..<dataMessageForward!.count {
                 let isForwarded = (dataMessageForward![i][TypeDataMessage.is_forwarded] as? Int) ?? 0
-                sendChat(message_scope_id: "4", status: "2", message_text: dataMessageForward![i]["message_text"] as! String, credential: "0", attachment_flag: dataMessageForward![i]["attachment_flag"] as! String, ex_blog_id: "", message_large_text: "", ex_format: "", image_id: dataMessageForward![i]["image_id"] as! String, audio_id: dataMessageForward![i]["audio_id"] as! String, video_id: dataMessageForward![i]["video_id"] as! String, file_id: dataMessageForward![i]["file_id"] as! String, thumb_id: dataMessageForward![i]["thumb_id"] as! String, reff_id: "", read_receipts: "", is_call_center: "0", call_center_id: "", viewController: self, is_forwarded: isForwarded + 1)
+                sendChat(message_scope_id: "4", status: "2", message_text: dataMessageForward![i]["message_text"] as! String, credential: "0", attachment_flag: dataMessageForward![i]["attachment_flag"] as! String, ex_blog_id: "", message_large_text: "", ex_format: "", image_id: dataMessageForward![i]["image_id"] as! String, audio_id: dataMessageForward![i]["audio_id"] as! String, video_id: dataMessageForward![i]["video_id"] as! String, file_id: dataMessageForward![i]["file_id"] as! String, thumb_id: dataMessageForward![i]["thumb_id"] as! String, reff_id: "", read_receipts: "", is_call_center: "0", call_center_id: "", viewController: self, gif_id: dataMessageForward![i][TypeDataMessage.gif_id] as! String, is_forwarded: isForwarded + 1)
             }
             dataMessageForward = nil
         }
@@ -1047,7 +1047,7 @@ public class EditorGroup: UIViewController, CLLocationManagerDelegate {
                     row["reff_id"] = chatData[CoreMessage_TMessageKey.REF_ID] ?? ""
                     row["lock"] = ""
                     row["is_stared"] = "0"
-                    row[TypeDataMessage.is_forwarded] = chatData[CoreMessage_TMessageKey.IS_FORWARDED_MESSAGE]
+                    row[TypeDataMessage.is_forwarded] = Int(chatData[CoreMessage_TMessageKey.IS_FORWARDED_MESSAGE] ?? "0")
                     row["isSelected"] = false
                     if !self.dataDates.contains("Today".localized()){
                         self.dataDates.append("Today".localized())
@@ -1655,21 +1655,25 @@ public class EditorGroup: UIViewController, CLLocationManagerDelegate {
     
     @objc func showChooserACKConfidential() {
         let alertController = LibAlertController(title: "Message Mode".localized(), message: "Select".localized() + " " + "Message Mode".localized(), preferredStyle: .actionSheet)
-        let imageConfidential = resizeImage(image: UIImage(named: "confidential_icon", in: Bundle.resourceBundle(for: Nexilis.self), with: nil)!, targetSize: CGSize(width: 30, height: 30)).withRenderingMode(.alwaysOriginal)
-        let imageAck = resizeImage(image: UIImage(named: "ack_icon", in: Bundle.resourceBundle(for: Nexilis.self), with: nil)!, targetSize: CGSize(width: 30, height: 30)).withRenderingMode(.alwaysOriginal)
+        let imageConfidential = resizeImage(image: UIImage(named: "pb_icon_conf_msg_on", in: Bundle.resourceBundle(for: Nexilis.self), with: nil)!, targetSize: CGSize(width: 30, height: 30)).withRenderingMode(.alwaysOriginal)
+        let imageAck = resizeImage(image: UIImage(named: "pb_icon_ack_msg_on", in: Bundle.resourceBundle(for: Nexilis.self), with: nil)!, targetSize: CGSize(width: 30, height: 30)).withRenderingMode(.alwaysOriginal)
         let confidentialAction = UIAlertAction(title: "Confidential Message".localized(), style: .default, handler: { (UIAlertAction) in
-            if !self.isConfidential {
-                self.isConfidential = true
+            self.isConfidential = !self.isConfidential
+            if self.isConfidential {
                 self.buttonAckConfidential.setImage(imageConfidential, for: .normal)
+            } else {
+                self.buttonAckConfidential.setImage(UIImage(systemName: "gearshape.fill", withConfiguration: UIImage.SymbolConfiguration(scale: .large))?.withTintColor(.white).withRenderingMode(.alwaysTemplate), for: .normal)
             }
             if self.isAck {
                 self.isAck = false
             }
         })
         let ackAction = UIAlertAction(title: "Confirmation Message".localized(), style: .default, handler: { (UIAlertAction) in
-            if !self.isAck {
-                self.isAck = true
+            self.isAck = !self.isAck
+            if self.isAck {
                 self.buttonAckConfidential.setImage(imageAck, for: .normal)
+            } else {
+                self.buttonAckConfidential.setImage(UIImage(systemName: "gearshape.fill", withConfiguration: UIImage.SymbolConfiguration(scale: .large))?.withTintColor(.white).withRenderingMode(.alwaysTemplate), for: .normal)
             }
             if self.isConfidential {
                 self.isConfidential = false
@@ -3351,6 +3355,12 @@ extension EditorGroup: UIContextMenuInteractionDelegate {
             if self.viewAttachment.isHidden {
                 self.viewAttachment.isHidden = false
             }
+            if self.containerAction.isHidden {
+                self.containerAction.isHidden = false
+            }
+            if self.viewButton.isHidden {
+                self.viewButton.isHidden = false
+            }
             if self.constraintBottomTableViewWithTextfield.constant == -60.0 {
                 self.constraintBottomTableViewWithTextfield.constant = self.constraintBottomTableViewWithTextfield.constant + 70
                 DispatchQueue.main.asyncAfter(deadline: .now() + 0.3, execute: {
@@ -3379,6 +3389,8 @@ extension EditorGroup: UIContextMenuInteractionDelegate {
     private func addMultipleSelectSession() {
         viewTextfield.isHidden = true
         viewAttachment.isHidden = true
+        containerAction.isHidden = true
+        viewButton.isHidden = true
         constraintBottomTableViewWithTextfield.constant = constraintBottomTableViewWithTextfield.constant - 70
         view.addSubview(containerMultpileSelectSession)
         containerMultpileSelectSession.translatesAutoresizingMaskIntoConstraints = false

+ 44 - 10
NexilisLite/NexilisLite/Source/View/Chat/EditorPersonal.swift

@@ -69,6 +69,7 @@ public class EditorPersonal: UIViewController, ImageVideoPickerDelegate, UIGestu
     var removed = false
     var isConfidential = false
     var isAck = false
+    var isSecret = false
     let viewSticker = UIView()
     let containerLink = UIView()
     let containerPreviewReply = UIView()
@@ -255,7 +256,7 @@ public class EditorPersonal: UIViewController, ImageVideoPickerDelegate, UIGestu
         if dataMessageForward != nil {
             for i in 0..<dataMessageForward!.count {
                 let isForwarded = (dataMessageForward![i][TypeDataMessage.is_forwarded] as? Int) ?? 0
-                sendChat(message_scope_id: "3", status: "2", message_text: dataMessageForward![i]["message_text"] as! String, credential: "0", attachment_flag: dataMessageForward![i]["attachment_flag"] as! String, ex_blog_id: "", message_large_text: "", ex_format: "", image_id: dataMessageForward![i]["image_id"] as! String, audio_id: dataMessageForward![i]["audio_id"] as! String, video_id: dataMessageForward![i]["video_id"] as! String, file_id: dataMessageForward![i]["file_id"] as! String, thumb_id: dataMessageForward![i]["thumb_id"] as! String, reff_id: "", read_receipts: dataMessageForward![i]["read_receipts"] as! String, chat_id: "", is_call_center: "0", call_center_id: "", viewController: self, is_forwarded: isForwarded + 1)
+                sendChat(message_scope_id: "3", status: "2", message_text: dataMessageForward![i]["message_text"] as! String, credential: "0", attachment_flag: dataMessageForward![i]["attachment_flag"] as! String, ex_blog_id: "", message_large_text: "", ex_format: "", image_id: dataMessageForward![i]["image_id"] as! String, audio_id: dataMessageForward![i]["audio_id"] as! String, video_id: dataMessageForward![i]["video_id"] as! String, file_id: dataMessageForward![i]["file_id"] as! String, thumb_id: dataMessageForward![i]["thumb_id"] as! String, reff_id: "", read_receipts: dataMessageForward![i]["read_receipts"] as! String, chat_id: "", is_call_center: "0", call_center_id: "", viewController: self, gif_id: dataMessageForward![i][TypeDataMessage.gif_id] as! String, is_forwarded: isForwarded + 1, is_secret: (dataMessageForward![i][TypeDataMessage.is_secret] as? Int) ?? 0)
             }
             dataMessageForward = nil
         }
@@ -1609,7 +1610,7 @@ public class EditorPersonal: UIViewController, ImageVideoPickerDelegate, UIGestu
                     row["reff_id"] = chatData[CoreMessage_TMessageKey.REF_ID] ?? ""
                     row["lock"] = ""
                     row["is_stared"] = "0"
-                    row[TypeDataMessage.is_forwarded] = chatData[CoreMessage_TMessageKey.IS_FORWARDED_MESSAGE]
+                    row[TypeDataMessage.is_forwarded] = Int(chatData[CoreMessage_TMessageKey.IS_FORWARDED_MESSAGE] ?? "0")
                     row["isSelected"] = false
                     if !self.dataDates.contains("Today".localized()) {
                         self.dataDates.append("Today".localized())
@@ -2195,33 +2196,61 @@ public class EditorPersonal: UIViewController, ImageVideoPickerDelegate, UIGestu
     
     @objc func showChooserACKConfidential() {
         let alertController = LibAlertController(title: "Message Mode".localized(), message: "Select".localized() + " " + "Message Mode".localized(), preferredStyle: .actionSheet)
-        let imageConfidential = resizeImage(image: UIImage(named: "confidential_icon", in: Bundle.resourceBundle(for: Nexilis.self), with: nil)!, targetSize: CGSize(width: 30, height: 30)).withRenderingMode(.alwaysOriginal)
-        let imageAck = resizeImage(image: UIImage(named: "ack_icon", in: Bundle.resourceBundle(for: Nexilis.self), with: nil)!, targetSize: CGSize(width: 30, height: 30)).withRenderingMode(.alwaysOriginal)
+        let imageConfidential = resizeImage(image: UIImage(named: "pb_icon_conf_msg_on", in: Bundle.resourceBundle(for: Nexilis.self), with: nil)!, targetSize: CGSize(width: 30, height: 30)).withRenderingMode(.alwaysOriginal)
+        let imageAck = resizeImage(image: UIImage(named: "pb_icon_ack_msg_on", in: Bundle.resourceBundle(for: Nexilis.self), with: nil)!, targetSize: CGSize(width: 30, height: 30)).withRenderingMode(.alwaysOriginal)
+        let imageSecret = resizeImage(image: UIImage(named: "pb_icon_secret_msg_on", in: Bundle.resourceBundle(for: Nexilis.self), with: nil)!, targetSize: CGSize(width: 30, height: 30)).withRenderingMode(.alwaysOriginal)
         let confidentialAction = UIAlertAction(title: "Confidential Message".localized(), style: .default, handler: { (UIAlertAction) in
-            if !self.isConfidential {
-                self.isConfidential = true
+            self.isConfidential = !self.isConfidential
+            if self.isConfidential {
                 self.buttonAckConfidential.setImage(imageConfidential, for: .normal)
+            } else {
+                self.buttonAckConfidential.setImage(UIImage(systemName: "gearshape.fill", withConfiguration: UIImage.SymbolConfiguration(scale: .large))?.withTintColor(.white).withRenderingMode(.alwaysTemplate), for: .normal)
             }
             if self.isAck {
                 self.isAck = false
             }
+            if self.isSecret {
+                self.isSecret = false
+            }
         })
         let ackAction = UIAlertAction(title: "Confirmation Message".localized(), style: .default, handler: { (UIAlertAction) in
-            if !self.isAck {
-                self.isAck = true
+            self.isAck = !self.isAck
+            if self.isAck {
                 self.buttonAckConfidential.setImage(imageAck, for: .normal)
+            } else {
+                self.buttonAckConfidential.setImage(UIImage(systemName: "gearshape.fill", withConfiguration: UIImage.SymbolConfiguration(scale: .large))?.withTintColor(.white).withRenderingMode(.alwaysTemplate), for: .normal)
+            }
+            if self.isConfidential {
+                self.isConfidential = false
+            }
+            if self.isSecret {
+                self.isSecret = false
+            }
+        })
+        let secretAction = UIAlertAction(title: "Secret Message".localized(), style: .default, handler: { (UIAlertAction) in
+            self.isSecret = !self.isSecret
+            if self.isSecret {
+                self.buttonAckConfidential.setImage(imageSecret, for: .normal)
+            } else {
+                self.buttonAckConfidential.setImage(UIImage(systemName: "gearshape.fill", withConfiguration: UIImage.SymbolConfiguration(scale: .large))?.withTintColor(.white).withRenderingMode(.alwaysTemplate), for: .normal)
             }
             if self.isConfidential {
                 self.isConfidential = false
             }
+            if self.isAck {
+                self.isAck = false
+            }
         })
         confidentialAction.setValue(imageConfidential, forKey: "image")
         ackAction.setValue(imageAck, forKey: "image")
+        secretAction.setValue(imageSecret, forKey: "image")
         alertController.addAction(confidentialAction)
         alertController.addAction(ackAction)
+        alertController.addAction(secretAction)
         alertController.addAction(UIAlertAction(title: "Cancel".localized(), style: .cancel, handler: { (UIAlertAction) in
             self.isConfidential = false
             self.isAck = false
+            self.isSecret = false
             self.buttonAckConfidential.setImage(UIImage(systemName: "gearshape.fill", withConfiguration: UIImage.SymbolConfiguration(scale: .large))?.withTintColor(.white).withRenderingMode(.alwaysTemplate), for: .normal)
         }))
         self.present(alertController, animated: true, completion: nil)
@@ -2454,7 +2483,7 @@ public class EditorPersonal: UIViewController, ImageVideoPickerDelegate, UIGestu
         }
     }
     
-    private func sendChat(message_scope_id:String =  "3", status:String =  "1", message_text:String =  "", credential:String = "0", attachment_flag: String = "0", ex_blog_id: String = "", message_large_text: String = "", ex_format: String = "", image_id: String = "", audio_id: String = "", video_id: String = "", file_id: String = "", thumb_id: String = "", reff_id: String = "", read_receipts: String = "4", chat_id: String = "", is_call_center: String = "0", call_center_id: String = "", viewController: UIViewController, isAutoSendCC : Bool = false, gif_id: String = "", is_forwarded: Int = 0) {
+    private func sendChat(message_scope_id:String =  "3", status:String =  "1", message_text:String =  "", credential:String = "0", attachment_flag: String = "0", ex_blog_id: String = "", message_large_text: String = "", ex_format: String = "", image_id: String = "", audio_id: String = "", video_id: String = "", file_id: String = "", thumb_id: String = "", reff_id: String = "", read_receipts: String = "4", chat_id: String = "", is_call_center: String = "0", call_center_id: String = "", viewController: UIViewController, isAutoSendCC : Bool = false, gif_id: String = "", is_forwarded: Int = 0, is_secret: Int = 0) {
         if viewController is EditorPersonal && file_id == "" && dataMessageForward == nil && !isAutoSendCC{
             if ((textFieldSend.text!.trimmingCharacters(in: .whitespacesAndNewlines) == "Send message".localized() && textFieldSend.textColor == UIColor.lightGray && attachment_flag != "11") || textFieldSend.text!.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty ) {
                 dismissKeyboard()
@@ -2522,8 +2551,12 @@ public class EditorPersonal: UIViewController, ImageVideoPickerDelegate, UIGestu
         if isAck {
             read_receipts = "8"
         }
+        var is_secret = is_secret
+        if isSecret {
+            is_secret = 1
+        }
         sendTyping(l_pin: l_pin, isTyping: true)
-        let message = CoreMessage_TMessageBank.sendMessage(l_pin: l_pin, message_scope_id: message_scope_id, status: status, message_text: message_text, credential: credential, attachment_flag: attachment_flag, ex_blog_id: ex_blog_id, message_large_text: message_large_text, ex_format: ex_format, image_id: image_id, audio_id: audio_id, video_id: video_id, file_id: file_id, thumb_id: thumb_id, reff_id: reff_id, read_receipts: read_receipts, chat_id: chat_id, is_call_center: is_call_center, call_center_id: call_center_id, opposite_pin: opposite_pin, gif_id: gif_id, isForwarded: "\(is_forwarded)")
+        let message = CoreMessage_TMessageBank.sendMessage(l_pin: l_pin, message_scope_id: message_scope_id, status: status, message_text: message_text, credential: credential, attachment_flag: attachment_flag, ex_blog_id: ex_blog_id, message_large_text: message_large_text, ex_format: ex_format, image_id: image_id, audio_id: audio_id, video_id: video_id, file_id: file_id, thumb_id: thumb_id, reff_id: reff_id, read_receipts: read_receipts, chat_id: chat_id, is_call_center: is_call_center, call_center_id: call_center_id, opposite_pin: opposite_pin, gif_id: gif_id, isForwarded: "\(is_forwarded)", isSecret: "\(is_secret)")
         Nexilis.addQueueMessage(message: message)
         let messageId = String(message.mBodies[CoreMessage_TMessageKey.MESSAGE_ID]!)
         if credential == "1" {
@@ -7656,4 +7689,5 @@ public class TypeDataMessage {
     public static let last_edit = "last_edit"
     public static let gif_id = "gif_id"
     public static let is_forwarded = "is_forwarded"
+    public static let is_secret = "is_secret"
 }

+ 4 - 4
NexilisLite/NexilisLite/Source/View/Control/ContactChatViewController.swift

@@ -1023,7 +1023,7 @@ extension ContactChatViewController {
                 content.addSubview(imageView)
                 imageView.translatesAutoresizingMaskIntoConstraints = false
                 NSLayoutConstraint.activate([
-                    imageView.leadingAnchor.constraint(equalTo: content.leadingAnchor, constant: 10.0),
+                    imageView.leadingAnchor.constraint(equalTo: content.leadingAnchor, constant: 20.0),
                     imageView.centerYAnchor.constraint(equalTo: content.centerYAnchor),
                     imageView.widthAnchor.constraint(equalToConstant: 40.0),
                     imageView.heightAnchor.constraint(equalToConstant: 40.0)
@@ -1050,7 +1050,7 @@ extension ContactChatViewController {
                 content.addSubview(titleView)
                 titleView.translatesAutoresizingMaskIntoConstraints = false
                 NSLayoutConstraint.activate([
-                    titleView.leadingAnchor.constraint(equalTo: imageView.trailingAnchor, constant: 10.0),
+                    titleView.leadingAnchor.constraint(equalTo: imageView.trailingAnchor, constant: 15.0),
                     titleView.centerYAnchor.constraint(equalTo: content.centerYAnchor)
                 ])
                 titleView.font = UIFont.systemFont(ofSize: 14)
@@ -1394,7 +1394,7 @@ extension ContactChatViewController {
                 content.addSubview(imageView)
                 imageView.translatesAutoresizingMaskIntoConstraints = false
                 NSLayoutConstraint.activate([
-                    imageView.leadingAnchor.constraint(equalTo: content.leadingAnchor, constant: 10.0),
+                    imageView.leadingAnchor.constraint(equalTo: content.leadingAnchor, constant: 20.0),
                     imageView.centerYAnchor.constraint(equalTo: content.centerYAnchor),
                     imageView.widthAnchor.constraint(equalToConstant: 40.0),
                     imageView.heightAnchor.constraint(equalToConstant: 40.0)
@@ -1421,7 +1421,7 @@ extension ContactChatViewController {
                 content.addSubview(titleView)
                 titleView.translatesAutoresizingMaskIntoConstraints = false
                 NSLayoutConstraint.activate([
-                    titleView.leadingAnchor.constraint(equalTo: imageView.trailingAnchor, constant: 10.0),
+                    titleView.leadingAnchor.constraint(equalTo: imageView.trailingAnchor, constant: 15.0),
                     titleView.centerYAnchor.constraint(equalTo: content.centerYAnchor)
                 ])
                 titleView.font = UIFont.systemFont(ofSize: 14)

+ 74 - 2
NexilisLite/NexilisLite/Source/View/Control/ProfileViewController.swift

@@ -9,7 +9,7 @@ import UIKit
 import NotificationBannerSwift
 import nuSDKService
 
-public class ProfileViewController: UITableViewController {
+public class ProfileViewController: UITableViewController, UITextFieldDelegate {
     
     @IBOutlet weak var profile: UIImageView!
     
@@ -32,6 +32,10 @@ public class ProfileViewController: UITableViewController {
     @IBOutlet weak var labelChangePassword: UILabel!
     @IBOutlet weak var buttonEditpass: UIButton!
     @IBOutlet weak var labelAcceptCall: UILabel!
+    @IBOutlet weak var buttonSaveStatus: UIButton!
+    @IBOutlet weak var editTextStatus: UITextField!
+    @IBOutlet weak var contStatusFriend: UIView!
+    @IBOutlet weak var statusFriend: UILabel!
     
     private var imageVideoPicker : ImageVideoPicker!
     
@@ -256,6 +260,7 @@ public class ProfileViewController: UITableViewController {
         qrImage.addGestureRecognizer(qrTapGesture)
         
         if let me = User.getMyPin(), me == data || flag == Flag.me {
+            contStatusFriend.isHidden = true
             buttonGroup.removeFromSuperview()
             navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Edit".localized(), style: .plain, target: self, action: #selector(didTapEdit(sender:)))
             imageVideoPicker = ImageVideoPicker(presentationController: self, delegate: self)
@@ -271,6 +276,16 @@ public class ProfileViewController: UITableViewController {
             }
             switchPrivateAccount.addTarget(self, action: #selector(privateAccountSwitch), for: .valueChanged)
             switchAcceptCall.addTarget(self, action: #selector(acceptCallSwitch), for: .valueChanged)
+            editTextStatus.placeholder = "Write a status".localized()
+            editTextStatus.text = myData?.status
+            editTextStatus.delegate = self
+            buttonSaveStatus.isHidden = true
+            
+            buttonSaveStatus.addTarget(self, action: #selector(saveStatus(sender:)), for: .touchUpInside)
+            
+            let tapGesture = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard))
+            tapGesture.cancelsTouchesInView = false
+            myViewGroup.addGestureRecognizer(tapGesture)
         } else if flag == Flag.invite {
             navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(didTapAdd(sender:)))
             call.isEnabled = false
@@ -281,6 +296,7 @@ public class ProfileViewController: UITableViewController {
             title = name
             profile.setImage(name: picture)
         } else if flag == Flag.friend {
+            statusFriend.text = myData?.status
             navigationItem.rightBarButtonItem = UIBarButtonItem(image: UIImage(systemName: "person.crop.circle.badge.xmark"), style: .plain, target: self, action: #selector(didTapUnfriend(sender:)))
             if !isBNI {
                 call.addTarget(self, action: #selector(call(sender:)), for: .touchUpInside)
@@ -296,6 +312,62 @@ public class ProfileViewController: UITableViewController {
         }
     }
     
+    @objc func dismissKeyboard() {
+        if editTextStatus.isFirstResponder {
+            editTextStatus.resignFirstResponder()
+        }
+    }
+    
+    public func textFieldDidChangeSelection(_ textField: UITextField) {
+        if let text = textField.text {
+            if text == user?.status {
+                buttonSaveStatus.isHidden = true
+            } else {
+                buttonSaveStatus.isHidden = false
+            }
+        }
+    }
+    
+    @objc func saveStatus(sender: Any) {
+        dismissKeyboard()
+        Nexilis.showLoader()
+        let text = editTextStatus.text ?? ""
+        let pin = self.data
+        DispatchQueue.global().async {
+            if let resp = Nexilis.writeAndWait(message: CoreMessage_TMessageBank.getChangePersonInfoQuote(quote: text)), resp.isOk() {
+                Database.shared.database?.inTransaction({ fmdb, rollback in
+                    do {
+                        _ = Database.shared.updateRecord(fmdb: fmdb, table: "BUDDY", cvalues: ["quote": text], _where: "f_pin = '\(pin)'")
+                    } catch {
+                        rollback.pointee = true
+                        print("Access database error: \(error.localizedDescription)")
+                    }
+                })
+                DispatchQueue.main.async {
+                    Nexilis.hideLoader {
+                        self.buttonSaveStatus.isHidden = true
+                        self.user?.status = self.editTextStatus.text!
+                        self.editTextStatus.text = self.editTextStatus.text!
+                        let imageView = UIImageView(image: UIImage(systemName: "checkmark.circle.fill"))
+                        imageView.tintColor = .white
+                        self.publicBanner.dismiss()
+                        self.publicBanner = FloatingNotificationBanner(title: "Successfully changed status".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)
+                        self.publicBanner.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()
+                    }
+                }
+            }
+        }
+    }
+    
     @objc func acceptCallSwitch(mySwitch: UISwitch) {
         timerSwitchAC.invalidate()
         timerSwitchAC = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: false) { [self] _ in
@@ -736,7 +808,7 @@ public class ProfileViewController: UITableViewController {
     public override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
         if indexPath.section == 1 {
             if let me = User.getMyPin(), me == data || flag == Flag.me {
-                return 170
+                return 220
             }
             return 56
         }