diff --git a/Classes/Swift/Voip/Theme/VoipTexts.swift b/Classes/Swift/Voip/Theme/VoipTexts.swift index cc88a086f..204dc2057 100644 --- a/Classes/Swift/Voip/Theme/VoipTexts.swift +++ b/Classes/Swift/Voip/Theme/VoipTexts.swift @@ -38,6 +38,7 @@ import UIKit @objc static let call_context_action_pause = NSLocalizedString("Pause call",comment:"") @objc static let call_context_action_resume = NSLocalizedString("Resume call",comment:"") @objc static let call_context_action_transfer = NSLocalizedString("Transfer call",comment:"") + @objc static let call_context_action_attended_transfer = NSLocalizedString("Attended transfer",comment:"") @objc static let call_error_declined = NSLocalizedString("Call has been declined",comment:"") @objc static let call_error_generic = NSLocalizedString("Error: %s",comment:"") @objc static let call_error_incompatible_media_params = NSLocalizedString("Incompatible media parameters",comment:"") diff --git a/Classes/Swift/Voip/Views/Fragments/VoipExtraButtonsView.swift b/Classes/Swift/Voip/Views/Fragments/VoipExtraButtonsView.swift index 5b70663d7..c49729aa6 100644 --- a/Classes/Swift/Voip/Views/Fragments/VoipExtraButtonsView.swift +++ b/Classes/Swift/Voip/Views/Fragments/VoipExtraButtonsView.swift @@ -84,11 +84,15 @@ class VoipExtraButtonsView: UIStackView { row2.distribution = .fillEqually row2.alignment = .center - let transfer = VoipExtraButton(text: VoipTexts.call_action_transfer_call, buttonTheme: VoipTheme.call_action("voip_call_forward"),onClickAction: { - let view: DialerView = self.VIEW(DialerView.compositeViewDescription()); - view.setAddress("") - CallManager.instance().nextCallIsTransfer = true - PhoneMainView.instance().changeCurrentView(view.compositeViewDescription()) + var transfer = VoipExtraButton(text: CallsViewModel.shared.inactiveCallsCount.value! < 1 ? VoipTexts.call_action_transfer_call : VoipTexts.call_context_action_attended_transfer, buttonTheme: VoipTheme.call_action("voip_call_forward"),onClickAction: { + if CallsViewModel.shared.inactiveCallsCount.value! < 1 { + let view: DialerView = self.VIEW(DialerView.compositeViewDescription()); + view.setAddress("") + CallManager.instance().nextCallIsTransfer = true + PhoneMainView.instance().changeCurrentView(view.compositeViewDescription()) + }else{ + self.attendedTransfer() + } }) row2.addArrangedSubview(transfer) @@ -127,6 +131,9 @@ class VoipExtraButtonsView: UIStackView { addcall.isHidden = isIn == true } + CallsViewModel.shared.inactiveCallsCount.readCurrentAndObserve { title in + transfer.setTitle(title! < 1 ? VoipTexts.call_action_transfer_call : VoipTexts.call_context_action_attended_transfer, for: .normal) + } } func refresh() { @@ -134,6 +141,37 @@ class VoipExtraButtonsView: UIStackView { CallsViewModel.shared.inactiveCallsCount.notifyValue() } - + func attendedTransfer() { + var core = CallManager.instance().lc + var currentCall = core?.currentCall + if (currentCall == nil) { + Log.e("[Call Controls] Can't do an attended transfer without a current call") + return + } + + if let callsNb = core?.callsNb, callsNb <= 1 { + Log.e("[Call Controls] Need at least two calls to do an attended transfer") + return + } + + var callToTransferTo = core!.calls.last { call in + call.state == Call.State.Paused + } + + if (callToTransferTo == nil) { + Log.e("[Call Controls] Couldn't find a call in Paused state to transfer current call to") + return + } + + Log.i( + "[Call Controls] Doing an attended transfer between active call [${currentCall.remoteAddress.asStringUriOnly()}] and paused call [${callToTransferTo.remoteAddress.asStringUriOnly()}]" + ) + + do{ + try callToTransferTo?.transferToAnother(dest: currentCall!) + }catch{ + Log.e("[Call Controls] Attended transfer failed!") + } + } } diff --git a/Resources/fr.lproj/Localizable.strings b/Resources/fr.lproj/Localizable.strings index e34aa7ade..bae2c8070 100644 Binary files a/Resources/fr.lproj/Localizable.strings and b/Resources/fr.lproj/Localizable.strings differ