From fa2eb8312a0223e4f9e69c932e4ac2509b417b1c Mon Sep 17 00:00:00 2001 From: JohnEmborianContus <135249904+JohnEmborianContus@users.noreply.github.com> Date: Mon, 29 Sep 2025 17:27:52 +0530 Subject: [PATCH] Release 5.18.21 Bug fixing and improvements in contact sync --- .../AuthenticationPINViewController.swift | 12 +- .../AuthenticationPINViewController.xib | 66 ++++-- .../FingerPrintPINViewController.swift | 1 + .../SharekitShareToViewController.swift | 2 +- .../QuickSharePopupViewController.swift | 1 + MirrorflyUIkit.xcodeproj/project.pbxproj | 214 +++++++++--------- .../contents.xcworkspacedata | 3 + .../Calls/CallLogViewController.swift | 21 +- .../Calls/CallUIViewController.swift | 212 +++++++++++------ .../Calls/JoinCallViaLinkViewController.swift | 1 + .../Calls/ShareCallLinkViewController.swift | 1 + .../Chat/ChatViewParentController.swift | 58 ++++- .../View/ChatContactViewController.swift | 1 + .../ReceiverDocumentsTableViewCell.swift | 10 +- .../SenderDocumentsTableViewCell.swift | 11 +- ...nstantScheduledMeetingViewController.swift | 1 + .../video/ChatViewVideoIncomingCell.swift | 9 +- .../video/ChatViewVideoOutgoingCell.swift | 7 +- MirrorflyUIkit/Common/AppUtils.swift | 2 +- .../AboutUsViewController.swift | 1 + .../AboutandHelpViewController.swift | 1 + .../Audio/TableCells/AudioReceiver.swift | 28 ++- .../Audio/TableCells/AudioSender.swift | 28 ++- .../AuthenticationPINViewController.swift | 19 +- .../AuthenticationPINViewController.xib | 65 ++++-- .../ChatSettingsViewController.swift | 1 + .../Controllers/ContactSyncController.swift | 11 +- .../ContactUs/ContactUsController.swift | 1 + .../Controllers/ContactViewController.swift | 5 +- .../CountryPickerViewController.swift | 1 + .../Controllers/Delegates/AppDelegate.swift | 51 ++++- ...eteMessageForEveryOneAlertController.swift | 1 + .../DeleteMessagesForMeAlertController.swift | 1 + .../ForceUpdateAlert/ForceUpdateAlert.swift | 1 + .../ForwardViewController.swift | 1 + .../Image/CollectionCells/ImageCell.swift | 5 + .../Controllers/MainTabBarController.swift | 1 + .../Profile/View/ProfileViewController.swift | 1 + .../RecentChat/RecentChatViewController.swift | 2 +- .../AppLock/AppLockViewController.swift | 2 + .../NotificationAlertViewController.swift | 1 + .../NotificationsViewController.swift | 1 + .../Settings/SettingsViewController.swift | 3 +- .../UserProfileViewController.swift | 1 + .../ContactInfoViewController.swift | 3 +- ...eChatAuthenticationPINViewController.swift | 11 +- ...ateChatAuthenticationPINViewController.xib | 65 ++++-- .../PrivateChatEnableController.swift | 1 + .../PrivateChatPopupViewController.swift | 1 + .../AddParticipantsViewController.swift | 1 + .../MessageInfoViewController.swift | 1 + .../viewAllMedia/ViewAllMediaController.swift | 2 +- 52 files changed, 638 insertions(+), 313 deletions(-) diff --git a/MirrorflyShareKit/Authentication PIN/AuthenticationPINViewController.swift b/MirrorflyShareKit/Authentication PIN/AuthenticationPINViewController.swift index 06f4c79..90c295e 100644 --- a/MirrorflyShareKit/Authentication PIN/AuthenticationPINViewController.swift +++ b/MirrorflyShareKit/Authentication PIN/AuthenticationPINViewController.swift @@ -50,7 +50,7 @@ class AuthenticationPINViewController: ShareKitBaseViewController, UITextFieldDe @IBOutlet weak var forgotButtonoutlet: UIButton! { didSet { - forgotButtonoutlet.isHidden = true + forgotButtonoutlet.isHidden = false } } @@ -67,6 +67,8 @@ class AuthenticationPINViewController: ShareKitBaseViewController, UITextFieldDe @IBOutlet weak var pinEnteredcollectionview: UICollectionView! + @IBOutlet weak var backBtn: UIButton! + var isDisablePin = false override func viewDidLoad() { @@ -185,6 +187,7 @@ class AuthenticationPINViewController: ShareKitBaseViewController, UITextFieldDe override func viewWillAppear(_ animated: Bool) { self.navigationController?.setNavigationBarHidden(true, animated: false) + self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false } func setupUI() { @@ -203,7 +206,7 @@ class AuthenticationPINViewController: ShareKitBaseViewController, UITextFieldDe //self.forgotButtonoutlet.isHidden = false } else if fingerPrintLogout == true || logout == true || disableBothPIN == true || fingerPrintEnable == true { - self.forgotButtonoutlet.isHidden = true + self.forgotButtonoutlet.isHidden = false } txtFirst.delegate = self txtSecond.delegate = self @@ -266,6 +269,11 @@ class AuthenticationPINViewController: ShareKitBaseViewController, UITextFieldDe txtSixth.text = "" } + + @IBAction func backBtn(_ sender: UIButton) { + self.navigationController?.popViewController(animated: true) + } + @objc override func didMoveToBackground() { self.currentBackgroundDate = Date() diff --git a/MirrorflyShareKit/Authentication PIN/AuthenticationPINViewController.xib b/MirrorflyShareKit/Authentication PIN/AuthenticationPINViewController.xib index 832bbc4..748c4d7 100644 --- a/MirrorflyShareKit/Authentication PIN/AuthenticationPINViewController.xib +++ b/MirrorflyShareKit/Authentication PIN/AuthenticationPINViewController.xib @@ -1,8 +1,9 @@ - + - + + @@ -25,6 +26,7 @@ + @@ -52,10 +54,10 @@ - + - + @@ -120,21 +122,41 @@ - + + + + + + + @@ -142,16 +164,15 @@ - + - + - @@ -164,6 +185,7 @@ + diff --git a/MirrorflyShareKit/Authentication PIN/FingerPrint PIN/FingerPrintPINViewController.swift b/MirrorflyShareKit/Authentication PIN/FingerPrint PIN/FingerPrintPINViewController.swift index a967b41..473f1d5 100644 --- a/MirrorflyShareKit/Authentication PIN/FingerPrint PIN/FingerPrintPINViewController.swift +++ b/MirrorflyShareKit/Authentication PIN/FingerPrint PIN/FingerPrintPINViewController.swift @@ -22,6 +22,7 @@ class FingerPrintPINViewController: ShareKitBaseViewController { override func viewWillAppear(_ animated: Bool) { authenticationWithTouchID() + self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false } override func willCometoForeground() { diff --git a/MirrorflyShareKit/ShareScreen/SharekitShareToViewController.swift b/MirrorflyShareKit/ShareScreen/SharekitShareToViewController.swift index 2c91381..282b9de 100755 --- a/MirrorflyShareKit/ShareScreen/SharekitShareToViewController.swift +++ b/MirrorflyShareKit/ShareScreen/SharekitShareToViewController.swift @@ -176,7 +176,7 @@ class SharekitShareToViewController: ShareKitBaseViewController { navigationController?.isNavigationBarHidden = true sendButton?.isEnabled = false sendButton?.alpha = 0.4 - + self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false if !selectedProfiles.isEmpty { sendButton?.isEnabled = true sendButton?.alpha = 1 diff --git a/MirrorflyShareKit/WarningPopUp/QuickSharePopupViewController.swift b/MirrorflyShareKit/WarningPopUp/QuickSharePopupViewController.swift index b6cf989..0597cac 100644 --- a/MirrorflyShareKit/WarningPopUp/QuickSharePopupViewController.swift +++ b/MirrorflyShareKit/WarningPopUp/QuickSharePopupViewController.swift @@ -20,6 +20,7 @@ class QuickSharePopupViewController : ShareKitBaseViewController { override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) contentView?.roundCorners(corners: [.topLeft,.topRight,.bottomLeft,.bottomRight], radius: 10.0) + self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false } override func viewDidLoad() { diff --git a/MirrorflyUIkit.xcodeproj/project.pbxproj b/MirrorflyUIkit.xcodeproj/project.pbxproj index 34dbfe8..f390dff 100644 --- a/MirrorflyUIkit.xcodeproj/project.pbxproj +++ b/MirrorflyUIkit.xcodeproj/project.pbxproj @@ -29,12 +29,13 @@ 3DF9C9A928E6E6A300154BBE /* DeleteMessageForEveryOneAlertController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3DF9C9A828E6E6A300154BBE /* DeleteMessageForEveryOneAlertController.xib */; }; 3DF9C9AA28E6E6A300154BBE /* DeleteMessageForEveryOneAlertController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3DF9C9A828E6E6A300154BBE /* DeleteMessageForEveryOneAlertController.xib */; }; 4539207F786BA9399FD59C93 /* (null) in Frameworks */ = {isa = PBXBuildFile; }; - 512B8BB47B921911C6745C51 /* Pods_MirrorflyNotificationExtention.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B7FFFD3E9EC3D78F6837FAC3 /* Pods_MirrorflyNotificationExtention.framework */; }; 6D22A420B2564247AE9FF889 /* (null) in Frameworks */ = {isa = PBXBuildFile; }; 733009362D195CD0002882C6 /* fly_call_ringtone.wav in Resources */ = {isa = PBXBuildFile; fileRef = 733009352D195CD0002882C6 /* fly_call_ringtone.wav */; }; 733009372D195CD0002882C6 /* fly_call_ringtone.wav in Resources */ = {isa = PBXBuildFile; fileRef = 733009352D195CD0002882C6 /* fly_call_ringtone.wav */; }; + 7FD20C78D2E22512C43D35C5 /* Pods_UiKitQaNotificationExtention.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D32F5CD6EBD238B6EDE6A4CF /* Pods_UiKitQaNotificationExtention.framework */; }; 8356D98B5656C5FACFDD2D63 /* (null) in Frameworks */ = {isa = PBXBuildFile; }; - A16F1535DF56A6348D492CCA /* Pods_MirrorflyShareKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4A4D40416673FC9CA7B68770 /* Pods_MirrorflyShareKit.framework */; }; + B4F4717C98671898951CBCD9 /* Pods_Mirrorfly.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA7E29F6F18F633E81F8C0C3 /* Pods_Mirrorfly.framework */; }; + CCFF6E69C32C015BE3012718 /* Pods_MirrorflyShareKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BBE8A031D7959EB1570A6500 /* Pods_MirrorflyShareKit.framework */; }; CE005CA729C9D431009BE471 /* AuthenticationExtenison.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE46746A29C9799400169A96 /* AuthenticationExtenison.swift */; }; CE0140B0298943F7002CE0F8 /* AppLockDescriptionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE0140AE298943F6002CE0F8 /* AppLockDescriptionCell.swift */; }; CE0140B1298943F7002CE0F8 /* AppLockDescriptionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE0140AE298943F6002CE0F8 /* AppLockDescriptionCell.swift */; }; @@ -862,11 +863,10 @@ CEFB2D9429A4DFCE00FF6649 /* ShareComposeVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = CEFB2D9029A4DF4200FF6649 /* ShareComposeVC.xib */; }; CEFD043026CD25B90017287F /* countries.json in Resources */ = {isa = PBXBuildFile; fileRef = CEFD042F26CD25B90017287F /* countries.json */; }; CEFD043226CD3D4B0017287F /* CountryModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEFD043126CD3D4B0017287F /* CountryModel.swift */; }; - D64ABBA31F3C9893F5DF156E /* Pods_UiKitQa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0B1344172B5AD3B1C0F62598 /* Pods_UiKitQa.framework */; }; + DA24BC174AF0771D369D0240 /* Pods_MirrorflyNotificationExtention.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6241D92B44976F88C227D518 /* Pods_MirrorflyNotificationExtention.framework */; }; DA46D6FEEED529FC66C6087D /* (null) in Frameworks */ = {isa = PBXBuildFile; }; - DBF9436A41FAA4F804614C61 /* Pods_Mirrorfly.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BD928AB96D761A6B61031B72 /* Pods_Mirrorfly.framework */; }; - E16B7341F23B08B9FC7D5516 /* Pods_UikitQaShareKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 557D37E142CAA1AB62925B79 /* Pods_UikitQaShareKit.framework */; }; - FC7CC51948E2D264F2913351 /* Pods_UiKitQaNotificationExtention.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0B04D0DE6EED65A23F61A883 /* Pods_UiKitQaNotificationExtention.framework */; }; + F7462E2C0781CE559078EED9 /* Pods_UiKitQa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0605D8661722773AF8769292 /* Pods_UiKitQa.framework */; }; + F9165F62F0F911D17575C081 /* Pods_UikitQaShareKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F2EC48477C0BD1B237753161 /* Pods_UikitQaShareKit.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -948,8 +948,7 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 0B04D0DE6EED65A23F61A883 /* Pods_UiKitQaNotificationExtention.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_UiKitQaNotificationExtention.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 0B1344172B5AD3B1C0F62598 /* Pods_UiKitQa.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_UiKitQa.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 0605D8661722773AF8769292 /* Pods_UiKitQa.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_UiKitQa.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 3D12788E27A7AC6D00A34436 /* UserProfileViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserProfileViewController.swift; sourceTree = ""; }; 3D3C47DA28E5315D001F2520 /* DeleteForEveryOneViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeleteForEveryOneViewCell.swift; sourceTree = ""; }; 3D3C47DB28E5315D001F2520 /* DeleteForEveryOneViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = DeleteForEveryOneViewCell.xib; sourceTree = ""; }; @@ -960,11 +959,9 @@ 3DF9C99828E6A7FA00154BBE /* DeleteForEveryOneReceiverCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = DeleteForEveryOneReceiverCell.xib; sourceTree = ""; }; 3DF9C9A528E6E69300154BBE /* DeleteMessageForEveryOneAlertController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeleteMessageForEveryOneAlertController.swift; sourceTree = ""; }; 3DF9C9A828E6E6A300154BBE /* DeleteMessageForEveryOneAlertController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = DeleteMessageForEveryOneAlertController.xib; sourceTree = ""; }; - 4A4D40416673FC9CA7B68770 /* Pods_MirrorflyShareKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_MirrorflyShareKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 557D37E142CAA1AB62925B79 /* Pods_UikitQaShareKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_UikitQaShareKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 6241D92B44976F88C227D518 /* Pods_MirrorflyNotificationExtention.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_MirrorflyNotificationExtention.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 733009352D195CD0002882C6 /* fly_call_ringtone.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; path = fly_call_ringtone.wav; sourceTree = ""; }; - B7FFFD3E9EC3D78F6837FAC3 /* Pods_MirrorflyNotificationExtention.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_MirrorflyNotificationExtention.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - BD928AB96D761A6B61031B72 /* Pods_Mirrorfly.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Mirrorfly.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + BBE8A031D7959EB1570A6500 /* Pods_MirrorflyShareKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_MirrorflyShareKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; CE0140AE298943F6002CE0F8 /* AppLockDescriptionCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppLockDescriptionCell.swift; sourceTree = ""; }; CE0140AF298943F7002CE0F8 /* AppLockDescriptionCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = AppLockDescriptionCell.xib; sourceTree = ""; }; CE0755B3290067E1008F6C37 /* NotificationWebViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationWebViewController.swift; sourceTree = ""; }; @@ -1326,7 +1323,6 @@ CEB66AC929AE2DC90084559C /* ShareKitShareViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareKitShareViewModel.swift; sourceTree = ""; }; CEBE3BD82959CF1F004E7C49 /* FooterSectionCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = FooterSectionCell.xib; sourceTree = ""; }; CEC08B6027E23B0D005E48C5 /* Mirrorfly.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Mirrorfly.app; sourceTree = BUILT_PRODUCTS_DIR; }; - CEC08B6127E23B0D005E48C5 /* Mirrorfly-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Mirrorfly-Info.plist"; path = "/Users/user/Desktop/UiKit/Mirrorfly-Info.plist"; sourceTree = ""; }; CEC08B7127E23B9F005E48C5 /* MirrorflyNotificationExtention.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = MirrorflyNotificationExtention.appex; sourceTree = BUILT_PRODUCTS_DIR; }; CEC08B7427E243D9005E48C5 /* MirrorflyNotificationextention.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = MirrorflyNotificationextention.entitlements; sourceTree = ""; }; CEC08B7E27E24F41005E48C5 /* GoogleService-Qa-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Qa-Info.plist"; sourceTree = ""; }; @@ -1413,6 +1409,9 @@ CEFB2D9029A4DF4200FF6649 /* ShareComposeVC.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ShareComposeVC.xib; sourceTree = ""; }; CEFD042F26CD25B90017287F /* countries.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = countries.json; sourceTree = ""; }; CEFD043126CD3D4B0017287F /* CountryModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CountryModel.swift; sourceTree = ""; }; + D32F5CD6EBD238B6EDE6A4CF /* Pods_UiKitQaNotificationExtention.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_UiKitQaNotificationExtention.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + DA7E29F6F18F633E81F8C0C3 /* Pods_Mirrorfly.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Mirrorfly.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + F2EC48477C0BD1B237753161 /* Pods_UikitQaShareKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_UikitQaShareKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -1421,7 +1420,7 @@ buildActionMask = 2147483647; files = ( 4539207F786BA9399FD59C93 /* (null) in Frameworks */, - D64ABBA31F3C9893F5DF156E /* Pods_UiKitQa.framework in Frameworks */, + F7462E2C0781CE559078EED9 /* Pods_UiKitQa.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1430,7 +1429,7 @@ buildActionMask = 2147483647; files = ( 38C369FDA4D537D4B44DFDC6 /* (null) in Frameworks */, - DBF9436A41FAA4F804614C61 /* Pods_Mirrorfly.framework in Frameworks */, + B4F4717C98671898951CBCD9 /* Pods_Mirrorfly.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1439,7 +1438,7 @@ buildActionMask = 2147483647; files = ( DA46D6FEEED529FC66C6087D /* (null) in Frameworks */, - 512B8BB47B921911C6745C51 /* Pods_MirrorflyNotificationExtention.framework in Frameworks */, + DA24BC174AF0771D369D0240 /* Pods_MirrorflyNotificationExtention.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1448,7 +1447,7 @@ buildActionMask = 2147483647; files = ( 6D22A420B2564247AE9FF889 /* (null) in Frameworks */, - A16F1535DF56A6348D492CCA /* Pods_MirrorflyShareKit.framework in Frameworks */, + CCFF6E69C32C015BE3012718 /* Pods_MirrorflyShareKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1457,7 +1456,7 @@ buildActionMask = 2147483647; files = ( 8356D98B5656C5FACFDD2D63 /* (null) in Frameworks */, - E16B7341F23B08B9FC7D5516 /* Pods_UikitQaShareKit.framework in Frameworks */, + F9165F62F0F911D17575C081 /* Pods_UikitQaShareKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1465,7 +1464,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - FC7CC51948E2D264F2913351 /* Pods_UiKitQaNotificationExtention.framework in Frameworks */, + 7FD20C78D2E22512C43D35C5 /* Pods_UiKitQaNotificationExtention.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1542,12 +1541,12 @@ CE8BC8E6280EB466007FF8C3 /* FlyTranslate.framework */, CEA178D4274F8ABC00EAD2A3 /* FlyCall.framework */, CEA178D3274F8ABC00EAD2A3 /* FlyCommon.framework */, - BD928AB96D761A6B61031B72 /* Pods_Mirrorfly.framework */, - B7FFFD3E9EC3D78F6837FAC3 /* Pods_MirrorflyNotificationExtention.framework */, - 4A4D40416673FC9CA7B68770 /* Pods_MirrorflyShareKit.framework */, - 0B1344172B5AD3B1C0F62598 /* Pods_UiKitQa.framework */, - 0B04D0DE6EED65A23F61A883 /* Pods_UiKitQaNotificationExtention.framework */, - 557D37E142CAA1AB62925B79 /* Pods_UikitQaShareKit.framework */, + DA7E29F6F18F633E81F8C0C3 /* Pods_Mirrorfly.framework */, + 6241D92B44976F88C227D518 /* Pods_MirrorflyNotificationExtention.framework */, + BBE8A031D7959EB1570A6500 /* Pods_MirrorflyShareKit.framework */, + 0605D8661722773AF8769292 /* Pods_UiKitQa.framework */, + D32F5CD6EBD238B6EDE6A4CF /* Pods_UiKitQaNotificationExtention.framework */, + F2EC48477C0BD1B237753161 /* Pods_UikitQaShareKit.framework */, ); name = Frameworks; sourceTree = ""; @@ -2569,7 +2568,6 @@ CEA2F93D26569D8B0013F5E8 /* Plist */ = { isa = PBXGroup; children = ( - CEC08B6127E23B0D005E48C5 /* Mirrorfly-Info.plist */, CEA2F93626569C5C0013F5E8 /* MirrorflyUIkit-info.plist */, ); path = Plist; @@ -3232,7 +3230,7 @@ isa = PBXNativeTarget; buildConfigurationList = CEA2F93926569C5C0013F5E8 /* Build configuration list for PBXNativeTarget "UiKitQa" */; buildPhases = ( - D3F2DA933D6A9FF6FA6C7690 /* [CP] Check Pods Manifest.lock */, + C228AD0BB7C593695C23F029 /* [CP] Check Pods Manifest.lock */, CEA2F92126569C590013F5E8 /* Sources */, CEA2F92226569C590013F5E8 /* Frameworks */, CEA2F92326569C590013F5E8 /* Resources */, @@ -3240,8 +3238,8 @@ CED4FB5C277DE60D008FAF15 /* ShellScript */, CEC08B8327E25037005E48C5 /* Google Plist */, CEF9F50229E52E5700492772 /* Embed Frameworks */, - 67B2E6B37A3947DF1B4F5106 /* [CP] Embed Pods Frameworks */, - 5181A34F6DD0B6131E6534DD /* [CP] Copy Pods Resources */, + EA796D3BFAE34D4B26F97098 /* [CP] Embed Pods Frameworks */, + 013809C49A14A53472DAD62A /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -3258,7 +3256,7 @@ isa = PBXNativeTarget; buildConfigurationList = CEC08B5927E23B0D005E48C5 /* Build configuration list for PBXNativeTarget "Mirrorfly" */; buildPhases = ( - 639A8159175870A16044DFE1 /* [CP] Check Pods Manifest.lock */, + E1DBBCCB6540E6AD053776F8 /* [CP] Check Pods Manifest.lock */, CEC08AA027E23B0D005E48C5 /* Sources */, CEC08B2027E23B0D005E48C5 /* Frameworks */, CEC08B2227E23B0D005E48C5 /* Resources */, @@ -3266,8 +3264,8 @@ CEC08B7827E24ADC005E48C5 /* Embed App Extensions */, CEC08B7B27E24EEF005E48C5 /* Google Plist */, CE8BC8CC280E8A3E007FF8C3 /* Embed Frameworks */, - 13A84A2C24525F78D59E8F20 /* [CP] Embed Pods Frameworks */, - B825DAEFC798DE2F87DE1851 /* [CP] Copy Pods Resources */, + D6CF52E5EC852ACDDE9D22CD /* [CP] Embed Pods Frameworks */, + 4301F1501A6B1EB92E46EB44 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -3284,7 +3282,7 @@ isa = PBXNativeTarget; buildConfigurationList = CEC08B6A27E23B9F005E48C5 /* Build configuration list for PBXNativeTarget "MirrorflyNotificationExtention" */; buildPhases = ( - 963738660FD1F503CF4E440A /* [CP] Check Pods Manifest.lock */, + 6966FF84A997789E50F108A5 /* [CP] Check Pods Manifest.lock */, CEC08B6427E23B9F005E48C5 /* Sources */, CEC08B6627E23B9F005E48C5 /* Frameworks */, CEC08B6827E23B9F005E48C5 /* Resources */, @@ -3302,11 +3300,11 @@ isa = PBXNativeTarget; buildConfigurationList = CEE7C5AA299F6505002F22FA /* Build configuration list for PBXNativeTarget "MirrorflyShareKit" */; buildPhases = ( - 4DD995EAAF54F84B05D6E5E6 /* [CP] Check Pods Manifest.lock */, + 151DC0054DD9936E8B4BE0A6 /* [CP] Check Pods Manifest.lock */, CEE7C599299F6505002F22FA /* Sources */, CEE7C59A299F6505002F22FA /* Frameworks */, CEE7C59B299F6505002F22FA /* Resources */, - 15A91A01A9B09D4F697461F1 /* [CP] Copy Pods Resources */, + 536A8C4B74445FFB306A3134 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -3321,11 +3319,11 @@ isa = PBXNativeTarget; buildConfigurationList = CEE7C5BA299F651E002F22FA /* Build configuration list for PBXNativeTarget "UikitQaShareKit" */; buildPhases = ( - 67C32E3A697A0B45520733AD /* [CP] Check Pods Manifest.lock */, + 8D3116DAFD112120E3F4CC98 /* [CP] Check Pods Manifest.lock */, CEE7C5AB299F651D002F22FA /* Sources */, CEE7C5AC299F651D002F22FA /* Frameworks */, CEE7C5AD299F651D002F22FA /* Resources */, - 82EE16EF157058C24FA04B0F /* [CP] Copy Pods Resources */, + 79071278734EBBC4A8EBE7F7 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -3340,7 +3338,7 @@ isa = PBXNativeTarget; buildConfigurationList = CEF4374F273BCA77008D0F39 /* Build configuration list for PBXNativeTarget "UiKitQaNotificationExtention" */; buildPhases = ( - 654B34819AF23FB85E053D6B /* [CP] Check Pods Manifest.lock */, + A475BEED05894C11B4E712F3 /* [CP] Check Pods Manifest.lock */, CEF43740273BCA76008D0F39 /* Sources */, CEF43741273BCA76008D0F39 /* Frameworks */, CEF43742273BCA76008D0F39 /* Resources */, @@ -3730,41 +3728,24 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 13A84A2C24525F78D59E8F20 /* [CP] Embed Pods Frameworks */ = { + 013809C49A14A53472DAD62A /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Mirrorfly/Pods-Mirrorfly-frameworks-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Mirrorfly/Pods-Mirrorfly-frameworks-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Mirrorfly/Pods-Mirrorfly-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - 15A91A01A9B09D4F697461F1 /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-MirrorflyShareKit/Pods-MirrorflyShareKit-resources-${CONFIGURATION}-input-files.xcfilelist", + "${PODS_ROOT}/Target Support Files/Pods-UiKitQa/Pods-UiKitQa-resources-${CONFIGURATION}-input-files.xcfilelist", ); name = "[CP] Copy Pods Resources"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-MirrorflyShareKit/Pods-MirrorflyShareKit-resources-${CONFIGURATION}-output-files.xcfilelist", + "${PODS_ROOT}/Target Support Files/Pods-UiKitQa/Pods-UiKitQa-resources-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-MirrorflyShareKit/Pods-MirrorflyShareKit-resources.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-UiKitQa/Pods-UiKitQa-resources.sh\"\n"; showEnvVarsInLog = 0; }; - 4DD995EAAF54F84B05D6E5E6 /* [CP] Check Pods Manifest.lock */ = { + 151DC0054DD9936E8B4BE0A6 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -3786,46 +3767,41 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 5181A34F6DD0B6131E6534DD /* [CP] Copy Pods Resources */ = { + 4301F1501A6B1EB92E46EB44 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-UiKitQa/Pods-UiKitQa-resources-${CONFIGURATION}-input-files.xcfilelist", + "${PODS_ROOT}/Target Support Files/Pods-Mirrorfly/Pods-Mirrorfly-resources-${CONFIGURATION}-input-files.xcfilelist", ); name = "[CP] Copy Pods Resources"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-UiKitQa/Pods-UiKitQa-resources-${CONFIGURATION}-output-files.xcfilelist", + "${PODS_ROOT}/Target Support Files/Pods-Mirrorfly/Pods-Mirrorfly-resources-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-UiKitQa/Pods-UiKitQa-resources.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Mirrorfly/Pods-Mirrorfly-resources.sh\"\n"; showEnvVarsInLog = 0; }; - 639A8159175870A16044DFE1 /* [CP] Check Pods Manifest.lock */ = { + 536A8C4B74445FFB306A3134 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-MirrorflyShareKit/Pods-MirrorflyShareKit-resources-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; + name = "[CP] Copy Pods Resources"; outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Mirrorfly-checkManifestLockResult.txt", + "${PODS_ROOT}/Target Support Files/Pods-MirrorflyShareKit/Pods-MirrorflyShareKit-resources-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-MirrorflyShareKit/Pods-MirrorflyShareKit-resources.sh\"\n"; showEnvVarsInLog = 0; }; - 654B34819AF23FB85E053D6B /* [CP] Check Pods Manifest.lock */ = { + 6966FF84A997789E50F108A5 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -3840,31 +3816,31 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-UiKitQaNotificationExtention-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-MirrorflyNotificationExtention-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 67B2E6B37A3947DF1B4F5106 /* [CP] Embed Pods Frameworks */ = { + 79071278734EBBC4A8EBE7F7 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-UiKitQa/Pods-UiKitQa-frameworks-${CONFIGURATION}-input-files.xcfilelist", + "${PODS_ROOT}/Target Support Files/Pods-UikitQaShareKit/Pods-UikitQaShareKit-resources-${CONFIGURATION}-input-files.xcfilelist", ); - name = "[CP] Embed Pods Frameworks"; + name = "[CP] Copy Pods Resources"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-UiKitQa/Pods-UiKitQa-frameworks-${CONFIGURATION}-output-files.xcfilelist", + "${PODS_ROOT}/Target Support Files/Pods-UikitQaShareKit/Pods-UikitQaShareKit-resources-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-UiKitQa/Pods-UiKitQa-frameworks.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-UikitQaShareKit/Pods-UikitQaShareKit-resources.sh\"\n"; showEnvVarsInLog = 0; }; - 67C32E3A697A0B45520733AD /* [CP] Check Pods Manifest.lock */ = { + 8D3116DAFD112120E3F4CC98 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -3886,24 +3862,7 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 82EE16EF157058C24FA04B0F /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-UikitQaShareKit/Pods-UikitQaShareKit-resources-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Copy Pods Resources"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-UikitQaShareKit/Pods-UikitQaShareKit-resources-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-UikitQaShareKit/Pods-UikitQaShareKit-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; - 963738660FD1F503CF4E440A /* [CP] Check Pods Manifest.lock */ = { + A475BEED05894C11B4E712F3 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -3918,28 +3877,33 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-MirrorflyNotificationExtention-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-UiKitQaNotificationExtention-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - B825DAEFC798DE2F87DE1851 /* [CP] Copy Pods Resources */ = { + C228AD0BB7C593695C23F029 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Mirrorfly/Pods-Mirrorfly-resources-${CONFIGURATION}-input-files.xcfilelist", ); - name = "[CP] Copy Pods Resources"; + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Mirrorfly/Pods-Mirrorfly-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-UiKitQa-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Mirrorfly/Pods-Mirrorfly-resources.sh\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; CEC08B5627E23B0D005E48C5 /* ShellScript */ = { @@ -4016,7 +3980,24 @@ shellPath = /bin/sh; shellScript = "\"${PODS_ROOT}/FirebaseCrashlytics/run\"\n"; }; - D3F2DA933D6A9FF6FA6C7690 /* [CP] Check Pods Manifest.lock */ = { + D6CF52E5EC852ACDDE9D22CD /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Mirrorfly/Pods-Mirrorfly-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Mirrorfly/Pods-Mirrorfly-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Mirrorfly/Pods-Mirrorfly-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + E1DBBCCB6540E6AD053776F8 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -4031,13 +4012,30 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-UiKitQa-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-Mirrorfly-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; + EA796D3BFAE34D4B26F97098 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-UiKitQa/Pods-UiKitQa-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-UiKitQa/Pods-UiKitQa-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-UiKitQa/Pods-UiKitQa-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ diff --git a/MirrorflyUIkit.xcworkspace/contents.xcworkspacedata b/MirrorflyUIkit.xcworkspace/contents.xcworkspacedata index 04c7b2c..7860cd3 100644 --- a/MirrorflyUIkit.xcworkspace/contents.xcworkspacedata +++ b/MirrorflyUIkit.xcworkspace/contents.xcworkspacedata @@ -4,4 +4,7 @@ + + diff --git a/MirrorflyUIkit/Calls/CallLogViewController.swift b/MirrorflyUIkit/Calls/CallLogViewController.swift index d3a3cfd..9ed8fdf 100755 --- a/MirrorflyUIkit/Calls/CallLogViewController.swift +++ b/MirrorflyUIkit/Calls/CallLogViewController.swift @@ -90,12 +90,13 @@ class CallLogViewController: UIViewController { callLinkView.addGestureRecognizer(tap) callLogTableView.tableFooterView = createTableFooterView() ChatManager.shared.connectionDelegate = self + fetchCallLogsFromServer() } override func viewWillAppear(_ animated: Bool) { self.navigationController?.navigationBar.isHidden = true - + self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false NotificationCenter.default.addObserver(self, selector: #selector(networkChange(_:)), name: Notification.Name(NetStatus.networkNotificationObserver), object: nil) NotificationCenter.default.addObserver(self, selector: #selector(self.methodOfReceivedPrivateChatNotification(notification:)), name: Notification.Name("PrivateChatAlertView"), object: nil) @@ -1116,7 +1117,17 @@ extension CallLogViewController: UIScrollViewDelegate { self.callLogTableView?.tableFooterView = nil self.isLoadingInProgress = false + // Keep a copy of old array before refreshing + let oldArray = self.callLogArray + self.callLogArray = CallLogManager.getAllCallLogs() + + for i in 0.. #lifecycle viewWillAppear") @@ -226,6 +226,7 @@ class CallUIViewController: UIViewController, UIAdaptivePresentationControllerDe FlyLogWriter.sharedInstance.writeText("#CALLUI #viewWillAppear showGridView \(showGridView)") self.showGridView = true } + self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false self.transformTileAndGridConstraints() navigationController?.setNavigationBarHidden(true, animated: false) UIDevice.current.endGeneratingDeviceOrientationNotifications() @@ -233,6 +234,7 @@ class CallUIViewController: UIViewController, UIAdaptivePresentationControllerDe CallManager.delegate = self CallManager.connectionQuality = self AudioManager.shared().audioManagerDelegate = self + setsAudioRouteImage() // AudioManager.shared().getCurrentAudioInput() dismissCalled = false updateUI() @@ -367,6 +369,30 @@ class CallUIViewController: UIViewController, UIAdaptivePresentationControllerDe } } + func setsAudioRouteImage() { + DispatchQueue.main.async { + var imageName = "" + print("#GSM #audiomanager uiSelection UI --> \(AudioManager.shared().uiSelection)") + switch AudioManager.shared().uiSelection { + case .receiver: + imageName = "IconSpeakerOff" + case .speaker: + imageName = "IconSpeakerOn" + case .headset: + imageName = "headset" + case .bluetooth: + imageName = "bluetooth_headset" + @unknown default: + imageName = "IconSpeakerOff" + } + if let image = UIImage(named: imageName) { + self.outgoingCallView?.speakerButton.setImage(image, for: .normal) + self.outgoingCallView?.speakerButton.setNeedsDisplay() + self.outgoingCallView?.speakerButton.setNeedsLayout() + } + } + } + override func viewDidAppear(_ animated: Bool) { outgoingCallView?.tileCollectionView.scrollIndicatorInsets = .zero ContactManager.shared.profileDelegate = self @@ -797,20 +823,20 @@ class CallUIViewController: UIViewController, UIAdaptivePresentationControllerDe self?.showOrHideAudioWaveView(hide: true) } - if self?.members.last?.isVideoMuted ?? false == true { - self?.outgoingCallView?.audioMuteStackView.isHidden = true - self?.outgoingCallView?.audioMutedIcon.isHidden = true - self?.outgoingCallView?.audioCallMutedIcon.isHidden = !remoteAudioMuted - self?.showHideCallBackgroundProfiles(hide: false) - self?.showOrHideAudioWaveView(hide: remoteAudioMuted) - } - if self?.members.last?.isVideoMuted ?? false == false { - self?.outgoingCallView?.audioMuteStackView.isHidden = !remoteAudioMuted - self?.outgoingCallView?.audioMutedIcon.isHidden = !remoteAudioMuted - self?.outgoingCallView?.audioCallMutedIcon.isHidden = true - self?.showHideCallBackgroundProfiles(hide: true) - self?.showOrHideAudioWaveView(hide: true) - } +// if self?.members.last?.isVideoMuted ?? false == true { +// self?.outgoingCallView?.audioMuteStackView.isHidden = true +// self?.outgoingCallView?.audioMutedIcon.isHidden = true +// self?.outgoingCallView?.audioCallMutedIcon.isHidden = !remoteAudioMuted +// self?.showHideCallBackgroundProfiles(hide: false) +// self?.showOrHideAudioWaveView(hide: remoteAudioMuted) +// } +// if self?.members.last?.isVideoMuted ?? false == false { +// self?.outgoingCallView?.audioMuteStackView.isHidden = !remoteAudioMuted +// self?.outgoingCallView?.audioMutedIcon.isHidden = !remoteAudioMuted +// self?.outgoingCallView?.audioCallMutedIcon.isHidden = true +// self?.showHideCallBackgroundProfiles(hide: true) +// self?.showOrHideAudioWaveView(hide: true) +// } } }else{ if let cell = self?.outgoingCallView?.tileCollectionView?.cellForItem(at: IndexPath(item: 0, section: 0)) as? TileCell{ @@ -1112,9 +1138,11 @@ extension CallUIViewController { let notVideoMuted = members.filter({$0.isVideoMuted == false}) if notVideoMuted.count == 0 { CallManager.setCallType(callType: .Audio) + AudioManager.shared().setCategoryAndMode() getUserJid = AppUtils.getMyJid() }else { CallManager.setCallType(callType: .Video) + AudioManager.shared().setCategoryAndMode() getUserJid = AppUtils.getMyJid() } } @@ -1292,6 +1320,7 @@ extension CallUIViewController { let cancelAction = UIAlertAction(title: "Cancel", style: .default) { [weak self] (action) in CallManager.setCallType(callType: .Audio) + AudioManager.shared().setCategoryAndMode() self?.getUserJid = AppUtils.getMyJid() self?.isCallConversionRequestedByMe = false self?.resetConversionTimer() @@ -1325,7 +1354,7 @@ extension CallUIViewController { self?.alertController?.dismiss(animated: true, completion: nil) } CallManager.muteVideo(false) - AudioManager.shared().autoReRoute() + //AudioManager.shared().autoReRoute() }else { alertController?.dismiss(animated: true) if self.members.count > 2 { @@ -1379,7 +1408,8 @@ extension CallUIViewController { isCallConversionRequestedByMe = false isCallConversionRequestedByRemote = false CallManager.muteVideo(false) - AudioManager.shared().autoReRoute() + AudioManager.shared().setCategoryAndMode() + //AudioManager.shared().autoReRoute() resetConversionTimer() if CallManager.getCallStatus(userId: AppUtils.getMyJid()) != .RECONNECTING{ AudioManager.shared().stopPlayingTone() @@ -1401,7 +1431,8 @@ extension CallUIViewController { self?.isCallConversionRequestedByRemote = false self?.switchAudioToVideoCall() CallManager.muteVideo(false) - AudioManager.shared().autoReRoute() + AudioManager.shared().setCategoryAndMode() + //AudioManager.shared().autoReRoute() self?.outgoingCallView?.tileCollectionView.reloadData() self?.resetConversionTimer() } @@ -1416,6 +1447,7 @@ extension CallUIViewController { self?.alertController?.dismiss(animated: true, completion: nil) CallManager.setCallType(callType: .Audio) self?.getUserJid = AppUtils.getMyJid() + AudioManager.shared().setCategoryAndMode() // Cancel Request CallManager.declineVideoCallSwitchRequest() self?.isCallConversionRequestedByMe = false @@ -1471,6 +1503,7 @@ extension CallUIViewController { AudioManager.shared().stopPlayingTone() if CallManager.getCallType() != .Video { CallManager.setCallType(callType: .Audio) + AudioManager.shared().setCategoryAndMode() getUserJid = AppUtils.getMyJid() isCallConversionRequestedByMe = false isCallConversionRequestedByRemote = false @@ -1958,38 +1991,48 @@ extension CallUIViewController : CallViewControllerDelegate { cell.profileImageView.isHidden = true } } - isLocalViewSwitched = false + // isLocalViewSwitched = false } - if !isLocalViewSwitched { - //if let localView = outgoingCallView?.localUserVideoView { - addSwitchedRemoteTrackToView(localView: UIView(), isLocal: true) - //} - } else { - if let localView = outgoingCallView?.remoteUserVideoView { - addSwitchedRemoteTrackToView(localView: localView, isLocal: false) - } - } +// if !isLocalViewSwitched { +// //if let localView = outgoingCallView?.localUserVideoView { +// addSwitchedRemoteTrackToView(localView: UIView(), isLocal: true) +// //} +// } else { +// if let localView = outgoingCallView?.remoteUserVideoView { +// addSwitchedRemoteTrackToView(localView: localView, isLocal: false) +// } +// } if CallManager.isOneToOneCall() || (CallManager.getCallMode() == .MEET && (members.count == 2 || members.count == 1)) { setVideoBtnIcon() outgoingCallView?.cameraButton.isHidden = isVideoMuted setMuteStatusText() - if status { - if let cell = self.outgoingCallView?.tileCollectionView?.cellForItem(at: IndexPath(item: 0, section: 0)) as? TileCell{ - cell.profileImageView.isHidden = false + if !isLocalViewSwitched { + if status { + if let cell = self.outgoingCallView?.tileCollectionView?.cellForItem(at: IndexPath(item: 0, section: 0)) as? TileCell{ + cell.profileImageView.isHidden = false + } + outgoingCallView?.tileCollectionView.removeGestureRecognizer(videoTapGesture) + }else{ + + if !(members.last?.isVideoMuted ?? false) && !(members.first?.isVideoMuted ?? false) { + + videoTapGesture = UITapGestureRecognizer(target: self, action: #selector(smallVideoTileTapped(_:))) + outgoingCallView?.tileCollectionView?.addGestureRecognizer(videoTapGesture) + } } - outgoingCallView?.tileCollectionView.removeGestureRecognizer(videoTapGesture) + outgoingCallView?.tileCollectionView.reloadWithoutAnimation() }else{ - - if !(members.last?.isVideoMuted ?? false) && !(members.first?.isVideoMuted ?? false) { - - videoTapGesture = UITapGestureRecognizer(target: self, action: #selector(smallVideoTileTapped(_:))) - outgoingCallView?.tileCollectionView?.addGestureRecognizer(videoTapGesture) + if members.last?.isVideoMuted ?? false { + showHideCallBackgroundProfiles(hide: false) + setupTopViewConstraints() + }else { + showHideCallBackgroundProfiles(hide: true) + setupTopViewConstraints() } } - outgoingCallView?.tileCollectionView.reloadWithoutAnimation() } else { setVideoBtnIcon() outgoingCallView?.cameraButton.isHidden = isVideoMuted @@ -2016,7 +2059,7 @@ extension CallUIViewController : CallViewControllerDelegate { } } } - AudioManager.shared().autoReRoute() + //AudioManager.shared().autoReRoute() if isVideoMuted == true { outgoingCallView?.speakerButton.isHidden = false @@ -2329,7 +2372,7 @@ extension CallUIViewController : CallManagerDelegate { if self.members.count == 2 && CallManager.getCallType() == .Audio { self.showHideCallBackgroundProfiles(hide: false) } else { - if self.showGridView || (self.members.count == 2 && self.members.first?.isVideoMuted == false && self.isLocalViewSwitched == false) || CallManager.getCallType() == .Video { + if self.showGridView || (self.members.count == 2 && self.members.first?.isVideoMuted == false && self.isLocalViewSwitched == false) { self.showHideCallBackgroundProfiles(hide: true) } } @@ -2606,11 +2649,11 @@ extension CallUIViewController : CallManagerDelegate { } } - if self.currentOutputDevice == .headset { - audioRoutedTo(deviceName: "headset", audioDeviceType: .headset) - } else if self.currentOutputDevice == .bluetooth { - audioRoutedTo(deviceName: "bluetooth", audioDeviceType: .bluetooth) - } +// if self.currentOutputDevice == .headset { +// audioRoutedTo(deviceName: "headset", audioDeviceType: .headset) +// } else if self.currentOutputDevice == .bluetooth { +// audioRoutedTo(deviceName: "bluetooth", audioDeviceType: .bluetooth) +// } if members.count > 2 { DispatchQueue.main.async { @@ -2967,6 +3010,13 @@ extension CallUIViewController : CallManagerDelegate { self?.itemToInsert.removeAll() if userId == AppUtils.getMyJid() { self?.outgoingCallView?.reconnectingLable?.text = "" + for i in self?.members ?? [CallMember]() { + if i.jid != AppUtils.getMyJid(){ + if i.callStatus == .reconnecting && CallManager.isOneToOneCall() { + self?.outgoingCallView?.reconnectingLable?.text = "\(ChatManager.getUserNameAndNickName(userJid: i.jid).name) Reconnecting..." + } + } + } } if !CallManager.isCallConnected(){ return @@ -2980,7 +3030,7 @@ extension CallUIViewController : CallManagerDelegate { self?.myCallStatus = .connected } - self?.outgoingCallView?.reconnectingLable?.text = emptyString() + // self?.outgoingCallView?.reconnectingLable?.text = emptyString() if CallManager.isOneToOneCall() || (CallManager.getCallMode() == .MEET && (self?.members.count == 1 || self?.members.count == 2)) { self?.updateActionsUI() if CallManager.getCallType() == .Audio { @@ -3424,7 +3474,8 @@ extension CallUIViewController : CallManagerDelegate { setVideoBtnIcon() resetConversionTimer() //localProfileImageView.removeFromSuperview() - AudioManager.shared().autoReRoute() + AudioManager.shared().setCategoryAndMode() + //AudioManager.shared().autoReRoute() self.outgoingCallView?.tileCollectionView.reloadData() } else if callAction == CallAction.ACTION_VIDEO_CALL_CONVERSION_REJECTED { @@ -3437,16 +3488,17 @@ extension CallUIViewController : CallManagerDelegate { if filteredmember.count > 0 { AppAlert.shared.showToast(message: filteredmember[0].name.isEmpty ? "Request declined" : "Request declined by \(filteredmember[0].name)") } - if CallManager.getCallType() == .Video { - print("#switch Simulataious Switch Video \(callAction.rawValue)") - if currentOutputDevice == .speaker { - AudioManager.shared().routeToSpeaker() - audioRoutedTo(deviceName: "Speaker", audioDeviceType: .speaker) - }else{ - audioRoutedTo(deviceName: "iPhone", audioDeviceType: .receiver) - } - } +// if CallManager.getCallType() == .Video { +// print("#switch Simulataious Switch Video \(callAction.rawValue)") +// if currentOutputDevice == .speaker { +// AudioManager.shared().routeToSpeaker() +// audioRoutedTo(deviceName: "Speaker", audioDeviceType: .speaker) +// }else{ +// audioRoutedTo(deviceName: "iPhone", audioDeviceType: .receiver) +// } +// } CallManager.setCallType(callType: .Audio) + AudioManager.shared().setCategoryAndMode() getUserJid = AppUtils.getMyJid() isCallConversionRequestedByMe = false isCallConversionRequestedByRemote = false @@ -3470,6 +3522,7 @@ extension CallUIViewController : CallManagerDelegate { CallManager.setCallType(callType: .Audio) getUserJid = AppUtils.getMyJid() isCallConversionRequestedByRemote = false + AudioManager.shared().setCategoryAndMode() showOneToOneAudioCallUI() CallManager.cancelVideoCallSwitch() } @@ -3487,6 +3540,7 @@ extension CallUIViewController : CallManagerDelegate { } alertController?.dismiss(animated: true, completion: nil) CallManager.setCallType(callType: .Audio) + AudioManager.shared().setCategoryAndMode() getUserJid = AppUtils.getMyJid() resetConversionTimer() showOneToOneAudioCallUI() @@ -3498,12 +3552,12 @@ extension CallUIViewController : CallManagerDelegate { audioRoutedTo(deviceName: "Speaker", audioDeviceType: .speaker) } }else{ - AudioManager.shared().autoReRoute() - let audioOUtput = AudioManager.shared().currentAudioOutput() - if audioOUtput.0 == .headset || audioOUtput.0 == .bluetooth { - outgoingCallView?.speakerButton.isHidden = false - } - audioRoutedTo(deviceName: audioOUtput.1, audioDeviceType: audioOUtput.0) + //AudioManager.shared().autoReRoute() +// let audioOUtput = AudioManager.shared().currentAudioOutput() +// if audioOUtput.0 == .headset || audioOUtput.0 == .bluetooth { +// outgoingCallView?.speakerButton.isHidden = false +// } +// audioRoutedTo(deviceName: audioOUtput.1, audioDeviceType: audioOUtput.0) } isCallConversionRequestedByRemote = false isCallConversionRequestedByMe = false @@ -3662,6 +3716,16 @@ extension CallUIViewController : CallManagerDelegate { setMuteStatusText() } case .ACTION_REMOTE_VIDEO_MUTE: + let notVideoMuted = members.filter({$0.isVideoMuted == false}) + if notVideoMuted.count == 0 { + CallManager.setCallType(callType: .Audio) + AudioManager.shared().setCategoryAndMode() + getUserJid = AppUtils.getMyJid() + }else { + CallManager.setCallType(callType: .Video) + AudioManager.shared().setCategoryAndMode() + getUserJid = AppUtils.getMyJid() + } if videoStatus == true { return } @@ -3719,6 +3783,16 @@ extension CallUIViewController : CallManagerDelegate { } else { updateMuteStatus(jid: userId, isMute: false, isAudio: false) } + let notVideoMuted = members.filter({$0.isVideoMuted == false}) + if notVideoMuted.count == 0 { + CallManager.setCallType(callType: .Audio) + AudioManager.shared().setCategoryAndMode() + getUserJid = AppUtils.getMyJid() + }else { + CallManager.setCallType(callType: .Video) + AudioManager.shared().setCategoryAndMode() + getUserJid = AppUtils.getMyJid() + } case .ACTION_LOCAL_AUDIO_MUTE: if !isLocalViewSwitched { getUserJid = userId @@ -3969,11 +4043,13 @@ extension CallUIViewController { if let first = members.first, let last = members.last{ if !first.isVideoMuted || !last.isVideoMuted { CallManager.setCallType(callType: .Video) + AudioManager.shared().setCategoryAndMode() } } } if (members.first?.isVideoMuted ?? true) && (members.last?.isVideoMuted ?? true) { CallManager.setCallType(callType: .Audio) + AudioManager.shared().setCategoryAndMode() getUserJid = AppUtils.getMyJid() } if CallManager.getCallType() == .Audio && (members.first?.isVideoMuted ?? true && members.last?.isVideoMuted ?? true) { @@ -4222,6 +4298,7 @@ extension CallUIViewController { if members.count == 2 { if CallManager.isOneToOneCall() && (isVideoMuted && members.first?.isVideoMuted ?? false){ CallManager.setCallType(callType: .Audio) + AudioManager.shared().setCategoryAndMode() getUserJid = AppUtils.getMyJid() } } @@ -4465,8 +4542,14 @@ extension CallUIViewController : AudioManagerDelegate { if item.type != .receiver { audioDevicesAlertController!.addAction(action) } - } else { - audioDevicesAlertController!.addAction(action) + } else { + if CallManager.getCallType() == .Video && members.last?.isVideoMuted == true { + if item.type != .receiver { + audioDevicesAlertController!.addAction(action) + } + }else{ + audioDevicesAlertController!.addAction(action) + } } } audioDevicesAlertController!.addAction(UIAlertAction(title: "Cancel", style: .cancel)) @@ -5131,7 +5214,6 @@ extension CallUIViewController { } } } - } func setupTileViewConstraints(isRemoveUser: Bool) { diff --git a/MirrorflyUIkit/Calls/JoinCallViaLinkViewController.swift b/MirrorflyUIkit/Calls/JoinCallViaLinkViewController.swift index 2d17bb1..d10300e 100644 --- a/MirrorflyUIkit/Calls/JoinCallViaLinkViewController.swift +++ b/MirrorflyUIkit/Calls/JoinCallViaLinkViewController.swift @@ -124,6 +124,7 @@ class JoinCallViaLinkViewController: BaseViewController, CallUIDelegate { initJoinLink() CallManager.callUiDelegate = self ChatViewParentController.receiveCallModeDelegate = nil + self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false CallUIViewController.pipModeDelegate = nil } diff --git a/MirrorflyUIkit/Calls/ShareCallLinkViewController.swift b/MirrorflyUIkit/Calls/ShareCallLinkViewController.swift index d4195ff..c1451fd 100644 --- a/MirrorflyUIkit/Calls/ShareCallLinkViewController.swift +++ b/MirrorflyUIkit/Calls/ShareCallLinkViewController.swift @@ -41,6 +41,7 @@ class ShareCallLinkViewController: UIViewController { } override func viewWillAppear(_ animated: Bool) { + self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false NotificationCenter.default.addObserver(self, selector: #selector(networkChange(_:)),name:Notification.Name(NetStatus.networkNotificationObserver),object: nil) } diff --git a/MirrorflyUIkit/Chat/ChatViewParentController.swift b/MirrorflyUIkit/Chat/ChatViewParentController.swift index c29822b..edce7f0 100755 --- a/MirrorflyUIkit/Chat/ChatViewParentController.swift +++ b/MirrorflyUIkit/Chat/ChatViewParentController.swift @@ -3122,6 +3122,7 @@ extension ChatViewParentController { self?.setLastMessage(messageId: chatMessage.messageId) chatMessage.mediaChatMessage?.mediaUploadStatus = .uploading self?.reloadList(message: chatMessage) + self?.resetMessageTextView() self?.replyMessageId = "" self?.tableViewBottomConstraint?.constant = CGFloat(chatBottomConstant) if self?.replyJid == self?.getProfileDetails.jid { @@ -3163,6 +3164,7 @@ extension ChatViewParentController { self?.setLastMessage(messageId: chatMessage.messageId) chatMessage.mediaChatMessage?.mediaUploadStatus = .uploading self?.reloadList(message: chatMessage) + self?.resetMessageTextView() self?.replyMessageId = "" self?.tableViewBottomConstraint?.constant = CGFloat(chatBottomConstant) if self?.replyJid == self?.getProfileDetails.jid { @@ -3280,16 +3282,20 @@ extension ChatViewParentController: AVAudioRecorderDelegate, AVAudioPlayerDelega if let cell = chatTableView.cellForRow(at: path) as? AudioSender { cell.playIcon?.image = UIImage(named: ImageConstant.ic_play) cell.audioPlaySlider?.value = 0 - let totalTimeString = String(format: "%02d:%02d", 0, 0) - cell.autioDuration?.text = totalTimeString +// let totalTimeString = String(format: "%02d:%02d", 0, 0) +// cell.autioDuration?.text = totalTimeString let message = isStarredMessagePage == true ? isStarredSearchEnabled == true ? starredSearchMessages?[path.row] : starredMessages[path.row] : chatMessages[path.section][path.row] + let duration = Int(message?.mediaChatMessage?.mediaDuration ?? 0) + cell.autioDuration?.text = "\(duration.msToSeconds.minuteSecondMS)" message?.audioTrackTime = 0 } else if let cell = chatTableView.cellForRow(at: path) as? AudioReceiver { cell.slider?.value = 0 let message = isStarredMessagePage == true ? isStarredSearchEnabled == true ? starredSearchMessages?[path.row] : starredMessages[path.row] : chatMessages[path.section][path.row] message?.audioTrackTime = 0 - let totalTimeString = String(format: "%02d:%02d", 0, 0) - cell.audioDuration?.text = totalTimeString +// let totalTimeString = String(format: "%02d:%02d", 0, 0) +// cell.audioDuration?.text = totalTimeString + let duration = Int(message?.mediaChatMessage?.mediaDuration ?? 0) + cell.audioDuration?.text = "\(duration.msToSeconds.minuteSecondMS)" cell.playImage?.image = UIImage(named: ImageConstant.ic_play_dark) } } @@ -3781,6 +3787,9 @@ extension ChatViewParentController { guard let msg = sendMessage else { return } self?.reloadList(message: msg) self?.tableViewBottomConstraint?.constant = CGFloat(chatBottomConstant) + if !mediaData.caption.isEmpty{ + self?.resetMessageTextView() + } if self?.replyJid == self?.getProfileDetails.jid { self?.replyMessageObj = nil self?.isReplyViewOpen = false @@ -3850,7 +3859,7 @@ extension ChatViewParentController { controller.selectedAssets = self.selectedAssets controller.profileName = getProfileDetails.name controller.groupMembers = groupMembers.filter({$0.memberJid != AppUtils.getMyJid()}) - controller.getProfileDetails = getProfileDetails + controller.profileDetails = getProfileDetails navigationController?.navigationBar.isHidden = true self.navigationController?.pushViewController(controller, animated: false) } @@ -4670,7 +4679,19 @@ extension ChatViewParentController : UITableViewDataSource ,UITableViewDelegate, if let minuteSeconds = audioPlayer?.currentTime.minuteSecondMS { cell?.autioDuration?.text = minuteSeconds cell?.audioPlaySlider?.value = Float(audioPlayer?.currentTime ?? 0.0) - currenAudioIndexPath = indexPath +// currenAudioIndexPath = indexPath + let components = minuteSeconds.split(separator: ":") + if let minutes = Int(components[0]), let seconds = Int(components[1]) { + let isZero = (minutes == 0 && seconds == 0) + if isZero{ + let duration = Int(message?.mediaChatMessage?.mediaDuration ?? 0) + cell?.autioDuration?.text = "\(duration.msToSeconds.minuteSecondMS)" + }else{ + cell?.autioDuration?.text = minuteSeconds + cell?.audioPlaySlider?.value = Float(audioPlayer?.currentTime ?? 0.0) + currenAudioIndexPath = indexPath + } + } } } if let mediaFileName = message?.mediaChatMessage?.mediaFileName, let duration = ChatUtils.getAudiofileDuration(mediaFileName: mediaFileName){ @@ -4735,9 +4756,21 @@ extension ChatViewParentController : UITableViewDataSource ,UITableViewDelegate, } if let audioUrl = currentAudioUrl, audioUrl == message?.mediaChatMessage?.mediaFileName { if let minuteSeconds = audioPlayer?.currentTime.minuteSecondMS { - cell?.audioDuration?.text = FlyUtils.secondsToDurationInString(seconds: Double(audioPlayer?.currentTime ?? 0.0)) - cell?.slider?.value = Float(audioPlayer?.currentTime ?? 0.0) - currenAudioIndexPath = indexPath +// cell?.audioDuration?.text = FlyUtils.secondsToDurationInString(seconds: Double(audioPlayer?.currentTime ?? 0.0)) +// cell?.slider?.value = Float(audioPlayer?.currentTime ?? 0.0) +// currenAudioIndexPath = indexPath + let components = minuteSeconds.split(separator: ":") + if let minutes = Int(components[0]), let seconds = Int(components[1]) { + let isZero = (minutes == 0 && seconds == 0) + if isZero{ + let duration = Int(message?.mediaChatMessage?.mediaDuration ?? 0) + cell?.audioDuration?.text = "\(duration.msToSeconds.minuteSecondMS)" + }else{ + cell?.audioDuration?.text = minuteSeconds + cell?.slider?.value = Float(audioPlayer?.currentTime ?? 0.0) + currenAudioIndexPath = indexPath + } + } } } if let mediaFileName = message?.mediaChatMessage?.mediaFileName, let duration = ChatUtils.getAudiofileDuration(mediaFileName: mediaFileName){ @@ -6227,6 +6260,7 @@ extension ChatViewParentController: ContactDelegate { self?.chatTableView?.endUpdates() let indexPath = IndexPath(row: 0, section: 0) self?.chatTableView?.scrollToRow(at: indexPath, at: .top, animated: true) + self?.resetMessageTextView() self?.messageTextView?.text = "" self?.replyMessageId = "" self?.tableViewBottomConstraint?.constant = CGFloat(chatBottomConstant) @@ -6285,6 +6319,7 @@ extension ChatViewParentController: LocationDelegate { self?.markMessagessAsRead() guard let msg = message else { return } self?.reloadList(message: msg) + self?.resetMessageTextView() self?.messageTextView?.text = "" self?.replyMessageId = "" self?.tableViewBottomConstraint?.constant = CGFloat(chatBottomConstant) @@ -6584,7 +6619,7 @@ extension ChatViewParentController: CNContactPickerDelegate { extension ChatViewParentController { func requestContactAccess() { switch CNContactStore.authorizationStatus(for: .contacts) { - case .authorized: + case .authorized, .limited: showContactPicker() case .denied: showSettingsAlertForContacts() @@ -6644,6 +6679,9 @@ extension ChatViewParentController { guard let msg = message else { return } self?.reloadList(message: msg) self?.tableViewBottomConstraint?.constant = CGFloat(chatBottomConstant) + if !mediaData.caption.isEmpty{ + self?.resetMessageTextView() + } if self?.replyJid == self?.getProfileDetails.jid { self?.replyMessageObj = nil self?.isReplyViewOpen = false diff --git a/MirrorflyUIkit/Chat/Contact/View/ChatContactViewController.swift b/MirrorflyUIkit/Chat/Contact/View/ChatContactViewController.swift index d6fa615..f002a75 100755 --- a/MirrorflyUIkit/Chat/Contact/View/ChatContactViewController.swift +++ b/MirrorflyUIkit/Chat/Contact/View/ChatContactViewController.swift @@ -28,6 +28,7 @@ class ChatContactViewController: UIViewController { } override func viewWillAppear(_ animated: Bool) { + self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false ChatViewParentController.receiveCallModeDelegate = nil CallUIViewController.pipModeDelegate = nil } diff --git a/MirrorflyUIkit/Chat/Documents/Receiver Documents/ReceiverDocumentsTableViewCell.swift b/MirrorflyUIkit/Chat/Documents/Receiver Documents/ReceiverDocumentsTableViewCell.swift index 39f64ac..2ce89ef 100644 --- a/MirrorflyUIkit/Chat/Documents/Receiver Documents/ReceiverDocumentsTableViewCell.swift +++ b/MirrorflyUIkit/Chat/Documents/Receiver Documents/ReceiverDocumentsTableViewCell.swift @@ -219,7 +219,11 @@ class ReceiverDocumentsTableViewCell: BaseTableViewCell { groupSenderNameView?.isHidden = true let getReplymessage = message?.replyParentChatMessage?.messageTextContent let replyMessage = FlyMessenger.getMessageOfId(messageId: message?.replyParentChatMessage?.messageId ?? "") - replyTypeLabel?.attributedText = ChatUtils.getAttributedMessage(message: getReplymessage ?? "", searchText: searchText, isMessageSearch: isMessageSearch, isSystemBlue: false) + if (message?.messageChatType == .groupChat || isStarredMessagePage ?? false) && !(replyMessage?.mentionedUsersIds.isEmpty ?? true) { + replyTypeLabel?.attributedText = ChatUtils.getMentionTextContent(message: replyMessage?.messageTextContent ?? "", isMessageSentByMe: replyMessage!.isMessageSentByMe, mentionedUsers: replyMessage?.mentionedUsersIds ?? [], searchedText: searchText) + } else { + replyTypeLabel?.attributedText = ChatUtils.getAttributedMessage(message: getReplymessage ?? "", searchText: searchText, isMessageSearch: isMessageSearch, isSystemBlue: false) + } replyTypeIconImageView?.isHidden = true replyTypeIconView?.isHidden = true if replyMessage?.isMessageSentByMe == true { @@ -233,7 +237,7 @@ class ReceiverDocumentsTableViewCell: BaseTableViewCell { } replyTypeImageView?.isHidden = true replyTypeIconWidthCons?.constant = 0 - if message?.replyParentChatMessage?.isMessageDeleted == true || message?.replyParentChatMessage?.isMessageRecalled == true || replyMessage == nil { + if replyMessage?.isMessageDeleted == true || replyMessage?.isMessageRecalled == true || replyMessage == nil { replyTypeLabel?.text = "Original message not available" replyTypeIconWidthCons?.constant = 0 replyTypeImageView?.isHidden = true @@ -298,7 +302,7 @@ class ReceiverDocumentsTableViewCell: BaseTableViewCell { replyTypeIconImageView?.image = UIImage(named: (message?.isMessageSentByMe ?? false) ? "document" : "document") let mediaUrl = message?.mediaChatMessage?.mediaFileUrl checkFileType(urlExtension: ((mediaUrl?.isEmpty ?? false ? (message?.mediaChatMessage?.mediaLocalStoragePath.components(separatedBy: ".").last as? String) : mediaUrl?.components(separatedBy: ".").last) ?? ""), typeImageView: replyTypeImageView) - replyTypeLabel?.text = message?.replyParentChatMessage?.mediaChatMessage?.mediaFileName + replyTypeLabel?.text = replyMessage?.mediaChatMessage?.mediaFileName replyTypeImageView?.isHidden = false replyStackViewTrailingCons?.constant = 54 replyImageWidthCons?.isActive = true diff --git a/MirrorflyUIkit/Chat/Documents/Sender Documents/SenderDocumentsTableViewCell.swift b/MirrorflyUIkit/Chat/Documents/Sender Documents/SenderDocumentsTableViewCell.swift index c7f3f81..349f12c 100644 --- a/MirrorflyUIkit/Chat/Documents/Sender Documents/SenderDocumentsTableViewCell.swift +++ b/MirrorflyUIkit/Chat/Documents/Sender Documents/SenderDocumentsTableViewCell.swift @@ -206,13 +206,18 @@ class SenderDocumentsTableViewCell: BaseTableViewCell { nickName: replyMessage?.senderNickName ?? "", contactType: replyMessage?.isSavedContact == true ? .live : .unknown) } - if message?.replyParentChatMessage?.isMessageDeleted == true || message?.replyParentChatMessage?.isMessageRecalled == true || replyMessage == nil { + if replyMessage?.isMessageDeleted == true || replyMessage?.isMessageRecalled == true || replyMessage == nil { replyTypeLabel?.text = "Original message not available" replyMessageIconWidth?.constant = 0 replyMediaImageWidthCons?.constant = 0 replyTypeIconImageView?.isHidden = true } else { - replyTypeLabel?.attributedText = ChatUtils.getAttributedMessage(message: getReplymessage ?? "", searchText: searchText, isMessageSearch: isMessageSearch, isSystemBlue: false) + if (message?.messageChatType == .groupChat || isStarredMessagePage ?? false) && !(replyMessage?.mentionedUsersIds.isEmpty ?? true) { + replyTypeLabel?.attributedText = ChatUtils.getMentionTextContent(message: replyMessage?.messageTextContent ?? "", isMessageSentByMe: replyMessage!.isMessageSentByMe, mentionedUsers: replyMessage?.mentionedUsersIds ?? [], searchedText: searchText) + } else { + replyTypeLabel?.attributedText = ChatUtils.getAttributedMessage(message: getReplymessage ?? "", searchText: searchText, isMessageSearch: isMessageSearch, isSystemBlue: false) + } + checkFileType(url: replyMessage?.mediaChatMessage?.mediaFileUrl ?? "", typeImageView: replyTypeImageView) replyMessageIconWidth?.constant = 0 if replyMessage?.mediaChatMessage != nil { @@ -241,7 +246,7 @@ class SenderDocumentsTableViewCell: BaseTableViewCell { replyTypeIconImageView?.image = UIImage(named: (message?.isMessageSentByMe ?? false) ? "senderVideo" : "video") replyTypeImageView?.isHidden = false replyMediaImageWidthCons?.constant = 50 - if let thumImage = message?.replyParentChatMessage?.mediaChatMessage?.mediaThumbImage { + if let thumImage = replyMessage?.mediaChatMessage?.mediaThumbImage { let converter = ImageConverter() let image = converter.base64ToImage(thumImage) replyTypeImageView?.image = image diff --git a/MirrorflyUIkit/Chat/ScheduledMeeting/InstantScheduledMeetingViewController.swift b/MirrorflyUIkit/Chat/ScheduledMeeting/InstantScheduledMeetingViewController.swift index abba317..0f86715 100644 --- a/MirrorflyUIkit/Chat/ScheduledMeeting/InstantScheduledMeetingViewController.swift +++ b/MirrorflyUIkit/Chat/ScheduledMeeting/InstantScheduledMeetingViewController.swift @@ -110,6 +110,7 @@ class InstantScheduledMeetingViewController: UIViewController, UIGestureRecogniz } override func viewWillAppear(_ animated: Bool) { + self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false NotificationCenter.default.addObserver(self, selector: #selector(networkChange(_:)),name:Notification.Name(NetStatus.networkNotificationObserver),object: nil) } diff --git a/MirrorflyUIkit/Chat/video/ChatViewVideoIncomingCell.swift b/MirrorflyUIkit/Chat/video/ChatViewVideoIncomingCell.swift index becd996..399374f 100755 --- a/MirrorflyUIkit/Chat/video/ChatViewVideoIncomingCell.swift +++ b/MirrorflyUIkit/Chat/video/ChatViewVideoIncomingCell.swift @@ -226,11 +226,16 @@ class ChatViewVideoIncomingCell: BaseTableViewCell { replyView?.isHidden = false let getReplymessage = message?.replyParentChatMessage?.messageTextContent let replyMessage = FlyMessenger.getMessageOfId(messageId: message?.replyParentChatMessage?.messageId ?? "") - if message?.replyParentChatMessage?.isMessageDeleted == true || message?.replyParentChatMessage?.isMessageRecalled == true || replyMessage == nil { + if replyMessage?.isMessageDeleted == true || replyMessage?.isMessageRecalled == true || replyMessage == nil { replyTextLabel?.text = "Original message not available" } else { messageIconView?.isHidden = true - replyTextLabel?.attributedText = ChatUtils.getAttributedMessage(message: getReplymessage ?? "", searchText: searchText, isMessageSearch: isMessageSearch, isSystemBlue: false) + if (message?.messageChatType == .groupChat || isStarredMessagePage ?? false) && !(replyMessage?.mentionedUsersIds.isEmpty ?? true) { + replyTextLabel?.attributedText = ChatUtils.getMentionTextContent(message: replyMessage?.messageTextContent ?? "", isMessageSentByMe: replyMessage!.isMessageSentByMe, mentionedUsers: replyMessage?.mentionedUsersIds ?? [], searchedText: searchText) + } else { + replyTextLabel?.attributedText = ChatUtils.getAttributedMessage(message: getReplymessage ?? "", searchText: searchText, isMessageSearch: isMessageSearch, isSystemBlue: false) + } + mapView?.isHidden = true if replyMessage?.mediaChatMessage != nil { messageTypeIcon?.isHidden = false diff --git a/MirrorflyUIkit/Chat/video/ChatViewVideoOutgoingCell.swift b/MirrorflyUIkit/Chat/video/ChatViewVideoOutgoingCell.swift index ba33dd0..825392d 100755 --- a/MirrorflyUIkit/Chat/video/ChatViewVideoOutgoingCell.swift +++ b/MirrorflyUIkit/Chat/video/ChatViewVideoOutgoingCell.swift @@ -218,7 +218,12 @@ class ChatViewVideoOutgoingCell: BaseTableViewCell { messageTypeIconView?.isHidden = true } else { messageTypeIconView?.isHidden = true - replyTextLabel?.attributedText = ChatUtils.getAttributedMessage(message: getReplymessage ?? "", searchText: searchText, isMessageSearch: isMessageSearch,isSystemBlue: false) + if (message?.messageChatType == .groupChat || isStarredMessagePage ?? false) && !(replyMessage?.mentionedUsersIds.isEmpty ?? true) { + replyTextLabel?.attributedText = ChatUtils.getMentionTextContent(message: replyMessage?.messageTextContent ?? "", isMessageSentByMe: replyMessage!.isMessageSentByMe, mentionedUsers: replyMessage?.mentionedUsersIds ?? [], searchedText: searchText) + } else { + replyTextLabel?.attributedText = ChatUtils.getAttributedMessage(message: getReplymessage ?? "", searchText: searchText, isMessageSearch: isMessageSearch,isSystemBlue: false) + } + if replyMessage?.mediaChatMessage != nil { switch replyMessage?.mediaChatMessage?.messageType { case .image: diff --git a/MirrorflyUIkit/Common/AppUtils.swift b/MirrorflyUIkit/Common/AppUtils.swift index dce07c6..7c4c2d2 100755 --- a/MirrorflyUIkit/Common/AppUtils.swift +++ b/MirrorflyUIkit/Common/AppUtils.swift @@ -121,7 +121,7 @@ class AppUtils: NSObject { let phoneNumberKit = PhoneNumberKit() do { let phoneNumber = try phoneNumberKit.parse(phoneNo) - splittedMobileNumber = " +\(String(describing: phoneNumber.countryCode)) \(String(describing: phoneNumber.nationalNumber))" + splittedMobileNumber = "+\(String(describing: phoneNumber.countryCode)) \(String(describing: phoneNumber.adjustedNationalNumber()))" } catch { } return splittedMobileNumber diff --git a/MirrorflyUIkit/Controllers/About and Help/AboutUsViewController.swift b/MirrorflyUIkit/Controllers/About and Help/AboutUsViewController.swift index 9d039ea..287162a 100644 --- a/MirrorflyUIkit/Controllers/About and Help/AboutUsViewController.swift +++ b/MirrorflyUIkit/Controllers/About and Help/AboutUsViewController.swift @@ -33,6 +33,7 @@ All your messages are end-to-end encrypted in We Must Meet. } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) + self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false self.navigationController?.isNavigationBarHidden = true } diff --git a/MirrorflyUIkit/Controllers/About and Help/AboutandHelpViewController.swift b/MirrorflyUIkit/Controllers/About and Help/AboutandHelpViewController.swift index 575c571..0633e8f 100644 --- a/MirrorflyUIkit/Controllers/About and Help/AboutandHelpViewController.swift +++ b/MirrorflyUIkit/Controllers/About and Help/AboutandHelpViewController.swift @@ -23,6 +23,7 @@ class AboutandHelpViewController: UIViewController{ override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) + self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false self.navigationController?.isNavigationBarHidden = true } diff --git a/MirrorflyUIkit/Controllers/Audio/TableCells/AudioReceiver.swift b/MirrorflyUIkit/Controllers/Audio/TableCells/AudioReceiver.swift index 0d20049..61bd977 100755 --- a/MirrorflyUIkit/Controllers/Audio/TableCells/AudioReceiver.swift +++ b/MirrorflyUIkit/Controllers/Audio/TableCells/AudioReceiver.swift @@ -226,40 +226,44 @@ class AudioReceiver: BaseTableViewCell, AVAudioPlayerDelegate { replyView?.isHidden = false let getReplymessage = message?.replyParentChatMessage?.messageTextContent let replyMessage = FlyMessenger.getMessageOfId(messageId: message?.replyParentChatMessage?.messageId ?? "") - if message?.replyParentChatMessage?.isMessageDeleted == true || message?.replyParentChatMessage?.isMessageRecalled == true || replyMessage == nil { + if replyMessage?.isMessageDeleted == true || replyMessage?.isMessageRecalled == true || replyMessage == nil { replyTextLabel?.text = "Original message not available" mapView?.isHidden = true } else { mapView?.isHidden = true - replyTextLabel?.attributedText = ChatUtils.getAttributedMessage(message: getReplymessage ?? "", searchText: searchText, isMessageSearch: isMessageSearch, isSystemBlue: false) + if (message?.messageChatType == .groupChat || isStarredMessagePage ?? false) && !(replyMessage?.mentionedUsersIds.isEmpty ?? true) { + replyTextLabel?.attributedText = ChatUtils.getMentionTextContent(message: replyMessage?.messageTextContent ?? "", isMessageSentByMe: replyMessage!.isMessageSentByMe, mentionedUsers: replyMessage?.mentionedUsersIds ?? [], searchedText: searchText) + } else { + replyTextLabel?.attributedText = ChatUtils.getAttributedMessage(message: getReplymessage ?? "", searchText: searchText, isMessageSearch: isMessageSearch, isSystemBlue: false) + } if replyMessage?.mediaChatMessage != nil { switch replyMessage?.mediaChatMessage?.messageType { case .image: messageTypeIcon?.image = UIImage(named: (message?.isMessageSentByMe ?? false) ? "senderCamera" : "receiverCamera") - if let thumImage = message?.replyParentChatMessage?.mediaChatMessage?.mediaThumbImage { + if let thumImage = replyMessage?.mediaChatMessage?.mediaThumbImage { let converter = ImageConverter() let image = converter.base64ToImage(thumImage) mediaMessageImageView?.image = image messageTypeIconView?.isHidden = false - replyTextLabel?.text = (!(message?.replyParentChatMessage?.mediaChatMessage?.mediaCaptionText.isEmpty ?? false)) ? message?.replyParentChatMessage?.mediaChatMessage?.mediaCaptionText : "Photo" + replyTextLabel?.text = (!(replyMessage?.mediaChatMessage?.mediaCaptionText.isEmpty ?? false)) ? replyMessage?.mediaChatMessage?.mediaCaptionText : "Photo" } replyWithMediaCons?.isActive = true replyWithOutMediaCons?.isActive = false case .audio: ChatUtils.setIconForAudio(imageView: messageTypeIcon, chatMessage: nil, replyParentMessage: message?.replyParentChatMessage) - let duration = Int(message?.replyParentChatMessage?.mediaChatMessage?.mediaDuration ?? 0) - replyTextLabel?.text = (!(message?.replyParentChatMessage?.mediaChatMessage?.mediaCaptionText.isEmpty ?? false)) ? message?.replyParentChatMessage?.mediaChatMessage?.mediaCaptionText : message?.replyParentChatMessage?.mediaChatMessage?.messageType.rawValue.capitalized.appending(" (\(duration.msToSeconds.minuteSecondMS))") + let duration = Int(replyMessage?.mediaChatMessage?.mediaDuration ?? 0) + replyTextLabel?.text = (!(replyMessage?.mediaChatMessage?.mediaCaptionText.isEmpty ?? false)) ? replyMessage?.mediaChatMessage?.mediaCaptionText : replyMessage?.mediaChatMessage?.messageType.rawValue.capitalized.appending(" (\(duration.msToSeconds.minuteSecondMS))") messageTypeIconView?.isHidden = false replyWithMediaCons?.isActive = false replyWithOutMediaCons?.isActive = true case .video: messageTypeIcon?.image = UIImage(named: (message?.isMessageSentByMe ?? false) ? "senderVideo" : "video") messageTypeIconView?.isHidden = false - if let thumImage = message?.replyParentChatMessage?.mediaChatMessage?.mediaThumbImage { + if let thumImage = replyMessage?.mediaChatMessage?.mediaThumbImage { let converter = ImageConverter() let image = converter.base64ToImage(thumImage) mediaMessageImageView?.image = image - replyTextLabel?.text = (!(message?.replyParentChatMessage?.mediaChatMessage?.mediaCaptionText.isEmpty ?? false)) ? message?.replyParentChatMessage?.mediaChatMessage?.mediaCaptionText : message?.replyParentChatMessage?.mediaChatMessage?.messageType.rawValue.capitalized + replyTextLabel?.text = (!(replyMessage?.mediaChatMessage?.mediaCaptionText.isEmpty ?? false)) ? replyMessage?.mediaChatMessage?.mediaCaptionText : replyMessage?.mediaChatMessage?.messageType.rawValue.capitalized } replyWithMediaCons?.isActive = true replyWithOutMediaCons?.isActive = false @@ -282,10 +286,10 @@ class AudioReceiver: BaseTableViewCell, AVAudioPlayerDelegate { mapView?.isUserInteractionEnabled = false messageTypeIcon?.image = UIImage(named: (message?.isMessageSentByMe ?? false) ? "map" : "receivedMap") messageTypeIconView?.isHidden = false - guard let latitude = message?.replyParentChatMessage?.locationChatMessage?.latitude else { + guard let latitude = replyMessage?.locationChatMessage?.latitude else { return nil } - guard let longitude = message?.replyParentChatMessage?.locationChatMessage?.longitude else { + guard let longitude = replyMessage?.locationChatMessage?.longitude else { return nil } @@ -306,7 +310,7 @@ class AudioReceiver: BaseTableViewCell, AVAudioPlayerDelegate { replyWithMediaCons?.isActive = true replyWithOutMediaCons?.isActive = false } else if replyMessage?.contactChatMessage != nil { - replyTextLabel?.attributedText = ChatUtils.setAttributeString(name: message?.replyParentChatMessage?.contactChatMessage?.contactName) + replyTextLabel?.attributedText = ChatUtils.setAttributeString(name: replyMessage?.contactChatMessage?.contactName) messageTypeIcon?.image = UIImage(named: (message?.isMessageSentByMe ?? false) ? "senderContact" : "receiverContact") messageTypeIconView?.isHidden = false replyWithMediaCons?.isActive = true @@ -326,7 +330,7 @@ class AudioReceiver: BaseTableViewCell, AVAudioPlayerDelegate { replyWithOutMediaCons?.isActive = false } } - if(message?.replyParentChatMessage?.isMessageSentByMe ?? false) { + if(replyMessage?.isMessageSentByMe ?? false) { replyUserLabel?.text = you.localized } else { replyUserLabel?.text = getUserName(jid: replyMessage?.senderUserJid ?? "" ,name: replyMessage?.senderUserName ?? "", diff --git a/MirrorflyUIkit/Controllers/Audio/TableCells/AudioSender.swift b/MirrorflyUIkit/Controllers/Audio/TableCells/AudioSender.swift index 19cd321..6521a38 100755 --- a/MirrorflyUIkit/Controllers/Audio/TableCells/AudioSender.swift +++ b/MirrorflyUIkit/Controllers/Audio/TableCells/AudioSender.swift @@ -210,14 +210,18 @@ class AudioSender: BaseTableViewCell, AVAudioPlayerDelegate { replyView?.isHidden = false let getReplymessage = message?.replyParentChatMessage?.messageTextContent let replyMessage = FlyMessenger.getMessageOfId(messageId: message?.replyParentChatMessage?.messageId ?? "") - if message?.replyParentChatMessage?.isMessageDeleted == true || message?.replyParentChatMessage?.isMessageRecalled == true || replyMessage == nil { + if replyMessage?.isMessageDeleted == true || replyMessage?.isMessageRecalled == true || replyMessage == nil { userTextLabel?.text = "Original message not available" messageTypeIconView?.isHidden = true mediaLocationMap?.isHidden = true mediaImageView?.isHidden = true } else { mediaLocationMap?.isHidden = true - userTextLabel?.attributedText = ChatUtils.getAttributedMessage(message: getReplymessage ?? "", searchText: searchText, isMessageSearch: isMessageSearch, isSystemBlue: false) + if (message?.messageChatType == .groupChat || isStarredMessagePage ?? false) && !(replyMessage?.mentionedUsersIds.isEmpty ?? true) { + userTextLabel?.attributedText = ChatUtils.getMentionTextContent(message: replyMessage?.messageTextContent ?? "", isMessageSentByMe: replyMessage!.isMessageSentByMe, mentionedUsers: replyMessage?.mentionedUsersIds ?? [], searchedText: searchText) + } else { + userTextLabel?.attributedText = ChatUtils.getAttributedMessage(message: getReplymessage ?? "", searchText: searchText, isMessageSearch: isMessageSearch, isSystemBlue: false) + } if replyMessage?.mediaChatMessage?.messageType == .document { mediaImageView?.contentMode = .scaleAspectFit } else { @@ -227,20 +231,20 @@ class AudioSender: BaseTableViewCell, AVAudioPlayerDelegate { switch replyMessage?.mediaChatMessage?.messageType { case .image: messageTypeIcon?.image = UIImage(named: (message?.isMessageSentByMe ?? false) ? "senderCamera" : "receiverCamera") - if let thumImage = message?.replyParentChatMessage?.mediaChatMessage?.mediaThumbImage { + if let thumImage = replyMessage?.mediaChatMessage?.mediaThumbImage { let converter = ImageConverter() let image = converter.base64ToImage(thumImage) mediaImageView?.image = image mediaImageView?.isHidden = false messageTypeIconView?.isHidden = false - userTextLabel?.text = (!(message?.replyParentChatMessage?.mediaChatMessage?.mediaCaptionText.isEmpty ?? false)) ? message?.replyParentChatMessage?.mediaChatMessage?.mediaCaptionText : "Photo" + userTextLabel?.text = (!(replyMessage?.mediaChatMessage?.mediaCaptionText.isEmpty ?? false)) ? replyMessage?.mediaChatMessage?.mediaCaptionText : "Photo" } replyWithMediaCons?.isActive = true replyWithoutMediaCons?.isActive = false case .audio: - let duration = Int(message?.replyParentChatMessage?.mediaChatMessage?.mediaDuration ?? 0) + let duration = Int(replyMessage?.mediaChatMessage?.mediaDuration ?? 0) ChatUtils.setIconForAudio(imageView: messageTypeIcon, chatMessage: nil, replyParentMessage: message?.replyParentChatMessage) - userTextLabel?.text = (!(message?.replyParentChatMessage?.mediaChatMessage?.mediaCaptionText.isEmpty ?? false)) ? message?.replyParentChatMessage?.mediaChatMessage?.mediaCaptionText : message?.replyParentChatMessage?.mediaChatMessage?.messageType.rawValue.capitalized.appending(" (\(duration.msToSeconds.minuteSecondMS))") + userTextLabel?.text = (!(replyMessage?.mediaChatMessage?.mediaCaptionText.isEmpty ?? false)) ? replyMessage?.mediaChatMessage?.mediaCaptionText : replyMessage?.mediaChatMessage?.messageType.rawValue.capitalized.appending(" (\(duration.msToSeconds.minuteSecondMS))") messageTypeIconView?.isHidden = false replyWithMediaCons?.isActive = false replyWithoutMediaCons?.isActive = true @@ -248,12 +252,12 @@ class AudioSender: BaseTableViewCell, AVAudioPlayerDelegate { case .video: messageTypeIcon?.image = UIImage(named: (message?.isMessageSentByMe ?? false) ? "senderVideo" : "video") messageTypeIconView?.isHidden = false - if let thumImage = message?.replyParentChatMessage?.mediaChatMessage?.mediaThumbImage { + if let thumImage = replyMessage?.mediaChatMessage?.mediaThumbImage { let converter = ImageConverter() let image = converter.base64ToImage(thumImage) mediaImageView?.image = image mediaImageView?.isHidden = false - userTextLabel?.text = (!(message?.replyParentChatMessage?.mediaChatMessage?.mediaCaptionText.isEmpty ?? false)) ? message?.replyParentChatMessage?.mediaChatMessage?.mediaCaptionText : message?.replyParentChatMessage?.mediaChatMessage?.messageType.rawValue.capitalized + userTextLabel?.text = (!(replyMessage?.mediaChatMessage?.mediaCaptionText.isEmpty ?? false)) ? replyMessage?.mediaChatMessage?.mediaCaptionText : replyMessage?.mediaChatMessage?.messageType.rawValue.capitalized } replyWithMediaCons?.isActive = true replyWithoutMediaCons?.isActive = false @@ -277,10 +281,10 @@ class AudioSender: BaseTableViewCell, AVAudioPlayerDelegate { userTextLabel?.text = "Location" messageTypeIcon?.image = UIImage(named: (message?.isMessageSentByMe ?? false) ? "map" : "receivedMap") messageTypeIconView?.isHidden = false - guard let latitude = message?.replyParentChatMessage?.locationChatMessage?.latitude else { + guard let latitude = replyMessage?.locationChatMessage?.latitude else { return nil } - guard let longitude = message?.replyParentChatMessage?.locationChatMessage?.longitude else { + guard let longitude = replyMessage?.locationChatMessage?.longitude else { return nil } mediaLocationMap?.isUserInteractionEnabled = false @@ -302,8 +306,8 @@ class AudioSender: BaseTableViewCell, AVAudioPlayerDelegate { // marker.map = mediaLocationMap // } } else if replyMessage?.contactChatMessage != nil { - let replyTextMessage = "Contact: \(message?.replyParentChatMessage?.contactChatMessage?.contactName ?? "")" - userTextLabel?.attributedText = ChatUtils.setAttributeString(name: message?.replyParentChatMessage?.contactChatMessage?.contactName) + let replyTextMessage = "Contact: \(replyMessage?.contactChatMessage?.contactName ?? "")" + userTextLabel?.attributedText = ChatUtils.setAttributeString(name: replyMessage?.contactChatMessage?.contactName) messageTypeIcon?.image = UIImage(named: (message?.isMessageSentByMe ?? false) ? "senderContact" : "receiverContact") messageTypeIconView?.isHidden = false replyWithMediaCons?.isActive = false diff --git a/MirrorflyUIkit/Controllers/Authentication PIN/AuthenticationPINViewController.swift b/MirrorflyUIkit/Controllers/Authentication PIN/AuthenticationPINViewController.swift index fcbd8ee..f528c1c 100644 --- a/MirrorflyUIkit/Controllers/Authentication PIN/AuthenticationPINViewController.swift +++ b/MirrorflyUIkit/Controllers/Authentication PIN/AuthenticationPINViewController.swift @@ -32,7 +32,7 @@ class AuthenticationPINViewController: BaseViewController, UITextFieldDelegate { var secondsRemaining = passwordResetTimer var timer: Timer? var currentBackgroundDate = Date() - + var disableBackCancelButton : Bool = true public var verifyOTPViewModel : VerifyOTPViewModel! public var otpViewModel : OTPViewModel! @@ -62,6 +62,9 @@ class AuthenticationPINViewController: BaseViewController, UITextFieldDelegate { @IBOutlet weak var collectionview: UICollectionView! @IBOutlet weak var pinEnteredcollectionview: UICollectionView! + + @IBOutlet weak var backBtn: UIButton! + var isDisablePin = false @@ -183,10 +186,12 @@ class AuthenticationPINViewController: BaseViewController, UITextFieldDelegate { override func viewWillAppear(_ animated: Bool) { self.navigationController?.setNavigationBarHidden(true, animated: false) + self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false showAlerts() } func setupUI() { + backBtn.isHidden = disableBackCancelButton resendOTP.titleLabel?.font = UIFont.font14px_appRegular() txtFirst.font = UIFont.font16px_appSemibold() txtSecond.font = UIFont.font16px_appSemibold() @@ -210,7 +215,7 @@ class AuthenticationPINViewController: BaseViewController, UITextFieldDelegate { self.forgotButtonoutlet.isHidden = false } else if fingerPrintLogout == true || logout == true || disableBothPIN == true || fingerPrintEnable == true { - self.forgotButtonoutlet.isHidden = true + self.forgotButtonoutlet.isHidden = false } txtFirst.delegate = self txtSecond.delegate = self @@ -273,6 +278,11 @@ class AuthenticationPINViewController: BaseViewController, UITextFieldDelegate { txtSixth.text = "" } + @IBAction func backbtn(_ sender: UIButton) { + self.navigationController?.popViewController(animated: true) + } + + @objc override func didMoveToBackground() { self.currentBackgroundDate = Date() @@ -577,6 +587,11 @@ class AuthenticationPINViewController: BaseViewController, UITextFieldDelegate { otpViewModel.requestOtp(phoneNumber: phoneNumber) { (verificationID, error) in if let error = error { + let authError = error as NSError? + + // Log the full error details for debugging + NSLog("🔥 Auth Error: code = \(authError?.code ?? -1), domain = \(authError?.domain ?? "Unknown"), description = \(authError?.localizedDescription ?? "No description")") + self.stopLoading() DispatchQueue.main.async { let authError = error as NSError? diff --git a/MirrorflyUIkit/Controllers/Authentication PIN/AuthenticationPINViewController.xib b/MirrorflyUIkit/Controllers/Authentication PIN/AuthenticationPINViewController.xib index 6358f15..c818395 100644 --- a/MirrorflyUIkit/Controllers/Authentication PIN/AuthenticationPINViewController.xib +++ b/MirrorflyUIkit/Controllers/Authentication PIN/AuthenticationPINViewController.xib @@ -1,9 +1,9 @@ - + - + @@ -26,6 +26,7 @@ + @@ -53,10 +54,10 @@ - + - + @@ -121,21 +122,41 @@ - + + + + + + + @@ -143,16 +164,15 @@ - - + - + @@ -164,6 +184,7 @@ + diff --git a/MirrorflyUIkit/Controllers/Chat Settings/ChatSettingsViewController.swift b/MirrorflyUIkit/Controllers/Chat Settings/ChatSettingsViewController.swift index fbcd526..62218a9 100644 --- a/MirrorflyUIkit/Controllers/Chat Settings/ChatSettingsViewController.swift +++ b/MirrorflyUIkit/Controllers/Chat Settings/ChatSettingsViewController.swift @@ -52,6 +52,7 @@ class ChatSettingsViewController: UIViewController { availableFeatures = ChatManager.getAvailableFeatures() getChatSettingsArray() self.chatSettingsTable.reloadData() + self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false self.navigationController?.isNavigationBarHidden = true } diff --git a/MirrorflyUIkit/Controllers/ContactSyncController.swift b/MirrorflyUIkit/Controllers/ContactSyncController.swift index b525687..26a24b4 100644 --- a/MirrorflyUIkit/Controllers/ContactSyncController.swift +++ b/MirrorflyUIkit/Controllers/ContactSyncController.swift @@ -26,7 +26,7 @@ class ContactSyncController: UIViewController { userName.text = ContactManager.getMyProfile().name let authorizationStatus = CNContactStore.authorizationStatus(for: .contacts) - if authorizationStatus == .authorized || authorizationStatus == .denied{ + if authorizationStatus.isAuthorizedOrLimited || authorizationStatus == .denied{ executeOnMainThread { [weak self] in self?.startSyncingContacts() } @@ -77,7 +77,7 @@ class ContactSyncController: UIViewController { func syncProgressUiUpdate(){ let authorizationStatus = CNContactStore.authorizationStatus(for: .contacts) - if authorizationStatus == .authorized { + if authorizationStatus.isAuthorizedOrLimited { progressInfoLabel.text = "Contact sync is in progress" syncImage.isHidden = false syncImage.startRotating(duration: 1) @@ -92,7 +92,7 @@ class ContactSyncController: UIViewController { func startSyncingContacts(initialSync : Bool = true) { let authorizationStatus = CNContactStore.authorizationStatus(for: .contacts) - if authorizationStatus == .authorized{ + if authorizationStatus.isAuthorizedOrLimited{ ContactSyncManager.updateContactPermission(isDeined: false) ContactSyncManager.needContactSync(isSync: true) } else if authorizationStatus == .denied{ @@ -107,7 +107,7 @@ class ContactSyncController: UIViewController { executeOnMainThread { if isSuccess{ Utility.saveInPreference(key: isLoginContactSyncDone, value: true) - if authorizationStatus == .authorized{ + if authorizationStatus.isAuthorizedOrLimited{ AppAlert.shared.showToast(message: "Contacts synced successfully ") self?.progressInfoLabel.text = "Contacts Synced" self?.syncImage.stopRotating() @@ -117,7 +117,8 @@ class ContactSyncController: UIViewController { Utility.saveInPreference(key: isLoginContactSyncDone, value: false) self?.progressInfoLabel.text = "Contact sync failed" self?.syncImage.stopRotating() - AppAlert.shared.showToast(message: "Contact sync failure \(flyError?.localizedDescription)") + AppAlert.shared.showToast(message: "Contact sync failed") + self?.moveToDashboard() } } } diff --git a/MirrorflyUIkit/Controllers/ContactUs/ContactUsController.swift b/MirrorflyUIkit/Controllers/ContactUs/ContactUsController.swift index 4b93c7a..20ecf84 100644 --- a/MirrorflyUIkit/Controllers/ContactUs/ContactUsController.swift +++ b/MirrorflyUIkit/Controllers/ContactUs/ContactUsController.swift @@ -23,6 +23,7 @@ class ContactUsController: UIViewController, UITextFieldDelegate, UITextViewDele override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) self.navigationController?.isNavigationBarHidden = true + self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false descriptionTextView.delegate = self titleTextField.delegate = self sendBtn.titleLabel?.font = AppFont.Bold.size(14) diff --git a/MirrorflyUIkit/Controllers/ContactViewController.swift b/MirrorflyUIkit/Controllers/ContactViewController.swift index ac5522f..b968701 100755 --- a/MirrorflyUIkit/Controllers/ContactViewController.swift +++ b/MirrorflyUIkit/Controllers/ContactViewController.swift @@ -169,6 +169,7 @@ class ContactViewController: BaseViewController { if callLink.isNotEmpty && CallManager.getCallMode() == .MEET{ topBarViewHeight.constant = 0 bottomBtnHeight.constant = 0 + bottomBtn.isHidden = true }else{ topBarViewHeight.constant = 48 } @@ -597,11 +598,11 @@ class ContactViewController: BaseViewController { let contactPermissionStatus = CNContactStore.authorizationStatus(for: CNEntityType.contacts) - if ContactSyncManager.isPermissionSkipped() && contactPermissionStatus == .authorized{ + if ContactSyncManager.isPermissionSkipped() && contactPermissionStatus.isAuthorizedOrLimited{ syncSkippedDialog() }else if ENABLE_CONTACT_SYNC { - if contactPermissionStatus == .authorized{ + if contactPermissionStatus.isAuthorizedOrLimited{ if !showDialogONly{ refreshContacts() refreshControl.endRefreshing() diff --git a/MirrorflyUIkit/Controllers/CountryPickerViewController.swift b/MirrorflyUIkit/Controllers/CountryPickerViewController.swift index add8a59..c79dafb 100755 --- a/MirrorflyUIkit/Controllers/CountryPickerViewController.swift +++ b/MirrorflyUIkit/Controllers/CountryPickerViewController.swift @@ -32,6 +32,7 @@ class CountryPickerViewController: UIViewController { override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(true) navigationController?.setNavigationBarHidden(false, animated: true) + self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false } override func viewWillDisappear(_ animated: Bool) { diff --git a/MirrorflyUIkit/Controllers/Delegates/AppDelegate.swift b/MirrorflyUIkit/Controllers/Delegates/AppDelegate.swift index 06de442..ff07685 100755 --- a/MirrorflyUIkit/Controllers/Delegates/AppDelegate.swift +++ b/MirrorflyUIkit/Controllers/Delegates/AppDelegate.swift @@ -135,7 +135,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate, MessagingDelegate { } // Added this line so that we can start receing contact updates let contactPermissionStatus = CNContactStore.authorizationStatus(for: CNEntityType.contacts) - if contactPermissionStatus == .authorized || contactPermissionStatus == .denied{ + if contactPermissionStatus.isAuthorizedOrLimited || contactPermissionStatus == .denied{ ContactSyncManager.updateContactPermission(isSkipped: false) } NotificationCenter.default.removeObserver(self, name: NSNotification.Name.CNContactStoreDidChange, object: nil) @@ -413,16 +413,43 @@ extension AppDelegate : PKPushRegistryDelegate { extension AppDelegate { - func startObservingContactChanges(){ - contactSyncSubscription = contactSyncSubject.throttle(.seconds(3), latest: false ,scheduler: MainScheduler.instance).subscribe(onNext: { bool in - if bool{ - if !ContactSyncManager.isPermissionSkipped() { - ContactSyncManager.shared.syncContacts(){ isSuccess,_,_ in - print("#contact Sync status => \(isSuccess)") + func startObservingContactChanges() { + // 🔹 1. Run a sync immediately if permission is already granted + let status = CNContactStore.authorizationStatus(for: CNEntityType.contacts) + if status.isAuthorizedOrLimited, !ContactSyncManager.isPermissionSkipped() { + ContactSyncManager.shared.syncContacts { isSuccess, _, _ in + print("#contact Sync (initial) => \(isSuccess)") + } + } + + // 🔹 2. Subscribe to your Rx subject for throttled sync + contactSyncSubscription = contactSyncSubject + .throttle(.seconds(3), latest: false, scheduler: MainScheduler.instance) + .subscribe(onNext: { bool in + if bool, !ContactSyncManager.isPermissionSkipped() { + let status = CNContactStore.authorizationStatus(for: CNEntityType.contacts) + if status.isAuthorizedOrLimited { + ContactSyncManager.shared.syncContacts { isSuccess, _, _ in + print("#contact Sync (subject) => \(isSuccess)") + } } } + }) + + // 🔹 3. Re-check whenever app comes back to foreground + NotificationCenter.default.addObserver( + forName: UIApplication.didBecomeActiveNotification, + object: nil, + queue: .main + ) { [weak self] _ in + guard let self = self else { return } + let status = CNContactStore.authorizationStatus(for: CNEntityType.contacts) + if status.isAuthorizedOrLimited, !ContactSyncManager.isPermissionSkipped() { + ContactSyncManager.shared.syncContacts { isSuccess, _, _ in + print("#contact Sync (foreground) => \(isSuccess)") + } } - }) + } } @@ -567,10 +594,10 @@ extension AppDelegate : AdminBlockCurrentUserDelegate { extension AppDelegate { func logoutLocally(){ - Utility.saveInPreference(key: isProfileSaved, value: false) - Utility.saveInPreference(key: isLoggedIn, value: false) - ChatManager.disconnect() - ChatManager.shared.resetFlyDefaults() + Utility.saveInPreference(key: isProfileSaved, value: false) + Utility.saveInPreference(key: isLoggedIn, value: false) + ChatManager.disconnect() + ChatManager.shared.resetFlyDefaults() } func navigateToBlockedScreen() { diff --git a/MirrorflyUIkit/Controllers/DeleteMessageForEveryOneAlertController/DeleteMessageForEveryOneAlertController.swift b/MirrorflyUIkit/Controllers/DeleteMessageForEveryOneAlertController/DeleteMessageForEveryOneAlertController.swift index 8035daf..88d87dc 100644 --- a/MirrorflyUIkit/Controllers/DeleteMessageForEveryOneAlertController/DeleteMessageForEveryOneAlertController.swift +++ b/MirrorflyUIkit/Controllers/DeleteMessageForEveryOneAlertController/DeleteMessageForEveryOneAlertController.swift @@ -36,6 +36,7 @@ class DeleteMessageForEveryOneAlertController : UIViewController { override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) + self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false if isClearAllPopup == true { deleteForEveryOneStack?.isHidden = true firstTitleLabel?.text = clearAll diff --git a/MirrorflyUIkit/Controllers/DeleteMessagesAlert/DeleteMessageForMe/DeleteMessagesForMeAlertController.swift b/MirrorflyUIkit/Controllers/DeleteMessagesAlert/DeleteMessageForMe/DeleteMessagesForMeAlertController.swift index e8c6519..5bdb66a 100644 --- a/MirrorflyUIkit/Controllers/DeleteMessagesAlert/DeleteMessageForMe/DeleteMessagesForMeAlertController.swift +++ b/MirrorflyUIkit/Controllers/DeleteMessagesAlert/DeleteMessageForMe/DeleteMessagesForMeAlertController.swift @@ -47,6 +47,7 @@ class DeleteMessagesForMeAlertController : UIViewController { } else { revokeMediaStackView?.isHidden = true } + self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false titleLabel?.text = deleteMessages?.count == 1 ? "Are you sure you want to delete selected Message?" : "Are you sure you want to delete selected messages?" checkBoxImage?.image = Utility.getBoolFromPreference(key: revokeMediaAccess) ? UIImage(named: ImageConstant.ic_checked) : UIImage(named: ImageConstant.ic_check_box) } diff --git a/MirrorflyUIkit/Controllers/ForceUpdateAlert/ForceUpdateAlert.swift b/MirrorflyUIkit/Controllers/ForceUpdateAlert/ForceUpdateAlert.swift index f52580b..87d93eb 100644 --- a/MirrorflyUIkit/Controllers/ForceUpdateAlert/ForceUpdateAlert.swift +++ b/MirrorflyUIkit/Controllers/ForceUpdateAlert/ForceUpdateAlert.swift @@ -17,6 +17,7 @@ class ForceUpdateAlertViewController : UIViewController, OnUpdateNeededListener override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) + self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false forceUpdateView?.roundCorners(corners: [.bottomLeft,.topLeft, .bottomRight,.topRight], radius: 10) setForceUpdateTitleDescription() } diff --git a/MirrorflyUIkit/Controllers/ForwardMessages/ForwardViewController.swift b/MirrorflyUIkit/Controllers/ForwardMessages/ForwardViewController.swift index f7a3886..ac87dfd 100755 --- a/MirrorflyUIkit/Controllers/ForwardMessages/ForwardViewController.swift +++ b/MirrorflyUIkit/Controllers/ForwardMessages/ForwardViewController.swift @@ -150,6 +150,7 @@ class ForwardViewController: UIViewController { navigationController?.isNavigationBarHidden = true sendButton?.isEnabled = false sendButton?.alpha = 0.4 + self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false NotificationCenter.default.addObserver(self, selector: #selector(networkChange(_:)),name:Notification.Name(NetStatus.networkNotificationObserver),object: nil) } diff --git a/MirrorflyUIkit/Controllers/Image/CollectionCells/ImageCell.swift b/MirrorflyUIkit/Controllers/Image/CollectionCells/ImageCell.swift index 6435b87..ff0ad0e 100755 --- a/MirrorflyUIkit/Controllers/Image/CollectionCells/ImageCell.swift +++ b/MirrorflyUIkit/Controllers/Image/CollectionCells/ImageCell.swift @@ -63,6 +63,11 @@ class ImageCell: UICollectionViewCell, UIScrollViewDelegate { } func setUIImage(message: ChatMessage?) { + if message?.messageType == .video || message?.messageType == .audio { + zoomScroll?.maximumZoomScale = 1.0 + } else if message?.messageType == .image { + zoomScroll?.maximumZoomScale = 5.0 + } if message?.messageType == .audio { cellImage.image = nil cellImage.backgroundColor = Color.color_97A5C7 diff --git a/MirrorflyUIkit/Controllers/MainTabBarController.swift b/MirrorflyUIkit/Controllers/MainTabBarController.swift index 6489162..847dbbc 100755 --- a/MirrorflyUIkit/Controllers/MainTabBarController.swift +++ b/MirrorflyUIkit/Controllers/MainTabBarController.swift @@ -149,6 +149,7 @@ class MainTabBarController: UITabBarController{ saveMyJidAsContacts() ChatManager.shared.connectionDelegate = self updateUnReadMissedCallBadgeCount() + self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false } override func viewDidLayoutSubviews() { diff --git a/MirrorflyUIkit/Controllers/Profile/View/ProfileViewController.swift b/MirrorflyUIkit/Controllers/Profile/View/ProfileViewController.swift index 1e25a62..12d895d 100755 --- a/MirrorflyUIkit/Controllers/Profile/View/ProfileViewController.swift +++ b/MirrorflyUIkit/Controllers/Profile/View/ProfileViewController.swift @@ -149,6 +149,7 @@ class ProfileViewController: UIViewController,ProfileViewControllerProtocol { super.viewWillAppear(animated) setupUI() print("ProfileViewController ABCXYZ viewWillAppear") + self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false navigationController?.setNavigationBarHidden(true, animated: animated) handleBackgroundAndForground() } diff --git a/MirrorflyUIkit/Controllers/RecentChat/RecentChatViewController.swift b/MirrorflyUIkit/Controllers/RecentChat/RecentChatViewController.swift index 83a4de3..c7acd4a 100755 --- a/MirrorflyUIkit/Controllers/RecentChat/RecentChatViewController.swift +++ b/MirrorflyUIkit/Controllers/RecentChat/RecentChatViewController.swift @@ -335,7 +335,7 @@ class RecentChatViewController: UIViewController, UIGestureRecognizerDelegate { if !CommonDefaults.showAppLock || ChatManager.isPrivateChat(jid: pushChatId ?? "") { openChat(jid: pushChatId ?? "") } - self.navigationController?.interactivePopGestureRecognizer?.isEnabled = true + self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false ChatViewParentController.receiveCallModeDelegate = nil CallUIViewController.pipModeDelegate = nil } diff --git a/MirrorflyUIkit/Controllers/Settings/AppLock/AppLockViewController.swift b/MirrorflyUIkit/Controllers/Settings/AppLock/AppLockViewController.swift index d29879e..fb55e0b 100644 --- a/MirrorflyUIkit/Controllers/Settings/AppLock/AppLockViewController.swift +++ b/MirrorflyUIkit/Controllers/Settings/AppLock/AppLockViewController.swift @@ -36,6 +36,7 @@ class AppLockViewController: UIViewController { } override func viewWillAppear(_ animated: Bool) { + self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false if CommonDefaults.appLockPassword == "" { CommonDefaults.appLockenable = false CommonDefaults.appFingerprintenable = false @@ -149,6 +150,7 @@ extension AppLockViewController: UITableViewDelegate,UITableViewDataSource { else { let vc = AuthenticationPINViewController(nibName:Identifiers.authenticationPINViewController, bundle: nil) self.navigationController?.pushViewController(vc, animated: true) + vc.disableBackCancelButton = false vc.disableBothPIN = true } diff --git a/MirrorflyUIkit/Controllers/Settings/Notifications/NotificationAlertViewController.swift b/MirrorflyUIkit/Controllers/Settings/Notifications/NotificationAlertViewController.swift index 3a48518..2549430 100644 --- a/MirrorflyUIkit/Controllers/Settings/Notifications/NotificationAlertViewController.swift +++ b/MirrorflyUIkit/Controllers/Settings/Notifications/NotificationAlertViewController.swift @@ -40,6 +40,7 @@ class NotificationAlertViewController: UIViewController { } override func viewWillAppear(_ animated: Bool) { + self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false super.viewWillAppear(animated) } diff --git a/MirrorflyUIkit/Controllers/Settings/Notifications/NotificationsViewController.swift b/MirrorflyUIkit/Controllers/Settings/Notifications/NotificationsViewController.swift index 1f34863..057cb99 100644 --- a/MirrorflyUIkit/Controllers/Settings/Notifications/NotificationsViewController.swift +++ b/MirrorflyUIkit/Controllers/Settings/Notifications/NotificationsViewController.swift @@ -35,6 +35,7 @@ class NotificationsViewController: UIViewController{ } override func viewWillAppear(_ animated: Bool) { + self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false notificationTableView.reloadData() } diff --git a/MirrorflyUIkit/Controllers/Settings/SettingsViewController.swift b/MirrorflyUIkit/Controllers/Settings/SettingsViewController.swift index 818ae7a..75c0b28 100644 --- a/MirrorflyUIkit/Controllers/Settings/SettingsViewController.swift +++ b/MirrorflyUIkit/Controllers/Settings/SettingsViewController.swift @@ -37,6 +37,7 @@ class SettingsViewController : BaseViewController { override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) + self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false ChatManager.shared.availableFeaturesDelegate = self availableFeatures = ChatManager.getAvailableFeatures() getSettingsArray() @@ -65,8 +66,8 @@ class SettingsViewController : BaseViewController { if CommonDefaults.appLockenable == true{ let secondView = AuthenticationPINViewController(nibName: "AuthenticationPINViewController", bundle: nil) secondView.logout = true + secondView.disableBackCancelButton = false self?.navigationController?.pushViewController(secondView, animated: true) - } else{ self?.requestLogout() diff --git a/MirrorflyUIkit/Controllers/UserProfile/UserProfileViewController.swift b/MirrorflyUIkit/Controllers/UserProfile/UserProfileViewController.swift index ed166a1..ef19060 100644 --- a/MirrorflyUIkit/Controllers/UserProfile/UserProfileViewController.swift +++ b/MirrorflyUIkit/Controllers/UserProfile/UserProfileViewController.swift @@ -111,6 +111,7 @@ class UserProfileViewController : UIViewController { override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) getProfile() + self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false navigationController?.setNavigationBarHidden(true, animated: animated) } override func viewDidAppear(_ animated: Bool) { diff --git a/MirrorflyUIkit/contactInfo/ContactInfoViewController.swift b/MirrorflyUIkit/contactInfo/ContactInfoViewController.swift index e7d927d..f0ccc64 100644 --- a/MirrorflyUIkit/contactInfo/ContactInfoViewController.swift +++ b/MirrorflyUIkit/contactInfo/ContactInfoViewController.swift @@ -661,7 +661,8 @@ extension ContactInfoViewController : AvailableFeaturesDelegate { } - refreshData() +// refreshData() + usersProfilesFetched() } } diff --git a/MirrorflyUIkit/contactInfo/privateChat/Authentication/PrivateChatAuthenticationPINViewController.swift b/MirrorflyUIkit/contactInfo/privateChat/Authentication/PrivateChatAuthenticationPINViewController.swift index 343e836..baa2f92 100644 --- a/MirrorflyUIkit/contactInfo/privateChat/Authentication/PrivateChatAuthenticationPINViewController.swift +++ b/MirrorflyUIkit/contactInfo/privateChat/Authentication/PrivateChatAuthenticationPINViewController.swift @@ -72,6 +72,9 @@ class PrivateChatAuthenticationPINViewController: BaseViewController, UITextFiel @IBOutlet weak var collectionview: UICollectionView! @IBOutlet weak var pinEnteredcollectionview: UICollectionView! + + @IBOutlet weak var backBtn: UIButton! + var isDisablePin = false @@ -195,6 +198,7 @@ class PrivateChatAuthenticationPINViewController: BaseViewController, UITextFiel override func viewWillAppear(_ animated: Bool) { self.navigationController?.setNavigationBarHidden(true, animated: false) + self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false showAlerts() } @@ -222,7 +226,7 @@ class PrivateChatAuthenticationPINViewController: BaseViewController, UITextFiel self.forgotButtonoutlet.isHidden = false } else if fingerPrintLogout == true || logout == true || disableBothPIN == true || fingerPrintEnable == true { - self.forgotButtonoutlet.isHidden = true + self.forgotButtonoutlet.isHidden = false } txtFirst.delegate = self txtSecond.delegate = self @@ -285,6 +289,11 @@ class PrivateChatAuthenticationPINViewController: BaseViewController, UITextFiel txtSixth.text = "" } + @IBAction func backbutton(_ sender: UIButton) { + self.navigationController?.popViewController(animated: true) + } + + @objc override func didMoveToBackground() { self.currentBackgroundDate = Date() diff --git a/MirrorflyUIkit/contactInfo/privateChat/Authentication/PrivateChatAuthenticationPINViewController.xib b/MirrorflyUIkit/contactInfo/privateChat/Authentication/PrivateChatAuthenticationPINViewController.xib index 9fe4a4e..7dadd8b 100644 --- a/MirrorflyUIkit/contactInfo/privateChat/Authentication/PrivateChatAuthenticationPINViewController.xib +++ b/MirrorflyUIkit/contactInfo/privateChat/Authentication/PrivateChatAuthenticationPINViewController.xib @@ -1,9 +1,9 @@ - + - + @@ -26,6 +26,7 @@ + @@ -53,10 +54,10 @@ - + - + @@ -121,38 +122,57 @@ - + + + + + + + + - - + - @@ -166,6 +186,7 @@ +