diff --git a/Classes/Swift/Chat/Views/ChatConversationViewSwift.swift b/Classes/Swift/Chat/Views/ChatConversationViewSwift.swift index bc807f083..cdd68881a 100644 --- a/Classes/Swift/Chat/Views/ChatConversationViewSwift.swift +++ b/Classes/Swift/Chat/Views/ChatConversationViewSwift.swift @@ -1161,7 +1161,7 @@ class ChatConversationViewSwift: BackActionsNavigationView, PHPickerViewControll let viewCell: UIView = UIView(frame: cell.contentView.frame) cell.addSubview(viewCell) - let deleteButton = CallControlButton(width: 22, height: 22, buttonTheme:VoipTheme.nav_black_button("reply_cancel")) + let deleteButton = CallControlButton(width: 22, height: 22, buttonTheme:VoipTheme.nav_color_button("reply_cancel")) deleteButton.onClickAction = { ChatConversationViewModel.sharedModel.mediaCollectionView.remove(at: indexPath.row) diff --git a/Classes/Swift/Chat/Views/MultilineMessageCell.swift b/Classes/Swift/Chat/Views/MultilineMessageCell.swift index 6aba05cbe..7e799ffe5 100644 --- a/Classes/Swift/Chat/Views/MultilineMessageCell.swift +++ b/Classes/Swift/Chat/Views/MultilineMessageCell.swift @@ -530,8 +530,8 @@ class MultilineMessageCell: SwipeCollectionViewCell, UICollectionViewDataSource, } func initPlayerAudio(message: ChatMessage){ - let recordingPlayButton = CallControlButton(width: 40, height: 40, buttonTheme:VoipTheme.nav_black_button("vr_play")) - let recordingStopButton = CallControlButton(width: 40, height: 40, buttonTheme:VoipTheme.nav_black_button("vr_stop")) + let recordingPlayButton = CallControlButton(width: 40, height: 40, buttonTheme:VoipTheme.nav_color_button("vr_play")) + let recordingStopButton = CallControlButton(width: 40, height: 40, buttonTheme:VoipTheme.nav_color_button("vr_stop")) let recordingWaveView = UIProgressView() let recordingDurationTextView = StyledLabel(VoipTheme.chat_conversation_recording_duration) let recordingWaveImage = UIImageView(image: UIImage(named: "vr_wave.png")) diff --git a/Classes/Swift/Conference/Data/Mode.swift b/Classes/Swift/Conference/Data/Mode.swift new file mode 100644 index 000000000..bdfbe71cb --- /dev/null +++ b/Classes/Swift/Conference/Data/Mode.swift @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2010-2021 Belledonne Communications SARL. + * + * This file is part of linphone-android + * (see https://www.linphone.org). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + + +import Foundation + +struct Mode : Comparable { + static func < (lhs: Mode, rhs: Mode) -> Bool { + return lhs.value < rhs.value + } + + let value: Int + let display: String +} diff --git a/Classes/Swift/Conference/ViewModels/ConferenceSchedulingViewModel.swift b/Classes/Swift/Conference/ViewModels/ConferenceSchedulingViewModel.swift index 0dc8c50e2..9a9b9ab37 100644 --- a/Classes/Swift/Conference/ViewModels/ConferenceSchedulingViewModel.swift +++ b/Classes/Swift/Conference/ViewModels/ConferenceSchedulingViewModel.swift @@ -30,6 +30,9 @@ class ConferenceSchedulingViewModel { let subject = MutableLiveData() let description = MutableLiveData() + let mode = MutableLiveData() + static let modeList: [Mode] = computeModeList() + let scheduleForLater = MutableLiveData() let scheduledDate = MutableLiveData() let scheduledTime = MutableLiveData() @@ -55,6 +58,7 @@ class ConferenceSchedulingViewModel { let continueEnabled: MutableLiveData = MutableLiveData() let selectedAddresses = MutableLiveData<[Address]>([]) + let selectedSpeakerAddresses = MutableLiveData<[Address]>([]) private var conferenceScheduler: ConferenceScheduler? = nil @@ -156,6 +160,10 @@ class ConferenceSchedulingViewModel { sendInviteViaEmail.value = false scheduledDate.value = nil scheduledTime.value = nil + + mode.value = ConferenceSchedulingViewModel.modeList.indices.filter { + ConferenceSchedulingViewModel.modeList[$0].value == 0 + }.first scheduledTimeZone.value = ConferenceSchedulingViewModel.timeZones.indices.filter { ConferenceSchedulingViewModel.timeZones[$0].timeZone.identifier == NSTimeZone.default.identifier @@ -243,6 +251,10 @@ class ConferenceSchedulingViewModel { }.sorted() } + private static func computeModeList() -> [Mode] { + return [Mode(value: 0, display: "Meeting"), Mode(value: 1, display: "Broadcast")] + } + private static func computeDurationList() -> [Duration] { return [Duration(value: 30, display: "30min"), Duration(value: 60, display: "1h"), Duration(value: 120, display: "2h")] } @@ -258,5 +270,12 @@ class ConferenceSchedulingViewModel { return nil } + func getMode() -> Int { + if mode.value != nil { + return mode.value! + } else { + return 0 + } + } } diff --git a/Classes/Swift/Conference/Views/ConferenceSchedulingSummaryView.swift b/Classes/Swift/Conference/Views/ConferenceSchedulingSummaryView.swift index 5ba20527a..33d78af51 100644 --- a/Classes/Swift/Conference/Views/ConferenceSchedulingSummaryView.swift +++ b/Classes/Swift/Conference/Views/ConferenceSchedulingSummaryView.swift @@ -27,6 +27,9 @@ import SVProgressHUD let CONFERENCE_CREATION_TIME_OUT_SEC = 15.0 + let viaChatLabel = StyledLabel(VoipTheme.conference_scheduling_font, VoipTexts.conference_schedule_send_invite_chat_summary) + let speakersLabel = StyledLabel(VoipTheme.conference_scheduling_font, " "+VoipTexts.conference_schedule_speakers_list) + let speakersListTableView = UITableView() let participantsListTableView = UITableView() let datePicker = StyledDatePicker(liveValue: ConferenceSchedulingViewModel.shared.scheduledDate,pickerMode: .date, readOnly:true) @@ -52,7 +55,7 @@ import SVProgressHUD },nextAction: { }, nextActionEnableCondition: ConferenceSchedulingViewModel.shared.continueEnabled, - title:VoipTexts.conference_schedule_summary) + title: ConferenceSchedulingViewModel.shared.getMode() == 0 ? VoipTexts.conference_schedule_summary : VoipTexts.conference_schedule_broadcast_summary) super.nextButton.isHidden = true let subjectLabel = StyledLabel(VoipTheme.conference_scheduling_font, VoipTexts.conference_schedule_subject_title) @@ -130,18 +133,34 @@ import SVProgressHUD scheduleForm.addSubview(descriptionInput) // Sending method - let viaChatLabel = StyledLabel(VoipTheme.conference_scheduling_font, VoipTexts.conference_schedule_send_invite_chat_summary) contentView.addSubview(viaChatLabel) viaChatLabel.matchParentSideBorders(insetedByDx: form_margin).alignUnder(view: schedulingStack,withMargin: 2*form_margin).done() viaChatLabel.numberOfLines = 2 ConferenceSchedulingViewModel.shared.sendInviteViaChat.readCurrentAndObserve { (sendChat) in - viaChatLabel.isHidden = sendChat != true || ConferenceSchedulingViewModel.shared.scheduleForLater.value != true + self.viaChatLabel.isHidden = sendChat != true || ConferenceSchedulingViewModel.shared.scheduleForLater.value != true } - + + // Speaker + contentView.addSubview(speakersLabel) + speakersLabel.matchParentSideBorders().height(form_input_height).alignUnder(view: viaChatLabel,withMargin: form_margin).done() + speakersLabel.textAlignment = .left + + + contentView.addSubview(speakersListTableView) + speakersListTableView.isScrollEnabled = false + speakersListTableView.dataSource = self + speakersListTableView.register(VoipSpeakerCell.self, forCellReuseIdentifier: "VoipSpeakerCellSSchedule") + speakersListTableView.allowsSelection = false + if #available(iOS 15.0, *) { + speakersListTableView.allowsFocus = false + } + speakersListTableView.separatorStyle = .singleLine + speakersListTableView.backgroundColor = .clear + // Participants let participantsLabel = StyledLabel(VoipTheme.conference_scheduling_font, " "+VoipTexts.conference_schedule_participants_list) contentView.addSubview(participantsLabel) - participantsLabel.matchParentSideBorders().height(form_input_height).alignUnder(view: viaChatLabel,withMargin: form_margin).done() + participantsLabel.matchParentSideBorders().height(form_input_height).alignUnder(view: speakersListTableView,withMargin: form_margin).done() participantsLabel.textAlignment = .left @@ -156,6 +175,23 @@ import SVProgressHUD participantsListTableView.separatorStyle = .singleLine participantsListTableView.backgroundColor = .clear + ConferenceSchedulingViewModel.shared.selectedSpeakerAddresses.readCurrentAndObserve { (addresses) in + self.speakersListTableView.reloadData() + self.speakersListTableView.removeConstraints().done() + self.speakersListTableView.matchParentSideBorders().alignUnder(view: self.speakersLabel,withMargin: self.form_margin).done() + self.speakersListTableView.height((addresses!.count > 0 ? Double(addresses!.count) : 0.5) * VoipParticipantCell.cell_height).done() + if addresses!.count == 0 { + let emptyLabel = UILabel(frame: CGRect(x: 0, y: 0, width: self.view.bounds.size.width, height: self.view.bounds.size.height)) + emptyLabel.text = VoipTexts.conference_schedule_speakers_list_empty + emptyLabel.textAlignment = NSTextAlignment.center + self.speakersListTableView.backgroundView = emptyLabel + self.speakersListTableView.separatorStyle = UITableViewCell.SeparatorStyle.none + self.speakersListTableView.backgroundView?.isHidden = false + } else { + self.speakersListTableView.backgroundView?.isHidden = true + } + } + ConferenceSchedulingViewModel.shared.selectedAddresses.readCurrentAndObserve { (addresses) in self.participantsListTableView.reloadData() self.participantsListTableView.removeConstraints().done() @@ -209,10 +245,10 @@ import SVProgressHUD } ConferenceSchedulingViewModel.shared.scheduleForLater.readCurrentAndObserve { (later) in self.createButton.title = ConferenceSchedulingViewModel.shared.scheduleForLater.value == true ? ConferenceSchedulingViewModel.shared.existingConfInfo.value != nil ? VoipTexts.conference_schedule_edit.uppercased() : VoipTexts.conference_schedule_start.uppercased() : VoipTexts.conference_group_call_create.uppercased() - viaChatLabel.isHidden = later != true || ConferenceSchedulingViewModel.shared.sendInviteViaChat.value != true - viaChatLabel.removeConstraints().matchParentSideBorders(insetedByDx: self.form_margin).alignUnder(view: schedulingStack,withMargin: (viaChatLabel.isHidden ? 0 : 1)*self.form_margin).done() - if (viaChatLabel.isHidden) { - viaChatLabel.height(0).done() + self.viaChatLabel.isHidden = later != true || ConferenceSchedulingViewModel.shared.sendInviteViaChat.value != true + self.viaChatLabel.removeConstraints().matchParentSideBorders(insetedByDx: self.form_margin).alignUnder(view: schedulingStack,withMargin: (self.viaChatLabel.isHidden ? 0 : 1)*self.form_margin).done() + if (self.viaChatLabel.isHidden) { + self.viaChatLabel.height(0).done() } self.createButton.addSidePadding() @@ -220,6 +256,8 @@ import SVProgressHUD UIDeviceBridge.displayModeSwitched.readCurrentAndObserve { _ in self.view.backgroundColor = VoipTheme.voipBackgroundBWColor.get() + self.speakersLabel.backgroundColor = VoipTheme.voipFormBackgroundColor.get() + self.speakersListTableView.separatorColor = VoipTheme.separatorColor.get() participantsLabel.backgroundColor = VoipTheme.voipFormBackgroundColor.get() self.participantsListTableView.separatorColor = VoipTheme.separatorColor.get() } @@ -227,6 +265,8 @@ import SVProgressHUD } override func viewWillAppear(_ animated: Bool) { + titleLabel.text = ConferenceSchedulingViewModel.shared.getMode() == 0 ? VoipTexts.conference_schedule_summary : VoipTexts.conference_schedule_broadcast_summary + datePicker.liveValue = ConferenceSchedulingViewModel.shared.scheduledDate timeZoneValue.setIndex(index: ConferenceSchedulingViewModel.shared.scheduledTimeZone.value!) durationValue.setIndex(index: ConferenceSchedulingViewModel.shared.scheduledDuration.value!) @@ -243,6 +283,35 @@ import SVProgressHUD scheduleForm.removeConstraints().matchParentSideBorders().wrapContentY().done() createButton.addSidePadding() + + speakersLabel.removeConstraints().matchParentSideBorders().height(form_input_height).alignUnder(view: viaChatLabel,withMargin: form_margin).done() + + speakersListTableView.removeConstraints().done() + speakersListTableView.matchParentSideBorders().alignUnder(view: self.speakersLabel,withMargin: self.form_margin).done() + speakersListTableView.height(Double(ConferenceSchedulingViewModel.shared.selectedSpeakerAddresses.value!.count) * VoipParticipantCell.cell_height).done() + + if ConferenceSchedulingViewModel.shared.selectedSpeakerAddresses.value?.count == 0 { + self.speakersListTableView.reloadData() + self.speakersListTableView.removeConstraints().done() + self.speakersListTableView.matchParentSideBorders().alignUnder(view: self.speakersLabel,withMargin: self.form_margin).done() + self.speakersListTableView.height(0.5 * VoipParticipantCell.cell_height).done() + let emptyLabel = UILabel(frame: CGRect(x: 0, y: 0, width: self.view.bounds.size.width, height: self.view.bounds.size.height)) + emptyLabel.text = VoipTexts.conference_schedule_speakers_list_empty + emptyLabel.textAlignment = NSTextAlignment.center + self.speakersListTableView.backgroundView = emptyLabel + self.speakersListTableView.separatorStyle = UITableViewCell.SeparatorStyle.none + } + + if ConferenceSchedulingViewModel.shared.getMode() == 0 { + speakersLabel.isHidden = true + speakersListTableView.isHidden = true + speakersLabel.height(0).done() + speakersListTableView.height(0).done() + } else { + speakersLabel.isHidden = false + speakersListTableView.isHidden = false + } + super.viewWillAppear(animated) } @@ -251,6 +320,13 @@ import SVProgressHUD func goBackParticipantsListSelection() { let view: ChatConversationCreateView = VIEW(ChatConversationCreateView.compositeViewDescription()) view.unfragmentCompositeDescription() + + ConferenceSchedulingViewModel.shared.selectedSpeakerAddresses.value!.forEach { address in + ConferenceSchedulingViewModel.shared.selectedAddresses.value?.append(address) + } + + ConferenceSchedulingViewModel.shared.selectedSpeakerAddresses.value!.removeAll() + let addresses = ConferenceSchedulingViewModel.shared.selectedAddresses.value!.map { (address) in String(address.asStringUriOnly()) } view.tableController.contactsGroup = (addresses as NSArray).mutableCopy() as? NSMutableArray view.tableController.notFirstTime = true @@ -271,22 +347,69 @@ import SVProgressHUD // TableView datasource delegate func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - guard let participants = ConferenceSchedulingViewModel.shared.selectedAddresses.value else { - return 0 + if(tableView == speakersListTableView){ + guard let speakers = ConferenceSchedulingViewModel.shared.selectedSpeakerAddresses.value else { + return 0 + } + return speakers.count + } else { + guard let participants = ConferenceSchedulingViewModel.shared.selectedAddresses.value else { + return 0 + } + return participants.count } - return participants.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - let cell:VoipParticipantCell = tableView.dequeueReusableCell(withIdentifier: "VoipParticipantCellSSchedule") as! VoipParticipantCell - guard let participant = ConferenceSchedulingViewModel.shared.selectedAddresses.value?[indexPath.row] else { + if(tableView == speakersListTableView){ + let cell:VoipSpeakerCell = tableView.dequeueReusableCell(withIdentifier: "VoipSpeakerCellSSchedule") as! VoipSpeakerCell + guard let speaker = ConferenceSchedulingViewModel.shared.selectedSpeakerAddresses.value?[indexPath.row] else { + return cell + } + cell.selectionStyle = .none + cell.scheduleConfSpeakerAddress = speaker + cell.limeBadge.isHidden = ConferenceSchedulingViewModel.shared.isEncrypted.value != true + + cell.deleteButton.addTarget(self, action: #selector(deleteButtonPressed), for: .touchUpInside) + cell.deleteButton.tag = indexPath.row + + return cell + } else { + let cell:VoipParticipantCell = tableView.dequeueReusableCell(withIdentifier: "VoipParticipantCellSSchedule") as! VoipParticipantCell + guard let participant = ConferenceSchedulingViewModel.shared.selectedAddresses.value?[indexPath.row] else { + return cell + } + cell.selectionStyle = .none + cell.scheduleConfParticipantAddress = participant + cell.limeBadge.isHidden = ConferenceSchedulingViewModel.shared.isEncrypted.value != true + + if ConferenceSchedulingViewModel.shared.getMode() == 0 { + cell.addButton.isHidden = true + } else { + cell.addButton.isHidden = false + cell.addButton.addTarget(self, action: #selector(addButtonPressed), for: .touchUpInside) + cell.addButton.tag = indexPath.row + } return cell } - cell.selectionStyle = .none - cell.scheduleConfParticipantAddress = participant - cell.limeBadge.isHidden = ConferenceSchedulingViewModel.shared.isEncrypted.value != true - return cell } + @objc func addButtonPressed(sender:UIButton!) { + if(ConferenceSchedulingViewModel.shared.selectedAddresses.value?[sender.tag] != nil) { + ConferenceSchedulingViewModel.shared.selectedSpeakerAddresses.value?.append((ConferenceSchedulingViewModel.shared.selectedAddresses.value?[sender.tag])!) + ConferenceSchedulingViewModel.shared.selectedAddresses.value?.remove(at: sender.tag) + } + speakersListTableView.reloadData() + participantsListTableView.reloadData() + } + + @objc func deleteButtonPressed(sender:UIButton!) { + if(ConferenceSchedulingViewModel.shared.selectedSpeakerAddresses.value?[sender.tag] != nil) { + ConferenceSchedulingViewModel.shared.selectedAddresses.value?.append((ConferenceSchedulingViewModel.shared.selectedSpeakerAddresses.value?[sender.tag])!) + ConferenceSchedulingViewModel.shared.selectedSpeakerAddresses.value?.remove(at: sender.tag) + } + speakersListTableView.reloadData() + participantsListTableView.reloadData() + } } diff --git a/Classes/Swift/Conference/Views/ConferenceSchedulingView.swift b/Classes/Swift/Conference/Views/ConferenceSchedulingView.swift index 42e2ee07c..598e13a44 100644 --- a/Classes/Swift/Conference/Views/ConferenceSchedulingView.swift +++ b/Classes/Swift/Conference/Views/ConferenceSchedulingView.swift @@ -30,6 +30,7 @@ import IQKeyboardManager static func compositeViewDescription() -> UICompositeViewDescription! { return compositeDescription } func compositeViewDescription() -> UICompositeViewDescription! { return type(of: self).compositeDescription } + let modeValue = StyledValuePicker(liveIndex: ConferenceSchedulingViewModel.shared.mode,options: ConferenceSchedulingViewModel.modeList.map({ (mode: Mode) -> String in mode.display})) let datePicker = StyledDatePicker(liveValue: ConferenceSchedulingViewModel.shared.scheduledDate,pickerMode: .date) let timeZoneValue = StyledValuePicker(liveIndex: ConferenceSchedulingViewModel.shared.scheduledTimeZone,options: ConferenceSchedulingViewModel.timeZones.map({ (tzd: TimeZoneData) -> String in tzd.descWithOffset()})) let durationValue = StyledValuePicker(liveIndex: ConferenceSchedulingViewModel.shared.scheduledDuration,options: ConferenceSchedulingViewModel.durationList.map({ (duration: Duration) -> String in duration.display})) @@ -81,10 +82,18 @@ import IQKeyboardManager schedulingStack.addArrangedSubview(scheduleForm) scheduleForm.matchParentSideBorders().done() + // Mode + let modeLabel = StyledLabel(VoipTheme.conference_scheduling_font, VoipTexts.conference_schedule_mode) + scheduleForm.addSubview(modeLabel) + modeLabel.alignParentTop(withMargin: form_margin).matchParentSideBorders(insetedByDx: form_margin).done() + + scheduleForm.addSubview(modeValue) + modeValue.alignUnder(view: modeLabel, withMargin: form_margin).matchParentSideBorders(insetedByDx: form_margin).done() + // Left column (Date & Time) let leftColumn = UIView() scheduleForm.addSubview(leftColumn) - leftColumn.matchParentWidthDividedBy(2.2).alignParentLeft(withMargin: form_margin).alignParentTop(withMargin: form_margin).done() + leftColumn.matchParentWidthDividedBy(2.2).alignParentLeft(withMargin: form_margin).alignUnder(view: modeValue, withMargin: form_margin).done() let dateLabel = StyledLabel(VoipTheme.conference_scheduling_font, VoipTexts.conference_schedule_date) dateLabel.addIndicatorIcon(iconName: "voip_mandatory") @@ -108,7 +117,7 @@ import IQKeyboardManager // Right column (Duration & Timezone) let rightColumn = UIView() scheduleForm.addSubview(rightColumn) - rightColumn.matchParentWidthDividedBy(2.2).alignParentRight(withMargin: form_margin).alignParentTop().done() + rightColumn.matchParentWidthDividedBy(2.2).alignParentRight(withMargin: form_margin).alignUnder(view: modeValue, withMargin: form_margin).done() let durationLabel = StyledLabel(VoipTheme.conference_scheduling_font, VoipTexts.conference_schedule_duration) rightColumn.addSubview(durationLabel) @@ -219,6 +228,7 @@ import IQKeyboardManager override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) + modeValue.setIndex(index: ConferenceSchedulingViewModel.shared.mode.value!) datePicker.liveValue = ConferenceSchedulingViewModel.shared.scheduledDate timeZoneValue.setIndex(index: ConferenceSchedulingViewModel.shared.scheduledTimeZone.value!) durationValue.setIndex(index: ConferenceSchedulingViewModel.shared.scheduledDuration.value!) diff --git a/Classes/Swift/Util/ContentMessageView.swift b/Classes/Swift/Util/ContentMessageView.swift index d42d671a2..c59056ca2 100644 --- a/Classes/Swift/Util/ContentMessageView.swift +++ b/Classes/Swift/Util/ContentMessageView.swift @@ -29,7 +29,7 @@ class ContentMessageView: UIViewController { let replyContentTextView = StyledLabel(VoipTheme.chat_conversation_reply_content) let replyContentTextSpacing = UIView() let replyContentForMeetingTextView = StyledLabel(VoipTheme.chat_conversation_reply_content) - let replyDeleteButton = CallControlButton(width: 22, height: 22, buttonTheme:VoipTheme.nav_black_button("reply_cancel")) + let replyDeleteButton = CallControlButton(width: 22, height: 22, buttonTheme:VoipTheme.nav_color_button("reply_cancel")) let replyMeetingSchedule = UIImageView() let recordingView = UIView() let recordingDeleteButton = CallControlButton(width: 40, height: 40, buttonTheme:VoipTheme.nav_button("delete_default")) diff --git a/Classes/Swift/Voip/Theme/VoipTexts.swift b/Classes/Swift/Voip/Theme/VoipTexts.swift index 73e1df408..749d0f4d4 100644 --- a/Classes/Swift/Voip/Theme/VoipTexts.swift +++ b/Classes/Swift/Voip/Theme/VoipTexts.swift @@ -30,6 +30,7 @@ import UIKit @objc static let call_action_change_conf_layout = NSLocalizedString("Change layout",comment:"") @objc static let call_action_chat = NSLocalizedString("Chat",comment:"") @objc static let call_action_numpad = NSLocalizedString("Numpad",comment:"") + @objc static let call_action_speakers_list = NSLocalizedString("Speakers list",comment:"") @objc static let call_action_participants_list = NSLocalizedString("Participants list",comment:"") @objc static let call_action_statistics = NSLocalizedString("Call statistics",comment:"") @objc static let call_action_transfer_call = NSLocalizedString("Transfer call",comment:"") @@ -110,6 +111,7 @@ import UIKit @objc static let conference_paused_title = NSLocalizedString("You are currently out of the meeting.",comment:"") @objc static let conference_schedule_address_copied_to_clipboard = NSLocalizedString("Meeting address copied into clipboard",comment:"") @objc static let conference_schedule_address_title = NSLocalizedString("Meeting address",comment:"") + @objc static let conference_schedule_mode = NSLocalizedString("Mode",comment:"") @objc static let conference_schedule_date = NSLocalizedString("Date",comment:"") @objc static let conference_schedule_description_hint = NSLocalizedString("Description",comment:"") @objc static let conference_schedule_description_title = NSLocalizedString("Add a description",comment:"") @@ -121,6 +123,8 @@ import UIKit @objc static let conference_schedule_mandatory_field = NSLocalizedString("Mandatory",comment:"") @objc static let conference_schedule_organizer = NSLocalizedString("Organizer:",comment:"") @objc static let conference_schedule_participants_list = NSLocalizedString("Participants list",comment:"") + @objc static let conference_schedule_speakers_list = NSLocalizedString("Speakers list",comment:"") + @objc static let conference_schedule_speakers_list_empty = NSLocalizedString("Select at least one speaker",comment:"") @objc static let conference_schedule_send_invite_chat = NSLocalizedString("Send invite via &appName;",comment:"").replacingOccurrences(of: "&appName;", with: appName) @objc static let conference_schedule_send_invite_chat_summary = NSLocalizedString("Invite will be sent out from my &appName; account",comment:"").replacingOccurrences(of: "&appName;", with: appName) @objc static let conference_schedule_send_invite_email = NSLocalizedString("Send invite via email",comment:"") @@ -130,6 +134,7 @@ import UIKit @objc static let conference_group_call_subject_hint = NSLocalizedString("Group call subject",comment:"") @objc static let conference_schedule_subject_title = NSLocalizedString("Subject",comment:"") @objc static let conference_schedule_summary = NSLocalizedString("Meeting info",comment:"") + @objc static let conference_schedule_broadcast_summary = NSLocalizedString("Broadcast info",comment:"") @objc static let conference_schedule_time = NSLocalizedString("Time",comment:"") @objc static let conference_schedule_timezone = NSLocalizedString("Timezone",comment:"") @objc static let conference_schedule_title = NSLocalizedString("Schedule a meeting",comment:"") diff --git a/Classes/Swift/Voip/Theme/VoipTheme.swift b/Classes/Swift/Voip/Theme/VoipTheme.swift index e7ed1c077..aed8f8bb0 100644 --- a/Classes/Swift/Voip/Theme/VoipTheme.swift +++ b/Classes/Swift/Voip/Theme/VoipTheme.swift @@ -407,7 +407,7 @@ import UIKit backgroundStateColors: [:]) } - static func nav_black_button(_ iconName:String) -> ButtonTheme { + static func nav_color_button(_ iconName:String) -> ButtonTheme { return ButtonTheme( tintableStateIcons:[ UIButton.State.normal.rawValue : TintableIcon(name: iconName), diff --git a/Classes/Swift/Voip/ViewModels/ConferenceSpeakerData.swift b/Classes/Swift/Voip/ViewModels/ConferenceSpeakerData.swift new file mode 100644 index 000000000..1aaafd7b3 --- /dev/null +++ b/Classes/Swift/Voip/ViewModels/ConferenceSpeakerData.swift @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2010-2020 Belledonne Communications SARL. + * + * This file is part of linhome + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +import linphonesw +import Foundation + +class ConferenceSpeakerData { + + var conference:Conference + var speaker:Participant + + let isAdmin = MutableLiveData() + let isMeAdmin = MutableLiveData() + + private var callDelegate : CallDelegateStub? + + init (conference:Conference, speaker:Participant) { + self.conference = conference + self.speaker = speaker + isAdmin.value = speaker.isAdmin + isMeAdmin.value = conference.me?.isAdmin + Log.i("[Conference Speaker] Speaker \(sipUri!) is admin=\(isAdmin.value!)") + + } + + var sipUri:String? { + get { + return self.speaker.address?.asString() + } + } + + func destroy() { + isAdmin.clearObservers() + isMeAdmin.clearObservers() + } +} diff --git a/Classes/Swift/Voip/ViewModels/ConferenceViewModel.swift b/Classes/Swift/Voip/ViewModels/ConferenceViewModel.swift index b551b21e5..555e48516 100644 --- a/Classes/Swift/Voip/ViewModels/ConferenceViewModel.swift +++ b/Classes/Swift/Voip/ViewModels/ConferenceViewModel.swift @@ -36,6 +36,7 @@ class ConferenceViewModel { let conference = MutableLiveData() let conferenceCreationPending = MutableLiveData() + let conferenceSpeakers = MutableLiveData<[ConferenceSpeakerData]>() let conferenceParticipants = MutableLiveData<[ConferenceParticipantData]>() let conferenceParticipantDevices = MutableLiveData<[ConferenceParticipantDeviceData]>() let conferenceDisplayMode = MutableLiveData() diff --git a/Classes/Swift/Voip/Views/Fragments/ParticipantsList/VoipParticipantCell.swift b/Classes/Swift/Voip/Views/Fragments/ParticipantsList/VoipParticipantCell.swift index bf0db4695..16e621f87 100644 --- a/Classes/Swift/Voip/Views/Fragments/ParticipantsList/VoipParticipantCell.swift +++ b/Classes/Swift/Voip/Views/Fragments/ParticipantsList/VoipParticipantCell.swift @@ -45,6 +45,7 @@ class VoipParticipantCell: UITableViewCell { let isAdminCheck = UIImageView(image: UIImage(named:("check_unselected"))) let removePart = CallControlButton(imageInset:dismiss_icon_inset,buttonTheme: VoipTheme.voip_cancel, onClickAction: {}) + let addButton = CallControlButton(buttonTheme:VoipTheme.nav_color_button("add_field_default")) var owningParticpantsListView : ParticipantsListView? = nil @@ -135,6 +136,11 @@ class VoipParticipantCell: UITableViewCell { isAdminView.matchParentHeight().toRightOf(nameAddress).alignParentRight(withMargin: dismiss_right_margin).done() contentView.backgroundColor = .clear backgroundColor = .clear + + // Add button for broadcast mode + addSubview(addButton) + addButton.alignParentRight(withMargin: 10).matchParentHeight().done() + addButton.isEnabled = true } required init?(coder: NSCoder) { diff --git a/Classes/Swift/Voip/Views/Fragments/SpeakersList/SpeakersListView.swift b/Classes/Swift/Voip/Views/Fragments/SpeakersList/SpeakersListView.swift new file mode 100644 index 000000000..621cf771a --- /dev/null +++ b/Classes/Swift/Voip/Views/Fragments/SpeakersList/SpeakersListView.swift @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2010-2020 Belledonne Communications SARL. + * + * This file is part of linphone-iphone + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + + +import UIKit +import Foundation +import linphonesw + +@objc class SpeakersListView: DismissableView, UITableViewDataSource { + + // Layout constants + let side_margin = 10.0 + + let speakersListTableView = UITableView() + let noSpeakersLabel = StyledLabel(VoipTheme.empty_list_font,VoipTexts.conference_empty) + + + var callsDataObserver : MutableLiveDataOnChangeClosure<[CallData]>? = nil + + init() { + super.init(title: VoipTexts.call_action_speakers_list) + + + let edit = CallControlButton(buttonTheme: VoipTheme.voip_edit, onClickAction: { + self.removeFromSuperview() + self.gotoSpeakersListSelection() + }) + super.headerView.addSubview(edit) + edit.centerY().done() + super.dismiss?.toRightOf(edit,withLeftMargin: dismiss_right_margin).centerY().done() + + + // SpeakersList + super.contentView.addSubview(speakersListTableView) + speakersListTableView.matchParentDimmensions().done() + speakersListTableView.dataSource = self + speakersListTableView.register(VoipSpeakerCell.self, forCellReuseIdentifier: "VoipSpeakerCell") + speakersListTableView.allowsSelection = false + if #available(iOS 15.0, *) { + speakersListTableView.allowsFocus = false + } + speakersListTableView.separatorStyle = .singleLine + speakersListTableView.separatorColor = .white + + + ConferenceViewModel.shared.conferenceSpeakers.readCurrentAndObserve{ _ in + self.speakersListTableView.reloadData() + self.noSpeakersLabel.isHidden = ConferenceViewModel.shared.conferenceSpeakers.value?.count ?? 0 > 0 + } + + ConferenceViewModel.shared.isMeAdmin.readCurrentAndObserve { (meAdmin) in + edit.isHidden = meAdmin != true + } + + super.contentView.addSubview(noSpeakersLabel) + noSpeakersLabel.center().matchParentSideBorders(insetedByDx: side_margin).done() + noSpeakersLabel.isHidden = ConferenceViewModel.shared.conferenceSpeakers.value?.count ?? 0 > 0 + noSpeakersLabel.numberOfLines = 2 + self.speakersListTableView.backgroundColor = VoipTheme.voipBackgroundBWColor.get() + + UIDeviceBridge.displayModeSwitched.observe { _ in + self.speakersListTableView.backgroundColor = VoipTheme.voipBackgroundBWColor.get() + self.speakersListTableView.reloadData() + } + } + + + // TableView datasource delegate + + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + guard let speakers = ConferenceViewModel.shared.conferenceSpeakers.value else { + return 0 + } + return speakers.count + } + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell:VoipSpeakerCell = tableView.dequeueReusableCell(withIdentifier: "VoipSpeakerCell") as! VoipSpeakerCell + guard let speakerData = ConferenceViewModel.shared.conferenceSpeakers.value?[indexPath.row] else { + return cell + } + cell.selectionStyle = .none + cell.speakerData = speakerData + cell.owningParticpantsListView = self + return cell + } + + // View controller + + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func gotoSpeakersListSelection() { + let view: ChatConversationCreateView = self.VIEW(ChatConversationCreateView.compositeViewDescription()) + view.unfragmentCompositeDescription() + let addresses = ConferenceViewModel.shared.conferenceSpeakers.value!.map { (data) in String(data.speaker.address!.asStringUriOnly()) } + view.tableController.contactsGroup = (addresses as NSArray).mutableCopy() as? NSMutableArray + view.isForEditing = false + view.isForVoipConference = true + view.isForOngoingVoipConference = true + view.tableController.notFirstTime = true + view.isGroupChat = true + PhoneMainView.instance().changeCurrentView(view.compositeViewDescription()) + } + + + + +} diff --git a/Classes/Swift/Voip/Views/Fragments/SpeakersList/VoipSpeakerCell.swift b/Classes/Swift/Voip/Views/Fragments/SpeakersList/VoipSpeakerCell.swift new file mode 100644 index 000000000..04651983a --- /dev/null +++ b/Classes/Swift/Voip/Views/Fragments/SpeakersList/VoipSpeakerCell.swift @@ -0,0 +1,149 @@ +/* + * Copyright (c) 2010-2020 Belledonne Communications SARL. + * + * This file is part of linphone-iphone + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + + +import UIKit +import Foundation +import SnapKit +import linphonesw + +class VoipSpeakerCell: UITableViewCell { + + // Layout Constants + + static let dismiss_icon_inset = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10) + let dismiss_right_margin = 10 + let check_box_size = 15 + static let cell_height = 80.0 + let avatar_left_margin = 15.0 + let texts_left_margin = 20.0 + let lime_badge_width = 18.0 + let lime_badge_offset = -10.0 + + let avatar = Avatar(color:VoipTheme.primaryTextColor, textStyle: VoipTheme.call_generated_avatar_small) + let limeBadge = UIImageView(image: UIImage(named: "security_toggle_icon_green")) + let displayName = StyledLabel(VoipTheme.conference_participant_name_font) + let sipAddress = StyledLabel(VoipTheme.conference_participant_sip_uri_font) + let isAdminView = UIStackView() + let isAdminLabel = StyledLabel(VoipTheme.conference_participant_admin_label,VoipTexts.chat_room_group_info_admin) + let isAdminCheck = UIImageView(image: UIImage(named:("check_unselected"))) + let removePart = CallControlButton(imageInset:dismiss_icon_inset,buttonTheme: VoipTheme.voip_cancel, onClickAction: {}) + + let deleteButton = CallControlButton(buttonTheme:VoipTheme.nav_color_button("delete_field_default")) + + var owningParticpantsListView : SpeakersListView? = nil + + var speakerData: ConferenceSpeakerData? = nil { + didSet { + if let data = speakerData { + limeBadge.isHidden = true + avatar.fillFromAddress(address: data.speaker.address!) + displayName.text = data.speaker.address?.addressBookEnhancedDisplayName() + sipAddress.text = data.speaker.address?.asStringUriOnly() + data.isAdmin.readCurrentAndObserve { _ in + self.setAdminStatus(data: data) + } + data.isMeAdmin.readCurrentAndObserve { _ in + self.setAdminStatus(data: data) + } + self.isAdminView.onClick { + data.conference.setParticipantAdminStatus(participant: data.speaker, isAdmin: data.isAdmin.value != true) + self.owningParticpantsListView?.speakersListTableView.reloadData() + } + self.removePart.onClick { + try?data.conference.removeParticipant(participant: data.speaker) + self.owningParticpantsListView?.speakersListTableView.reloadData() + } + } + } + } + + func setAdminStatus(data:ConferenceSpeakerData) { + let isAdmin = data.isAdmin.value! + let isMeAdmin = data.isMeAdmin.value! + self.removePart.isHidden = !isMeAdmin + self.isAdminView.isUserInteractionEnabled = isMeAdmin + self.isAdminLabel.textColor = !isAdmin ? VoipTheme.primarySubtextLightColor.get() : VoipTheme.primaryTextColor.get() + self.isAdminView.isHidden = !isAdmin && !isMeAdmin // Non admin don't see status of others non admin (they just see admins) + } + + var scheduleConfSpeakerAddress: Address? = nil { + didSet { + if let address = scheduleConfSpeakerAddress { + avatar.fillFromAddress(address: address) + displayName.text = address.addressBookEnhancedDisplayName() + sipAddress.text = address.asStringUriOnly() + self.isAdminView.isHidden = true + self.removePart.isHidden = true + } + } + } + + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + contentView.height(VoipSpeakerCell.cell_height).matchParentSideBorders().done() + + addSubview(avatar) + avatar.size(w: VoipCallCell.avatar_size, h: VoipCallCell.avatar_size).centerY().alignParentLeft(withMargin: avatar_left_margin).done() + + limeBadge.contentMode = .scaleAspectFit + addSubview(limeBadge) + limeBadge.toRightOf(avatar,withLeftMargin: lime_badge_offset).width(lime_badge_width).done() + + // Name Address + + let nameAddress = UIStackView() + nameAddress.addArrangedSubview(displayName) + nameAddress.addArrangedSubview(sipAddress) + nameAddress.axis = .vertical + addSubview(nameAddress) + nameAddress.toRightOf(avatar,withLeftMargin:texts_left_margin).centerY().done() + + // Admin section + isAdminView.spacing = 5 + + isAdminView.addArrangedSubview(isAdminCheck) + isAdminCheck.square(check_box_size).done() + isAdminCheck.contentMode = .scaleAspectFit + isAdminCheck.setContentHuggingPriority(.defaultHigh, for: .horizontal) + + isAdminView.addArrangedSubview(isAdminLabel) + isAdminLabel.setContentHuggingPriority(.defaultHigh, for: .horizontal) + + isAdminView.addArrangedSubview(removePart) + removePart.setContentHuggingPriority(.defaultHigh, for: .horizontal) + + addSubview(isAdminView) + isAdminView.leadingAnchor.constraint(greaterThanOrEqualTo: leadingAnchor).isActive = true + isAdminView.trailingAnchor.constraint(equalTo: trailingAnchor).isActive = true + isAdminView.matchParentHeight().toRightOf(nameAddress).alignParentRight(withMargin: dismiss_right_margin).done() + contentView.backgroundColor = .clear + backgroundColor = .clear + + // Delete button for broadcast mode + addSubview(deleteButton) + deleteButton.alignParentRight(withMargin: 10).matchParentHeight().done() + deleteButton.isEnabled = true + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} diff --git a/linphone.xcodeproj/project.pbxproj b/linphone.xcodeproj/project.pbxproj index 04955cb8c..d8b3317dd 100644 --- a/linphone.xcodeproj/project.pbxproj +++ b/linphone.xcodeproj/project.pbxproj @@ -50,6 +50,7 @@ 288765FD0DF74451002DB57D /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 288765FC0DF74451002DB57D /* CoreGraphics.framework */; }; 340751971506459A00B89C47 /* CoreTelephony.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 340751961506459A00B89C47 /* CoreTelephony.framework */; }; 344ABDF114850AE9007420B6 /* libc++.1.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 344ABDEF14850AE9007420B6 /* libc++.1.dylib */; settings = {ATTRIBUTES = (Weak, ); }; }; + 4701D3DADBB5643F3BFBDB13 /* Pods_msgNotificationService.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 785F0C8F17CC0C3ED32D877A /* Pods_msgNotificationService.framework */; }; 570742581D5A0691004B9C84 /* ShopView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 570742561D5A0691004B9C84 /* ShopView.xib */; }; 570742611D5A09B8004B9C84 /* ShopView.m in Sources */ = {isa = PBXBuildFile; fileRef = 5707425F1D5A09B8004B9C84 /* ShopView.m */; }; 570742671D5A63DB004B9C84 /* StoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 570742661D5A63DB004B9C84 /* StoreKit.framework */; }; @@ -625,8 +626,11 @@ 669B140C27A29D140012220A /* FloatingScrollDownButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 669B140B27A29D140012220A /* FloatingScrollDownButton.swift */; }; 66E399F72857869300E73456 /* menu_notifications_off.png in Resources */ = {isa = PBXBuildFile; fileRef = 66E399F52857869200E73456 /* menu_notifications_off.png */; }; 66E399F82857869300E73456 /* menu_notifications_on.png in Resources */ = {isa = PBXBuildFile; fileRef = 66E399F62857869200E73456 /* menu_notifications_on.png */; }; + 670570508BCF8E632DA30693 /* Pods_msgNotificationContent.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7E34400DB0BBC32817BBC646 /* Pods_msgNotificationContent.framework */; }; + 6BFC6480E944DC85FB4B596B /* Pods_linphone.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 99AE8AC439FE1502BDB82EEE /* Pods_linphone.framework */; }; 70E542F313E147E3002BA2C0 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70E542F213E147E3002BA2C0 /* OpenGLES.framework */; }; 70E542F513E147EB002BA2C0 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70E542F413E147EB002BA2C0 /* QuartzCore.framework */; }; + 71AC843E9555663F6A2308A6 /* Pods_CallUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8005C73AB852A5FC6C960F4B /* Pods_CallUITests.framework */; }; 8C2595DF1DEDCC8E007A6424 /* CallKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8C2595DE1DEDCC8E007A6424 /* CallKit.framework */; }; 8C2A81951F87B8000012A66B /* chat_group_avatar@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8C2A81931F87B7FF0012A66B /* chat_group_avatar@2x.png */; }; 8C2A81961F87B8000012A66B /* chat_group_avatar.png in Resources */ = {isa = PBXBuildFile; fileRef = 8C2A81941F87B8000012A66B /* chat_group_avatar.png */; }; @@ -969,6 +973,10 @@ D7A7545029507038005C9D4A /* CustomAlertController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7A7544F29507038005C9D4A /* CustomAlertController.swift */; }; D7C6DE832948CF3100756E03 /* DropDownCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7C6DE812948CF3100756E03 /* DropDownCell.swift */; }; D7C6DE842948CF3100756E03 /* DropDownCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = D7C6DE822948CF3100756E03 /* DropDownCell.xib */; }; + D7CBC0F72A8E1669009182D8 /* Mode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7CBC0F62A8E1669009182D8 /* Mode.swift */; }; + D7CBC0FB2A8E3D1E009182D8 /* SpeakersListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7CBC0FA2A8E3D1E009182D8 /* SpeakersListView.swift */; }; + D7CBC0FD2A8E3D3F009182D8 /* VoipSpeakerCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7CBC0FC2A8E3D3F009182D8 /* VoipSpeakerCell.swift */; }; + D7CBC0FF2A8E3E11009182D8 /* ConferenceSpeakerData.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7CBC0FE2A8E3E11009182D8 /* ConferenceSpeakerData.swift */; }; D7CF13732A2E225200D92165 /* emoji.png in Resources */ = {isa = PBXBuildFile; fileRef = D7CF13722A2E225200D92165 /* emoji.png */; }; D7DA18712A02598700FABA0D /* TextViewer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7DA18702A02598700FABA0D /* TextViewer.swift */; }; EA0007A62356008F003CC6BF /* msgNotificationService.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = EA5F25D9232BD3E200475F2E /* msgNotificationService.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; @@ -1049,11 +1057,13 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 13DBC5D3188A145CD7240456 /* Pods-msgNotificationContent.distributionadhoc.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-msgNotificationContent.distributionadhoc.xcconfig"; path = "Target Support Files/Pods-msgNotificationContent/Pods-msgNotificationContent.distributionadhoc.xcconfig"; sourceTree = ""; }; 152F22351B15E889008C0621 /* libxml2.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libxml2.dylib; path = usr/lib/libxml2.dylib; sourceTree = SDKROOT; }; 1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 1D3623240D0F684500981E51 /* LinphoneAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LinphoneAppDelegate.h; sourceTree = ""; }; 1D3623250D0F684500981E51 /* LinphoneAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LinphoneAppDelegate.m; sourceTree = ""; }; 1D6058910D05DD3D006BFB54 /* linphone.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = linphone.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 1DB171367FBC063A92DFF671 /* Pods-msgNotificationService.distribution.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-msgNotificationService.distribution.xcconfig"; path = "Target Support Files/Pods-msgNotificationService/Pods-msgNotificationService.distribution.xcconfig"; sourceTree = ""; }; 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 2214EB7812F846B1002A5394 /* UICallButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UICallButton.h; sourceTree = ""; }; 2214EB7912F846B1002A5394 /* UICallButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UICallButton.m; sourceTree = ""; }; @@ -1102,16 +1112,22 @@ 24BFAA9C209B062F004F47A7 /* contacts_sip_selected@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "contacts_sip_selected@2x.png"; sourceTree = ""; }; 24BFAA9D209B0630004F47A7 /* linphone_logo@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "linphone_logo@2x.png"; sourceTree = ""; }; 24E1C7B91F9A235500D3F981 /* Contacts.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Contacts.framework; path = System/Library/Frameworks/Contacts.framework; sourceTree = SDKROOT; }; + 2805D857950EB54DE9EC76F3 /* Pods-msgNotificationService.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-msgNotificationService.release.xcconfig"; path = "Target Support Files/Pods-msgNotificationService/Pods-msgNotificationService.release.xcconfig"; sourceTree = ""; }; 288765FC0DF74451002DB57D /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 32CA4F630368D1EE00C91783 /* linphone_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = linphone_Prefix.pch; sourceTree = ""; }; 340751961506459A00B89C47 /* CoreTelephony.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreTelephony.framework; path = System/Library/Frameworks/CoreTelephony.framework; sourceTree = SDKROOT; }; 344ABDEF14850AE9007420B6 /* libc++.1.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = "libc++.1.dylib"; path = "usr/lib/libc++.1.dylib"; sourceTree = SDKROOT; }; 344ABDF014850AE9007420B6 /* libstdc++.6.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = "libstdc++.6.dylib"; path = "usr/lib/libstdc++.6.dylib"; sourceTree = SDKROOT; }; + 3D777FF83A489472E2530A85 /* Pods-msgNotificationService.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-msgNotificationService.debug.xcconfig"; path = "Target Support Files/Pods-msgNotificationService/Pods-msgNotificationService.debug.xcconfig"; sourceTree = ""; }; + 413401F544CB2668F07E0EA0 /* Pods-msgNotificationContent.distribution.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-msgNotificationContent.distribution.xcconfig"; path = "Target Support Files/Pods-msgNotificationContent/Pods-msgNotificationContent.distribution.xcconfig"; sourceTree = ""; }; + 44CD55BCF1F7605D70B925D6 /* Pods-msgNotificationService.distributionadhoc.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-msgNotificationService.distributionadhoc.xcconfig"; path = "Target Support Files/Pods-msgNotificationService/Pods-msgNotificationService.distributionadhoc.xcconfig"; sourceTree = ""; }; + 4ABDEF5B597BAA50AB49EEE2 /* Pods-msgNotificationContent.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-msgNotificationContent.debug.xcconfig"; path = "Target Support Files/Pods-msgNotificationContent/Pods-msgNotificationContent.debug.xcconfig"; sourceTree = ""; }; 570742571D5A0691004B9C84 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/ShopView.xib; sourceTree = ""; }; 5707425F1D5A09B8004B9C84 /* ShopView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ShopView.m; sourceTree = ""; }; 570742601D5A09B8004B9C84 /* ShopView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ShopView.h; sourceTree = ""; }; 570742661D5A63DB004B9C84 /* StoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = StoreKit.framework; path = System/Library/Frameworks/StoreKit.framework; sourceTree = SDKROOT; }; + 5A0745F1212040EAEC11A72A /* Pods-CallUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CallUITests.release.xcconfig"; path = "Target Support Files/Pods-CallUITests/Pods-CallUITests.release.xcconfig"; sourceTree = ""; }; 5E58962520DCE5700030868C /* UserNotificationsUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UserNotificationsUI.framework; path = System/Library/Frameworks/UserNotificationsUI.framework; sourceTree = SDKROOT; }; 5EF0C33820C806A5005081B0 /* NotificationCenter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NotificationCenter.framework; path = System/Library/Frameworks/NotificationCenter.framework; sourceTree = SDKROOT; }; 6112A01B243B31A600DBD5F5 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; @@ -1800,8 +1816,14 @@ 66EADB022A939487002DDCEE /* zh_CN */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = zh_CN; path = zh_CN.lproj/Localizable.strings; sourceTree = ""; }; 6EA1EF0554CF75B5C078A4F8 /* Pods-linphone.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-linphone.debug.xcconfig"; path = "Target Support Files/Pods-linphone/Pods-linphone.debug.xcconfig"; sourceTree = ""; }; 6FFD86D62D3E1E8093160069 /* Pods-linphone.distributionadhoc.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-linphone.distributionadhoc.xcconfig"; path = "Target Support Files/Pods-linphone/Pods-linphone.distributionadhoc.xcconfig"; sourceTree = ""; }; + 67039DAF1162F13644E2B622 /* Pods-CallUITests.distribution.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CallUITests.distribution.xcconfig"; path = "Target Support Files/Pods-CallUITests/Pods-CallUITests.distribution.xcconfig"; sourceTree = ""; }; + 68F0AD8BF6C2A009468601CF /* Pods-linphone.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-linphone.release.xcconfig"; path = "Target Support Files/Pods-linphone/Pods-linphone.release.xcconfig"; sourceTree = ""; }; 70E542F213E147E3002BA2C0 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; 70E542F413E147EB002BA2C0 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; + 785F0C8F17CC0C3ED32D877A /* Pods_msgNotificationService.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_msgNotificationService.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 7E34400DB0BBC32817BBC646 /* Pods_msgNotificationContent.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_msgNotificationContent.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 8005C73AB852A5FC6C960F4B /* Pods_CallUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_CallUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 86CA4651CCBB3B93873B787A /* Pods-linphone.distribution.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-linphone.distribution.xcconfig"; path = "Target Support Files/Pods-linphone/Pods-linphone.distribution.xcconfig"; sourceTree = ""; }; 8C1A1F7C1FA331D40064BE00 /* libsoci_sqlite3.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libsoci_sqlite3.a; path = "liblinphone-sdk/apple-darwin/lib/libsoci_sqlite3.a"; sourceTree = ""; }; 8C23BCB71D82AAC3005F19BB /* linphone.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = linphone.entitlements; sourceTree = ""; }; 8C2595DE1DEDCC8E007A6424 /* CallKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CallKit.framework; path = System/Library/Frameworks/CallKit.framework; sourceTree = SDKROOT; }; @@ -1887,6 +1909,10 @@ 8CF25D941F9F336100BEA0C1 /* check_unselected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = check_unselected.png; sourceTree = ""; }; 8CF25D9B1F9F76BC00BEA0C1 /* chat_group_informations.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chat_group_informations.png; sourceTree = ""; }; 8CF25D9C1F9F76BD00BEA0C1 /* chat_group_informations@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "chat_group_informations@2x.png"; sourceTree = ""; }; + 8E72C2B55BD41E35CBD59144 /* Pods-CallUITests.distributionadhoc.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CallUITests.distributionadhoc.xcconfig"; path = "Target Support Files/Pods-CallUITests/Pods-CallUITests.distributionadhoc.xcconfig"; sourceTree = ""; }; + 99AE8AC439FE1502BDB82EEE /* Pods_linphone.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_linphone.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 99EE66591AAE0A56B2752224 /* Pods-linphone.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-linphone.debug.xcconfig"; path = "Target Support Files/Pods-linphone/Pods-linphone.debug.xcconfig"; sourceTree = ""; }; + A8E18CF5D897E58D43C78844 /* Pods-CallUITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CallUITests.debug.xcconfig"; path = "Target Support Files/Pods-CallUITests/Pods-CallUITests.debug.xcconfig"; sourceTree = ""; }; C61B1BF12667D075001A4E4A /* menu_security_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = menu_security_default.png; sourceTree = ""; }; C61B1BF32667D202001A4E4A /* more_menu_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = more_menu_default.png; sourceTree = ""; }; C61B1BF62667EC6B001A4E4A /* ephemeral_messages_color_A.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = ephemeral_messages_color_A.png; sourceTree = ""; }; @@ -2097,6 +2123,7 @@ C6E3E7ED291D648D00DDFC46 /* side_menu_voip_meeting_schedule@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "side_menu_voip_meeting_schedule@2x.png"; sourceTree = ""; }; C6F55644287CC69F0056E213 /* voip_meeting_schedule.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_meeting_schedule.png; sourceTree = ""; }; C6F55646287CCFB60056E213 /* menu_voip_meeting_schedule.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = menu_voip_meeting_schedule.png; sourceTree = ""; }; + C8153405A74E7E99A5AE0926 /* Pods-msgNotificationContent.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-msgNotificationContent.release.xcconfig"; path = "Target Support Files/Pods-msgNotificationContent/Pods-msgNotificationContent.release.xcconfig"; sourceTree = ""; }; C90FAA7615AF54E6002091CB /* HistoryDetailsView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HistoryDetailsView.h; sourceTree = ""; }; C90FAA7715AF54E6002091CB /* HistoryDetailsView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HistoryDetailsView.m; sourceTree = ""; }; C9B3A6FD15B485DB006F52EE /* Utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Utils.h; path = Utils/Utils.h; sourceTree = ""; }; @@ -2240,8 +2267,13 @@ D7A7544F29507038005C9D4A /* CustomAlertController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomAlertController.swift; sourceTree = ""; }; D7C6DE812948CF3100756E03 /* DropDownCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DropDownCell.swift; sourceTree = ""; }; D7C6DE822948CF3100756E03 /* DropDownCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = DropDownCell.xib; sourceTree = ""; }; + D7CBC0F62A8E1669009182D8 /* Mode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Mode.swift; sourceTree = ""; }; + D7CBC0FA2A8E3D1E009182D8 /* SpeakersListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpeakersListView.swift; sourceTree = ""; }; + D7CBC0FC2A8E3D3F009182D8 /* VoipSpeakerCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VoipSpeakerCell.swift; sourceTree = ""; }; + D7CBC0FE2A8E3E11009182D8 /* ConferenceSpeakerData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConferenceSpeakerData.swift; sourceTree = ""; }; D7CF13722A2E225200D92165 /* emoji.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = emoji.png; sourceTree = ""; }; D7DA18702A02598700FABA0D /* TextViewer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextViewer.swift; sourceTree = ""; }; + E4178B3BF1512DBE49E7D6C9 /* Pods-linphone.distributionadhoc.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-linphone.distributionadhoc.xcconfig"; path = "Target Support Files/Pods-linphone/Pods-linphone.distributionadhoc.xcconfig"; sourceTree = ""; }; EA5F25D9232BD3E200475F2E /* msgNotificationService.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = msgNotificationService.appex; sourceTree = BUILT_PRODUCTS_DIR; }; EA5F25DB232BD3E200475F2E /* NotificationService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationService.swift; sourceTree = ""; }; EA5F25DD232BD3E200475F2E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; @@ -2315,6 +2347,7 @@ files = ( EA88F3AC241BD05200E66528 /* UserNotificationsUI.framework in Frameworks */, EA88F3AB241BD05200E66528 /* UserNotifications.framework in Frameworks */, + 670570508BCF8E632DA30693 /* Pods_msgNotificationContent.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2355,6 +2388,7 @@ F05BAA621A5D594E00411815 /* libz.dylib in Frameworks */, 344ABDF114850AE9007420B6 /* libc++.1.dylib in Frameworks */, 22D1B68112A3E0BE001AE361 /* libresolv.dylib in Frameworks */, + 6BFC6480E944DC85FB4B596B /* Pods_linphone.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2362,6 +2396,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 4701D3DADBB5643F3BFBDB13 /* Pods_msgNotificationService.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2376,6 +2411,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 71AC843E9555663F6A2308A6 /* Pods_CallUITests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2714,6 +2750,10 @@ 8C73477B1D9BA3A00022EE8C /* UserNotifications.framework */, 5E58962520DCE5700030868C /* UserNotificationsUI.framework */, 63CE583F1C85EBF400304800 /* VideoToolbox.framework */, + 8005C73AB852A5FC6C960F4B /* Pods_CallUITests.framework */, + 99AE8AC439FE1502BDB82EEE /* Pods_linphone.framework */, + 7E34400DB0BBC32817BBC646 /* Pods_msgNotificationContent.framework */, + 785F0C8F17CC0C3ED32D877A /* Pods_msgNotificationService.framework */, ); name = Frameworks; sourceTree = ""; @@ -3462,6 +3502,22 @@ 75AA7090378DBBA5417E4370 /* Pods */ = { isa = PBXGroup; children = ( + A8E18CF5D897E58D43C78844 /* Pods-CallUITests.debug.xcconfig */, + 5A0745F1212040EAEC11A72A /* Pods-CallUITests.release.xcconfig */, + 67039DAF1162F13644E2B622 /* Pods-CallUITests.distribution.xcconfig */, + 8E72C2B55BD41E35CBD59144 /* Pods-CallUITests.distributionadhoc.xcconfig */, + 99EE66591AAE0A56B2752224 /* Pods-linphone.debug.xcconfig */, + 68F0AD8BF6C2A009468601CF /* Pods-linphone.release.xcconfig */, + 86CA4651CCBB3B93873B787A /* Pods-linphone.distribution.xcconfig */, + E4178B3BF1512DBE49E7D6C9 /* Pods-linphone.distributionadhoc.xcconfig */, + 4ABDEF5B597BAA50AB49EEE2 /* Pods-msgNotificationContent.debug.xcconfig */, + C8153405A74E7E99A5AE0926 /* Pods-msgNotificationContent.release.xcconfig */, + 413401F544CB2668F07E0EA0 /* Pods-msgNotificationContent.distribution.xcconfig */, + 13DBC5D3188A145CD7240456 /* Pods-msgNotificationContent.distributionadhoc.xcconfig */, + 3D777FF83A489472E2530A85 /* Pods-msgNotificationService.debug.xcconfig */, + 2805D857950EB54DE9EC76F3 /* Pods-msgNotificationService.release.xcconfig */, + 1DB171367FBC063A92DFF671 /* Pods-msgNotificationService.distribution.xcconfig */, + 44CD55BCF1F7605D70B925D6 /* Pods-msgNotificationService.distributionadhoc.xcconfig */, ); path = Pods; sourceTree = ""; @@ -3511,6 +3567,7 @@ C63F719F285A24B10066163B /* ScheduledConferenceData.swift */, C63F71A0285A24B10066163B /* TimeZoneData.swift */, C63F71A1285A24B10066163B /* Duration.swift */, + D7CBC0F62A8E1669009182D8 /* Mode.swift */, ); path = Data; sourceTree = ""; @@ -3620,6 +3677,7 @@ C63F71CD285A24B10066163B /* ConferenceParticipantData.swift */, C63F71CE285A24B10066163B /* ConferenceParticipantDeviceData.swift */, C63F71CF285A24B10066163B /* CallData.swift */, + D7CBC0FE2A8E3E11009182D8 /* ConferenceSpeakerData.swift */, ); path = ViewModels; sourceTree = ""; @@ -3649,6 +3707,7 @@ C63F71D8285A24B10066163B /* Fragments */ = { isa = PBXGroup; children = ( + D7CBC0F92A8E3CF4009182D8 /* SpeakersList */, C63F71D9285A24B10066163B /* ParticipantsList */, C63F71DC285A24B10066163B /* AudioRoutesView.swift */, C63F71DD285A24B10066163B /* Conference */, @@ -3939,6 +3998,15 @@ path = Views; sourceTree = ""; }; + D7CBC0F92A8E3CF4009182D8 /* SpeakersList */ = { + isa = PBXGroup; + children = ( + D7CBC0FA2A8E3D1E009182D8 /* SpeakersListView.swift */, + D7CBC0FC2A8E3D3F009182D8 /* VoipSpeakerCell.swift */, + ); + path = SpeakersList; + sourceTree = ""; + }; D7DA18722A02599A00FABA0D /* Viewers */ = { isa = PBXGroup; children = ( @@ -3979,6 +4047,7 @@ isa = PBXNativeTarget; buildConfigurationList = 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "linphone" */; buildPhases = ( + 4B1E635C760AB13551B24106 /* [CP] Check Pods Manifest.lock */, 1D60588D0D05DD3D006BFB54 /* Resources */, 63DCC71D1A07B08E00916627 /* Run Script */, 1D60588E0D05DD3D006BFB54 /* Sources */, @@ -3986,6 +4055,7 @@ 8CDC89061EAF89A8006B5652 /* Embed Frameworks */, 5EF0C35020C806A5005081B0 /* Embed App Extensions */, 614D0A1821E77F5300C43EDF /* ShellScript */, + 805994971B2482F7ED933FF5 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -4020,9 +4090,11 @@ isa = PBXNativeTarget; buildConfigurationList = 6637AF99288593AF00965733 /* Build configuration list for PBXNativeTarget "CallUITests" */; buildPhases = ( + FF5E503C6A83D3C5D8F4CE83 /* [CP] Check Pods Manifest.lock */, 6637AF89288593AF00965733 /* Sources */, 6637AF8A288593AF00965733 /* Frameworks */, 6637AF8B288593AF00965733 /* Resources */, + E41455F2A82C6AEC45A47409 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -4038,6 +4110,7 @@ isa = PBXNativeTarget; buildConfigurationList = EA5F25E1232BD3E300475F2E /* Build configuration list for PBXNativeTarget "msgNotificationService" */; buildPhases = ( + 223F838B1E2854EBF44D1434 /* [CP] Check Pods Manifest.lock */, EA5F25D5232BD3E200475F2E /* Sources */, 203E6292C3E84CD13778F720 /* Frameworks */, EA88A406242A6224007FEC61 /* Resources */, @@ -4056,6 +4129,7 @@ isa = PBXNativeTarget; buildConfigurationList = EA8CB834239F96CA00C330CC /* Build configuration list for PBXNativeTarget "msgNotificationContent" */; buildPhases = ( + 5B941D10A235EDF133762CBF /* [CP] Check Pods Manifest.lock */, EA8CB823239F96CA00C330CC /* Sources */, 143EFEE2501CB14E6BB244EF /* Frameworks */, EA88F3AE241BD1ED00E66528 /* Resources */, @@ -4911,6 +4985,72 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ + 223F838B1E2854EBF44D1434 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-msgNotificationService-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; + }; + 4B1E635C760AB13551B24106 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-linphone-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; + }; + 5B941D10A235EDF133762CBF /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-msgNotificationContent-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; + }; 6112A019243B2C8400DBD5F5 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -4983,6 +5123,152 @@ shellPath = /bin/sh; shellScript = "$SRCROOT/Tools/git_version.sh\n"; }; + 805994971B2482F7ED933FF5 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-linphone/Pods-linphone-frameworks.sh", + "${BUILT_PRODUCTS_DIR}/DropDown/DropDown.framework", + "${BUILT_PRODUCTS_DIR}/EmojiPicker/EmojiPicker.framework", + "${BUILT_PRODUCTS_DIR}/IQKeyboardManager/IQKeyboardManager.framework", + "${BUILT_PRODUCTS_DIR}/SVProgressHUD/SVProgressHUD.framework", + "${BUILT_PRODUCTS_DIR}/SnapKit/SnapKit.framework", + "${BUILT_PRODUCTS_DIR}/SwipeCellKit/SwipeCellKit.framework", + "${BUILT_PRODUCTS_DIR}/linphone-sdk/linphonesw.framework", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/bctoolbox-ios.framework/bctoolbox-ios", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/bctoolbox-tester.framework/bctoolbox-tester", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/bctoolbox.framework/bctoolbox", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/belcard.framework/belcard", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/belle-sip.framework/belle-sip", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/belr.framework/belr", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/exampleplugin.framework/exampleplugin", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/lime.framework/lime", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/limetester.framework/limetester", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/linphone.framework/linphone", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/linphonetester.framework/linphonetester", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/mediastreamer2.framework/mediastreamer2", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/msamr.framework/msamr", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/mscodec2.framework/mscodec2", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/msopenh264.framework/msopenh264", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/mssilk.framework/mssilk", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/mswebrtc.framework/mswebrtc", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/ortp.framework/ortp", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/ZXing.framework/ZXing", + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/DropDown.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/EmojiPicker.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQKeyboardManager.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SVProgressHUD.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SnapKit.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwipeCellKit.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/linphonesw.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/bctoolbox-ios.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/bctoolbox-tester.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/bctoolbox.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/belcard.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/belle-sip.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/belr.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/exampleplugin.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/lime.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/limetester.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/linphone.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/linphonetester.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/mediastreamer2.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/msamr.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/mscodec2.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/msopenh264.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/mssilk.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/mswebrtc.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ortp.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ZXing.framework", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-linphone/Pods-linphone-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + E41455F2A82C6AEC45A47409 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-CallUITests/Pods-CallUITests-frameworks.sh", + "${BUILT_PRODUCTS_DIR}/linphone-sdk/linphonesw.framework", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/bctoolbox-ios.framework/bctoolbox-ios", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/bctoolbox-tester.framework/bctoolbox-tester", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/bctoolbox.framework/bctoolbox", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/belcard.framework/belcard", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/belle-sip.framework/belle-sip", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/belr.framework/belr", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/exampleplugin.framework/exampleplugin", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/lime.framework/lime", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/limetester.framework/limetester", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/linphone.framework/linphone", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/linphonetester.framework/linphonetester", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/mediastreamer2.framework/mediastreamer2", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/msamr.framework/msamr", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/mscodec2.framework/mscodec2", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/msopenh264.framework/msopenh264", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/mssilk.framework/mssilk", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/mswebrtc.framework/mswebrtc", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/ortp.framework/ortp", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/ZXing.framework/ZXing", + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/linphonesw.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/bctoolbox-ios.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/bctoolbox-tester.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/bctoolbox.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/belcard.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/belle-sip.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/belr.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/exampleplugin.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/lime.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/limetester.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/linphone.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/linphonetester.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/mediastreamer2.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/msamr.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/mscodec2.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/msopenh264.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/mssilk.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/mswebrtc.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ortp.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ZXing.framework", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-CallUITests/Pods-CallUITests-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + FF5E503C6A83D3C5D8F4CE83 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-CallUITests-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; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -5016,6 +5302,7 @@ 633671611BCBAAD200BFCBDE /* ChatConversationCreateView.m in Sources */, 634610061B61330300548952 /* UILabel+Boldify.m in Sources */, 2248E90E12F7E4CF00220D9C /* UIDigitButton.m in Sources */, + D7CBC0F72A8E1669009182D8 /* Mode.swift in Sources */, 633756391B67BAF400E21BAD /* SideMenuTableView.m in Sources */, C63F7245285A24B10066163B /* VoipConferenceAudioOnlyView.swift in Sources */, 2214EB7A12F846B1002A5394 /* UICallButton.m in Sources */, @@ -5041,6 +5328,7 @@ C63F7214285A24B10066163B /* Duration.swift in Sources */, C63F723B285A24B10066163B /* AudioRouteUtils.swift in Sources */, C63F7269285A24B10066163B /* StyledLabel.swift in Sources */, + D7CBC0FD2A8E3D3F009182D8 /* VoipSpeakerCell.swift in Sources */, C63F722C285A24B10066163B /* UIColorExtensions.swift in Sources */, D3F83F8E15822ABE00336684 /* PhoneMainView.m in Sources */, C63F7251285A24B10066163B /* NumpadView.swift in Sources */, @@ -5094,6 +5382,7 @@ C63F7238285A24B10066163B /* ConferenceParticipantData.swift in Sources */, 63B81A0D1B57DA33009604A6 /* TPKeyboardAvoidingCollectionView.m in Sources */, D7C6DE832948CF3100756E03 /* DropDownCell.swift in Sources */, + D7CBC0FF2A8E3E11009182D8 /* ConferenceSpeakerData.swift in Sources */, C63F726D285A24B10066163B /* ProviderDelegate.swift in Sources */, C63F7266285A24B10066163B /* UICallTimer.swift in Sources */, C6548821292D32FA00BF646B /* ConferenceCallView.swift in Sources */, @@ -5145,6 +5434,7 @@ C63F725A285A24B10066163B /* OutgoingCallView.swift in Sources */, 63FB30351A680E73008CA393 /* UIRoundedImageView.m in Sources */, 635775251B6673EC00C8B704 /* HistoryDetailsTableView.m in Sources */, + D7CBC0FB2A8E3D1E009182D8 /* SpeakersListView.swift in Sources */, C63F720E285A24B10066163B /* CallManager.swift in Sources */, 63C441C31BBC23ED0053DC5E /* UIAssistantTextField.m in Sources */, D35860D615B549B500513429 /* Utils.m in Sources */, @@ -5772,6 +6062,7 @@ /* Begin XCBuildConfiguration section */ 1D6058940D05DD3E006BFB54 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 99EE66591AAE0A56B2752224 /* Pods-linphone.debug.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = "$(inherited)"; ALWAYS_SEARCH_USER_PATHS = NO; @@ -5826,7 +6117,7 @@ "-DENABLE_QRCODE=TRUE", "-DENABLE_SMS_INVITE=TRUE", "$(inherited)", - "-DLINPHONE_SDK_VERSION=\\\"5.2.79\\\"", + "-DLINPHONE_SDK_VERSION=\\\"5.3.0-alpha.173+990473d73\\\"", ); OTHER_SWIFT_FLAGS = "$(inherited)"; PRODUCT_BUNDLE_IDENTIFIER = org.linphone.phone; @@ -5901,6 +6192,7 @@ }; 228B19A71302902F00F154D3 /* DistributionAdhoc */ = { isa = XCBuildConfiguration; + baseConfigurationReference = E4178B3BF1512DBE49E7D6C9 /* Pods-linphone.distributionadhoc.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = "$(inherited)"; ALWAYS_SEARCH_USER_PATHS = NO; @@ -5952,7 +6244,7 @@ "-DENABLE_QRCODE=TRUE", "-DENABLE_SMS_INVITE=TRUE", "$(inherited)", - "-DLINPHONE_SDK_VERSION=\\\"5.2.79\\\"", + "-DLINPHONE_SDK_VERSION=\\\"5.3.0-alpha.173+990473d73\\\"", ); OTHER_SWIFT_FLAGS = "$(inherited)"; PRODUCT_BUNDLE_IDENTIFIER = org.linphone.phone; @@ -6026,6 +6318,7 @@ }; 22F3D55613CC3C9100A0DA02 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 68F0AD8BF6C2A009468601CF /* Pods-linphone.release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = "$(inherited)"; ALWAYS_SEARCH_USER_PATHS = NO; @@ -6077,7 +6370,7 @@ "-DENABLE_QRCODE=TRUE", "-DENABLE_SMS_INVITE=TRUE", "$(inherited)", - "-DLINPHONE_SDK_VERSION=\\\"5.2.79\\\"", + "-DLINPHONE_SDK_VERSION=\\\"5.3.0-alpha.173+990473d73\\\"", ); OTHER_SWIFT_FLAGS = "$(inherited)"; PRODUCT_BUNDLE_IDENTIFIER = org.linphone.phone; @@ -6150,6 +6443,7 @@ }; 22F51EE8107FA53D00F98953 /* Distribution */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 86CA4651CCBB3B93873B787A /* Pods-linphone.distribution.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = "$(inherited)"; ALWAYS_SEARCH_USER_PATHS = NO; @@ -6201,7 +6495,7 @@ "-DENABLE_QRCODE=TRUE", "-DENABLE_SMS_INVITE=TRUE", "$(inherited)", - "-DLINPHONE_SDK_VERSION=\\\"5.3.0-alpha.234+871ded4\\\"", + "-DLINPHONE_SDK_VERSION=\\\"5.3.0-alpha.173+990473d73\\\"", ); OTHER_SWIFT_FLAGS = "$(inherited)"; PRODUCT_BUNDLE_IDENTIFIER = org.linphone.phone; @@ -6395,6 +6689,7 @@ }; 6637AF95288593AF00965733 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = A8E18CF5D897E58D43C78844 /* Pods-CallUITests.debug.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; @@ -6456,6 +6751,7 @@ }; 6637AF96288593AF00965733 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 5A0745F1212040EAEC11A72A /* Pods-CallUITests.release.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; @@ -6503,6 +6799,7 @@ }; 6637AF97288593AF00965733 /* Distribution */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 67039DAF1162F13644E2B622 /* Pods-CallUITests.distribution.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; @@ -6550,6 +6847,7 @@ }; 6637AF98288593AF00965733 /* DistributionAdhoc */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 8E72C2B55BD41E35CBD59144 /* Pods-CallUITests.distributionadhoc.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; @@ -6644,6 +6942,7 @@ }; EA5F25E2232BD3E300475F2E /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 3D777FF83A489472E2530A85 /* Pods-msgNotificationService.debug.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; APPLICATION_EXTENSION_API_ONLY = YES; @@ -6699,6 +6998,7 @@ }; EA5F25E3232BD3E300475F2E /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 2805D857950EB54DE9EC76F3 /* Pods-msgNotificationService.release.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; APPLICATION_EXTENSION_API_ONLY = YES; @@ -6750,6 +7050,7 @@ }; EA5F25E4232BD3E300475F2E /* Distribution */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 1DB171367FBC063A92DFF671 /* Pods-msgNotificationService.distribution.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; APPLICATION_EXTENSION_API_ONLY = YES; @@ -6801,6 +7102,7 @@ }; EA5F25E5232BD3E300475F2E /* DistributionAdhoc */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 44CD55BCF1F7605D70B925D6 /* Pods-msgNotificationService.distributionadhoc.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; APPLICATION_EXTENSION_API_ONLY = YES; @@ -6852,6 +7154,7 @@ }; EA8CB835239F96CA00C330CC /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 4ABDEF5B597BAA50AB49EEE2 /* Pods-msgNotificationContent.debug.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; APPLICATION_EXTENSION_API_ONLY = YES; @@ -6907,6 +7210,7 @@ }; EA8CB836239F96CA00C330CC /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = C8153405A74E7E99A5AE0926 /* Pods-msgNotificationContent.release.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; APPLICATION_EXTENSION_API_ONLY = YES; @@ -6958,6 +7262,7 @@ }; EA8CB837239F96CA00C330CC /* Distribution */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 413401F544CB2668F07E0EA0 /* Pods-msgNotificationContent.distribution.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; APPLICATION_EXTENSION_API_ONLY = YES; @@ -7009,6 +7314,7 @@ }; EA8CB838239F96CA00C330CC /* DistributionAdhoc */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 13DBC5D3188A145CD7240456 /* Pods-msgNotificationContent.distributionadhoc.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; APPLICATION_EXTENSION_API_ONLY = YES;