diff --git a/Classes/Base.lproj/ChatConversationView.xib b/Classes/Base.lproj/ChatConversationView.xib index 8997ac32b..077eb19c1 100644 --- a/Classes/Base.lproj/ChatConversationView.xib +++ b/Classes/Base.lproj/ChatConversationView.xib @@ -1,6 +1,8 @@ + + @@ -48,19 +50,19 @@ - + - + - + - + - + @@ -212,11 +214,11 @@ - + - + @@ -391,23 +397,23 @@ - + - + - + - + - + - + @@ -555,7 +561,7 @@ - + - + - + @@ -638,7 +644,7 @@ diff --git a/Classes/ChatConversationInfoView.m b/Classes/ChatConversationInfoView.m index 277cbfe72..83cf95cc0 100644 --- a/Classes/ChatConversationInfoView.m +++ b/Classes/ChatConversationInfoView.m @@ -22,6 +22,7 @@ #import "ChatConversationInfoView.h" #import "PhoneMainView.h" #import "UIChatConversationInfoTableViewCell.h" +#import "linphoneapp-Swift.h" #import "linphone/core.h" @@ -312,7 +313,7 @@ static UICompositeViewDescription *compositeDescription = nil; view.isForVoipConference = FALSE; [PhoneMainView.instance popToView:view.compositeViewDescription]; } else { - ChatConversationView *view = VIEW(ChatConversationView); + ChatConversationViewSwift *view = VIEW(ChatConversationViewSwift); [PhoneMainView.instance popToView:view.compositeViewDescription]; } } diff --git a/Classes/EphemeralSettingsView.m b/Classes/EphemeralSettingsView.m index 7f9e78f6f..3956a0e93 100644 --- a/Classes/EphemeralSettingsView.m +++ b/Classes/EphemeralSettingsView.m @@ -20,6 +20,7 @@ #import "EphemeralSettingsView.h" #import "PhoneMainView.h" #import "UIDeviceCell.h" +#import "linphoneapp-Swift.h" @@ -74,14 +75,14 @@ static UICompositeViewDescription *compositeDescription = nil; #pragma mark - Action Functions - (IBAction)onBackClick:(id)sender { - ChatConversationView *view = VIEW(ChatConversationView); + ChatConversationViewSwift *view = VIEW(ChatConversationViewSwift); [PhoneMainView.instance popToView:view.compositeViewDescription]; } - (IBAction)onSaveClick:(id)sender { [self setRoomSettingsBasedOnIndex]; - ChatConversationView *view = VIEW(ChatConversationView); + ChatConversationViewSwift *view = VIEW(ChatConversationViewSwift); [PhoneMainView.instance popToView:view.compositeViewDescription]; } diff --git a/Classes/Swift/Chat/Views/ChatConversationViewSwift.swift b/Classes/Swift/Chat/Views/ChatConversationViewSwift.swift index 8f9c6825b..693f31ef9 100644 --- a/Classes/Swift/Chat/Views/ChatConversationViewSwift.swift +++ b/Classes/Swift/Chat/Views/ChatConversationViewSwift.swift @@ -40,7 +40,6 @@ import DropDown var chatRoom: ChatRoom? = nil var chatRoomDelegate: ChatRoomDelegate? = nil var address: String? = nil - var notifications_on: Bool = true var activeAlertController = CustomAlertController() @@ -67,31 +66,22 @@ import DropDown switch menu.dataSource[index] { case VoipTexts.dropdown_menu_chat_conversation_add_to_contact: cell.myImageView.image = UIImage(named: images[0]) - //cell.addGestureRecognizer(UITapGestureRecognizer(target: parent.self, action: #selector(dropDownGoToDevicesList))) case VoipTexts.dropdown_menu_chat_conversation_go_to_contact: cell.myImageView.image = UIImage(named: images[1]) - cell.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(dropDownGoToDevicesList))) case VoipTexts.conference_schedule_start: cell.myImageView.image = UIImage(named: images[2]) - cell.addGestureRecognizer(UITapGestureRecognizer(target: ChatConversationViewSwift.self, action: #selector(dropDownGoToDevicesList))) case VoipTexts.dropdown_menu_chat_conversation_conversation_device: cell.myImageView.image = UIImage(named: images[3]) - cell.addGestureRecognizer(UITapGestureRecognizer(target: ChatConversationViewSwift.self, action: #selector(dropDownGoToDevicesList))) case VoipTexts.dropdown_menu_chat_conversation_ephemeral_messages: cell.myImageView.image = UIImage(named: images[4]) - cell.addGestureRecognizer(UITapGestureRecognizer(target: ChatConversationViewSwift.self, action: #selector(dropDownGoToDevicesList))) case VoipTexts.dropdown_menu_chat_conversation_mute_notifications: cell.myImageView.image = UIImage(named: images[5]) - cell.addGestureRecognizer(UITapGestureRecognizer(target: ChatConversationViewSwift.self, action: #selector(dropDownGoToDevicesList))) case VoipTexts.dropdown_menu_chat_conversation_unmute_notifications: cell.myImageView.image = UIImage(named: images[6]) - cell.addGestureRecognizer(UITapGestureRecognizer(target: ChatConversationViewSwift.self, action: #selector(dropDownGoToDevicesList))) case VoipTexts.dropdown_menu_chat_conversation_delete_messages: cell.myImageView.image = UIImage(named: images[7]) - cell.addGestureRecognizer(UITapGestureRecognizer(target: ChatConversationViewSwift.self, action: #selector(dropDownGoToDevicesList))) default: cell.myImageView.image = UIImage(named: images[8]) - cell.addGestureRecognizer(UITapGestureRecognizer(target: ChatConversationViewSwift.self, action: #selector(dropDownGoToDevicesList))) } } } @@ -112,6 +102,9 @@ import DropDown action3: { self.alertActionGoToDevicesList() }, + action4: { + (LinphoneManager.instance().lpConfigInt(forKey: "debugenable_preference") == 1) ? self.showAddressAndIdentityPopup() : self.tapChooseMenuItem(self.action2Button) + }, title: address ?? "Error" ) } @@ -129,17 +122,148 @@ import DropDown menu.anchorView = sender menu.bottomOffset = CGPoint(x: -UIScreen.main.bounds.width * 0.6, y: sender.frame.size.height) menu.show() + menu.selectionAction = { [weak self] (index: Int, item: String) in + guard let _ = self else { return } + print(item) + switch item { + case VoipTexts.dropdown_menu_chat_conversation_add_to_contact: + self!.addOrGoToContact() + case VoipTexts.dropdown_menu_chat_conversation_go_to_contact: + self!.addOrGoToContact() + case VoipTexts.conference_schedule_start: + self!.conferenceSchedule() + case VoipTexts.dropdown_menu_chat_conversation_group_infos: + self!.displayGroupInfo() + case VoipTexts.dropdown_menu_chat_conversation_conversation_device: + self!.goToDevicesList() + case VoipTexts.dropdown_menu_chat_conversation_ephemeral_messages: + self!.goToEphemeralSettings() + case VoipTexts.dropdown_menu_chat_conversation_mute_notifications: + self!.mute_unmute_notifications() + self?.menu.dataSource[index] = VoipTexts.dropdown_menu_chat_conversation_unmute_notifications + case VoipTexts.dropdown_menu_chat_conversation_unmute_notifications: + self!.mute_unmute_notifications() + self?.menu.dataSource[index] = VoipTexts.dropdown_menu_chat_conversation_mute_notifications + case VoipTexts.dropdown_menu_chat_conversation_delete_messages: + self!.onEditionChangeClick() + default: + self!.showAddressAndIdentityPopup() + } + self!.menu.clearSelection() + } } + func goToDevicesList() { + let view: DevicesListView = self.VIEW(DevicesListView.compositeViewDescription()) + view.room = chatRoom?.getCobject + PhoneMainView.instance().changeCurrentView(view.compositeViewDescription()) + } + + func addOrGoToContact() { + let firstParticipant = chatRoom?.participants.first + let addr = (firstParticipant != nil) ? linphone_participant_get_address(firstParticipant?.getCobject) : linphone_chat_room_get_peer_address(chatRoom?.getCobject) + + let contact = FastAddressBook.getContactWith(addr) + + if let contact { + let view: ContactDetailsView = self.VIEW(ContactDetailsView.compositeViewDescription()) + ContactSelection.setSelectionMode(ContactSelectionModeNone) + MagicSearchSingleton.instance().currentFilter = "" + view.contact = contact + PhoneMainView.instance().changeCurrentView(view.compositeViewDescription()) + } else { + + let lAddress = linphone_address_as_string_uri_only(addr) + if let lAddress { + var normSip = String(utf8String: lAddress) + normSip = normSip?.hasPrefix("sip:") ?? false ? (normSip as NSString?)?.substring(from: 4) : normSip + normSip = normSip?.hasPrefix("sips:") ?? false ? (normSip as NSString?)?.substring(from: 5) : normSip + ContactSelection.setAddAddress(normSip) + ContactSelection.setSelectionMode(ContactSelectionModeEdit) + ContactSelection.enableSipFilter(false) + PhoneMainView.instance().changeCurrentView(ContactsListView.compositeViewDescription()) + } + } + } + + func displayGroupInfo() { + let contactsArray: NSMutableArray = [] + let admins: NSMutableArray = [] + let participants = chatRoom?.participants + participants?.forEach{ participant in + let curi = linphone_address_as_string_uri_only(linphone_participant_get_address(participant.getCobject)) + let uri = String(utf8String: curi!) + contactsArray.add(uri!) + if (linphone_participant_is_admin(participant.getCobject) != 0) { + admins.add(uri!) + } + } + + let view: ChatConversationInfoView = self.VIEW(ChatConversationInfoView.compositeViewDescription()) + view.create = false + view.contacts = contactsArray + view.oldContacts = contactsArray + view.admins = admins + view.oldAdmins = admins + view.oldSubject = String(utf8String: linphone_chat_room_get_subject(chatRoom?.getCobject)) ?? LINPHONE_DUMMY_SUBJECT + view.room = chatRoom?.getCobject + + let localAddress = linphone_address_as_string(linphone_chat_room_get_local_address(chatRoom?.getCobject)) + let peerAddress = linphone_address_as_string(linphone_chat_room_get_peer_address(chatRoom?.getCobject)) + view.peerAddress = UnsafePointer(peerAddress) + view.localAddress = UnsafePointer(localAddress) + PhoneMainView.instance().changeCurrentView(view.compositeViewDescription()) + } + + func goToEphemeralSettings(){ + let view: EphemeralSettingsView = self.VIEW(EphemeralSettingsView.compositeViewDescription()) + view.room = chatRoom?.getCobject + PhoneMainView.instance().changeCurrentView(view.compositeViewDescription()) + } + + func conferenceSchedule(){ + ConferenceViewModelBridge.scheduleFromGroupChat(cChatRoom: (chatRoom?.getCobject)!) + PhoneMainView.instance().pop(toView: ConferenceSchedulingView.compositeViewDescription()) + } + + func mute_unmute_notifications(){ + LinphoneManager.setChatroomPushEnabled(chatRoom?.getCobject, withPushEnabled: !LinphoneManager.getChatroomPushEnabled(chatRoom?.getCobject)) + } + + func onEditionChangeClick() { + + } + + func showAddressAndIdentityPopup() { + + let localAddress = String(utf8String: linphone_address_as_string(linphone_chat_room_get_local_address(chatRoom?.getCobject))) + let peerAddress = String(utf8String: linphone_address_as_string(linphone_chat_room_get_peer_address(chatRoom?.getCobject))) + + var infoMsg: String? = nil + if let peerAddress, let localAddress { + infoMsg = "Chat room id:\n\(peerAddress)\nLocal account:\n\(localAddress)" + } + + let popupView = UIAlertController(title: NSLocalizedString("Chatroom debug infos", comment: ""), message: infoMsg, preferredStyle: .alert) + + let defaultAction = UIAlertAction( + title: NSLocalizedString("Copy to clipboard", comment: ""), + style: .default, + handler: { action in + let pasteboard = UIPasteboard.general + pasteboard.string = infoMsg + }) + popupView.addAction(defaultAction) + present(popupView, animated: true, completion:{ + popupView.view.superview?.isUserInteractionEnabled = true + popupView.view.superview?.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.dismissOnTapOutsideOrCancel))) + }) + + } + func initDataSource(groupeChat: Bool, secureLevel: Bool, cChatRoom: OpaquePointer) { menu.dataSource.removeAll() - let config = Config.newForSharedCore(appGroupId: APP_GROUP_ID, configFilename: "linphonerc", factoryConfigFilename: "") - let debugLevel = config?.getInt(section: "app", key: "debugenable_preference", defaultValue: LogLevel.Debug.rawValue) - debugEnabled = (debugLevel! >= LogLevel.Debug.rawValue && debugLevel! < LogLevel.Error.rawValue) - - print(debugEnabled) - if(groupeChat){ menu.dataSource.append(VoipTexts.conference_schedule_start) menu.dataSource.append(VoipTexts.dropdown_menu_chat_conversation_group_infos) @@ -160,13 +284,12 @@ import DropDown menu.dataSource.append(VoipTexts.dropdown_menu_chat_conversation_conversation_device) menu.dataSource.append(VoipTexts.dropdown_menu_chat_conversation_ephemeral_messages) } - if(notifications_on){ + if(LinphoneManager.getChatroomPushEnabled(chatRoom?.getCobject)){ menu.dataSource.append(VoipTexts.dropdown_menu_chat_conversation_mute_notifications) }else{ menu.dataSource.append(VoipTexts.dropdown_menu_chat_conversation_unmute_notifications) } menu.dataSource.append(VoipTexts.dropdown_menu_chat_conversation_delete_messages) - menu.dataSource.append(VoipTexts.dropdown_menu_chat_conversation_debug_infos) } @objc func initChatRoom(cChatRoom:OpaquePointer) { @@ -281,8 +404,4 @@ import DropDown @objc func dismissOnTapOutsideOrCancel(){ self.dismiss(animated: true, completion: nil) } - - @objc func dropDownGoToDevicesList() { - print("Aaaaaa") - } } diff --git a/Classes/Swift/Util/BackActionsNavigationView.swift b/Classes/Swift/Util/BackActionsNavigationView.swift index 9580b5193..5dab69b4c 100644 --- a/Classes/Swift/Util/BackActionsNavigationView.swift +++ b/Classes/Swift/Util/BackActionsNavigationView.swift @@ -51,6 +51,7 @@ import linphonesw action1 : @escaping () -> Void, action2 : @escaping () -> Void, action3 : @escaping () -> Void, + action4 : @escaping () -> Void, title:String) { self.backAction = backAction self.action1 = action1 @@ -66,6 +67,7 @@ import linphonesw topBar.addSubview(action2Button) action2Button.alignParentRight(withMargin: side_buttons_margin).matchParentHeight().done() action2Button.onClickAction = action2 + action2Button.onLongClick(action: action4) topBar.addSubview(action1Button) topBar.addSubview(action1BisButton) @@ -101,7 +103,6 @@ import linphonesw } - override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) topBar.backgroundColor = VoipTheme.voipToolbarBackgroundColor.get() diff --git a/Classes/linphone-Bridging-Header.h b/Classes/linphone-Bridging-Header.h index 1a5d236e9..333a75d2f 100644 --- a/Classes/linphone-Bridging-Header.h +++ b/Classes/linphone-Bridging-Header.h @@ -16,4 +16,4 @@ #import "UICamSwitch.h" #import "UIChatBubbleTextCell.h" #import "ChatConversationTableView.h" - +#import "EphemeralSettingsView.h"