Add broadcast mode in conference scheduling views

This commit is contained in:
Benoit Martins 2023-08-17 16:57:53 +02:00 committed by QuentinArguillere
parent 04adc613a6
commit 8c0f52c28e
15 changed files with 858 additions and 29 deletions

View file

@ -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)

View file

@ -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"))

View file

@ -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 <http://www.gnu.org/licenses/>.
*/
import Foundation
struct Mode : Comparable {
static func < (lhs: Mode, rhs: Mode) -> Bool {
return lhs.value < rhs.value
}
let value: Int
let display: String
}

View file

@ -30,6 +30,9 @@ class ConferenceSchedulingViewModel {
let subject = MutableLiveData<String>()
let description = MutableLiveData<String>()
let mode = MutableLiveData<Int>()
static let modeList: [Mode] = computeModeList()
let scheduleForLater = MutableLiveData<Bool>()
let scheduledDate = MutableLiveData<Date>()
let scheduledTime = MutableLiveData<Date>()
@ -55,6 +58,7 @@ class ConferenceSchedulingViewModel {
let continueEnabled: MutableLiveData<Bool> = 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
}
}
}

View file

@ -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()
}
}

View file

@ -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!)

View file

@ -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"))

View file

@ -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:"")

View file

@ -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),

View file

@ -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 <http://www.gnu.org/licenses/>.
*/
import linphonesw
import Foundation
class ConferenceSpeakerData {
var conference:Conference
var speaker:Participant
let isAdmin = MutableLiveData<Bool>()
let isMeAdmin = MutableLiveData<Bool>()
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()
}
}

View file

@ -36,6 +36,7 @@ class ConferenceViewModel {
let conference = MutableLiveData<Conference>()
let conferenceCreationPending = MutableLiveData<Bool>()
let conferenceSpeakers = MutableLiveData<[ConferenceSpeakerData]>()
let conferenceParticipants = MutableLiveData<[ConferenceParticipantData]>()
let conferenceParticipantDevices = MutableLiveData<[ConferenceParticipantDeviceData]>()
let conferenceDisplayMode = MutableLiveData<ConferenceDisplayMode>()

View file

@ -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) {

View file

@ -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 <http://www.gnu.org/licenses/>.
*/
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())
}
}

View file

@ -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 <http://www.gnu.org/licenses/>.
*/
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")
}
}

View file

@ -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 = "<group>"; };
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 = "<group>"; };
1D3623250D0F684500981E51 /* LinphoneAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LinphoneAppDelegate.m; sourceTree = "<group>"; };
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 = "<group>"; };
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 = "<group>"; };
2214EB7912F846B1002A5394 /* UICallButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UICallButton.m; sourceTree = "<group>"; };
@ -1102,16 +1112,22 @@
24BFAA9C209B062F004F47A7 /* contacts_sip_selected@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "contacts_sip_selected@2x.png"; sourceTree = "<group>"; };
24BFAA9D209B0630004F47A7 /* linphone_logo@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "linphone_logo@2x.png"; sourceTree = "<group>"; };
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 = "<group>"; };
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 = "<group>"; };
32CA4F630368D1EE00C91783 /* linphone_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = linphone_Prefix.pch; sourceTree = "<group>"; };
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 = "<group>"; };
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 = "<group>"; };
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 = "<group>"; };
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 = "<group>"; };
570742571D5A0691004B9C84 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/ShopView.xib; sourceTree = "<group>"; };
5707425F1D5A09B8004B9C84 /* ShopView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ShopView.m; sourceTree = "<group>"; };
570742601D5A09B8004B9C84 /* ShopView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ShopView.h; sourceTree = "<group>"; };
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 = "<group>"; };
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 = "<group>"; };
@ -1800,8 +1816,14 @@
66EADB022A939487002DDCEE /* zh_CN */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = zh_CN; path = zh_CN.lproj/Localizable.strings; sourceTree = "<group>"; };
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 = "<group>"; };
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 = "<group>"; };
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 = "<group>"; };
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 = "<group>"; };
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 = "<group>"; };
8C1A1F7C1FA331D40064BE00 /* libsoci_sqlite3.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libsoci_sqlite3.a; path = "liblinphone-sdk/apple-darwin/lib/libsoci_sqlite3.a"; sourceTree = "<group>"; };
8C23BCB71D82AAC3005F19BB /* linphone.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = linphone.entitlements; sourceTree = "<group>"; };
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 = "<group>"; };
8CF25D9B1F9F76BC00BEA0C1 /* chat_group_informations.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chat_group_informations.png; sourceTree = "<group>"; };
8CF25D9C1F9F76BD00BEA0C1 /* chat_group_informations@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "chat_group_informations@2x.png"; sourceTree = "<group>"; };
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 = "<group>"; };
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 = "<group>"; };
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 = "<group>"; };
C61B1BF12667D075001A4E4A /* menu_security_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = menu_security_default.png; sourceTree = "<group>"; };
C61B1BF32667D202001A4E4A /* more_menu_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = more_menu_default.png; sourceTree = "<group>"; };
C61B1BF62667EC6B001A4E4A /* ephemeral_messages_color_A.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = ephemeral_messages_color_A.png; sourceTree = "<group>"; };
@ -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 = "<group>"; };
C6F55644287CC69F0056E213 /* voip_meeting_schedule.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_meeting_schedule.png; sourceTree = "<group>"; };
C6F55646287CCFB60056E213 /* menu_voip_meeting_schedule.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = menu_voip_meeting_schedule.png; sourceTree = "<group>"; };
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 = "<group>"; };
C90FAA7615AF54E6002091CB /* HistoryDetailsView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HistoryDetailsView.h; sourceTree = "<group>"; };
C90FAA7715AF54E6002091CB /* HistoryDetailsView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HistoryDetailsView.m; sourceTree = "<group>"; };
C9B3A6FD15B485DB006F52EE /* Utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Utils.h; path = Utils/Utils.h; sourceTree = "<group>"; };
@ -2240,8 +2267,13 @@
D7A7544F29507038005C9D4A /* CustomAlertController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomAlertController.swift; sourceTree = "<group>"; };
D7C6DE812948CF3100756E03 /* DropDownCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DropDownCell.swift; sourceTree = "<group>"; };
D7C6DE822948CF3100756E03 /* DropDownCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = DropDownCell.xib; sourceTree = "<group>"; };
D7CBC0F62A8E1669009182D8 /* Mode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Mode.swift; sourceTree = "<group>"; };
D7CBC0FA2A8E3D1E009182D8 /* SpeakersListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpeakersListView.swift; sourceTree = "<group>"; };
D7CBC0FC2A8E3D3F009182D8 /* VoipSpeakerCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VoipSpeakerCell.swift; sourceTree = "<group>"; };
D7CBC0FE2A8E3E11009182D8 /* ConferenceSpeakerData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConferenceSpeakerData.swift; sourceTree = "<group>"; };
D7CF13722A2E225200D92165 /* emoji.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = emoji.png; sourceTree = "<group>"; };
D7DA18702A02598700FABA0D /* TextViewer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextViewer.swift; sourceTree = "<group>"; };
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 = "<group>"; };
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 = "<group>"; };
EA5F25DD232BD3E200475F2E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
@ -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 = "<group>";
@ -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 = "<group>";
@ -3511,6 +3567,7 @@
C63F719F285A24B10066163B /* ScheduledConferenceData.swift */,
C63F71A0285A24B10066163B /* TimeZoneData.swift */,
C63F71A1285A24B10066163B /* Duration.swift */,
D7CBC0F62A8E1669009182D8 /* Mode.swift */,
);
path = Data;
sourceTree = "<group>";
@ -3620,6 +3677,7 @@
C63F71CD285A24B10066163B /* ConferenceParticipantData.swift */,
C63F71CE285A24B10066163B /* ConferenceParticipantDeviceData.swift */,
C63F71CF285A24B10066163B /* CallData.swift */,
D7CBC0FE2A8E3E11009182D8 /* ConferenceSpeakerData.swift */,
);
path = ViewModels;
sourceTree = "<group>";
@ -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 = "<group>";
};
D7CBC0F92A8E3CF4009182D8 /* SpeakersList */ = {
isa = PBXGroup;
children = (
D7CBC0FA2A8E3D1E009182D8 /* SpeakersListView.swift */,
D7CBC0FC2A8E3D3F009182D8 /* VoipSpeakerCell.swift */,
);
path = SpeakersList;
sourceTree = "<group>";
};
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;