diff --git a/Globals.h b/Globals.h index 1f4755b8fd664e13451466ef5e7daf9776fb8c1e..18766cb24ff59e4caba372dc95981c83cc464d8e 100644 --- a/Globals.h +++ b/Globals.h @@ -1,6 +1,15 @@ namespace RingClientUWP { /* public enumerations. */ -public enum class CallStatus { NONE, INCOMING_RINGING, OUTGOING_RINGING, SEARCHING, IN_PROGRESS, ENDED, TERMINATING }; +public enum class CallStatus { + NONE, + INCOMING_RINGING, + OUTGOING_RINGING, + SEARCHING, + IN_PROGRESS, + PAUSED, + ENDED, + TERMINATING +}; } \ No newline at end of file diff --git a/MainPage.xaml.cpp b/MainPage.xaml.cpp index 666c07cb380a2e2d8a2c492eff4eec882b23a598..96ab01177c130593040a24d5aa538726c998307b 100644 --- a/MainPage.xaml.cpp +++ b/MainPage.xaml.cpp @@ -295,11 +295,44 @@ MainPage::Application_VisibilityChanged(Object^ sender, VisibilityChangedEventAr { if (e->Visible) { WriteLine("->Visible"); - //Video::VideoManager::instance-> + auto isPreviewing = Video::VideoManager::instance->captureManager()->isPreviewing; + bool isInCall = false; + for (auto item : SmartPanelItemsViewModel::instance->itemsList) { + if (item->_callId && item->_callStatus == CallStatus::IN_PROGRESS) { + isInCall = true; + break; + } + } + if (isInCall) { + /*if (RingD::instance->currentCallId) + RingD::instance->unPauseCall(RingD::instance->currentCallId);*/ + Video::VideoManager::instance->captureManager()->InitializeCameraAsync(); + Video::VideoManager::instance->captureManager()->videoFrameCopyInvoker->Start(); + } } else { WriteLine("->Invisible"); - //Video::VideoManager::instance->captureManager()->CleanupCameraAsync(); + auto isPreviewing = Video::VideoManager::instance->captureManager()->isPreviewing; + bool isInCall = false; + for (auto item : SmartPanelItemsViewModel::instance->itemsList) { + if (item->_callId && item->_callStatus == CallStatus::IN_PROGRESS) { + isInCall = true; + RingD::instance->currentCallId = item->_callId; + break; + } + } + if (isInCall) { + /*if (RingD::instance->currentCallId) { + WriteLine("Pausing call: " + RingD::instance->currentCallId); + RingD::instance->pauseCall(RingD::instance->currentCallId); + }*/ + if (isPreviewing) { + Video::VideoManager::instance->captureManager()->StopPreviewAsync(); + if (Video::VideoManager::instance->captureManager()->captureTaskTokenSource) + Video::VideoManager::instance->captureManager()->captureTaskTokenSource->cancel(); + Video::VideoManager::instance->captureManager()->videoFrameCopyInvoker->Stop(); + } + } } } @@ -347,11 +380,7 @@ MainPage::BeginExtendedExecution() Video::VideoManager::instance->captureManager()->CleanupCameraAsync() .then([](){ WriteLine("Hang up calls..."); - for (auto item : SmartPanelItemsViewModel::instance->itemsList) { - if (item->_callId && item->_callStatus != CallStatus::NONE) { - DRing::hangUp(Utils::toString(item->_callId)); - } - } + DRing::fini(); }); break; diff --git a/RingD.cpp b/RingD.cpp index 6a688f311342461ea4310de76585a400446bd39a..63e9a454efc6967da8f3f5581ebb0d3f1c2c3f66 100644 --- a/RingD.cpp +++ b/RingD.cpp @@ -204,6 +204,18 @@ void RingClientUWP::RingD::hangUpCall2(String ^ callId) tasksList_.push(ref new RingD::Task(Request::HangUpCall, callId)); } +void RingClientUWP::RingD::pauseCall(String ^ callId) +{ + MSG_("$1 pauseCall : " + Utils::toString(callId)); + tasksList_.push(ref new RingD::Task(Request::PauseCall, callId)); +} + +void RingClientUWP::RingD::unPauseCall(String ^ callId) +{ + MSG_("$1 unPauseCall : " + Utils::toString(callId)); + tasksList_.push(ref new RingD::Task(Request::UnPauseCall, callId)); +} + void RingClientUWP::RingD::askToRefreshKnownDevices(String^ accountId) { auto task = ref new RingD::Task(Request::GetKnownDevices); @@ -422,10 +434,6 @@ RingClientUWP::RingD::startDaemon() ([this](const std::string &id, const std::string &shmPath, bool isMixer) { MSG_("<DecodingStopped>"); MSG_("Removing renderer id:" + id); - /*auto Id = Utils::toPlatformString(id); - auto renderer = Video::VideoManager::instance->rendererManager()->renderer(Id); - if (renderer) - renderer->isRendering = false;*/ Video::VideoManager::instance->rendererManager()->removeRenderer(Utils::toPlatformString(id)); }) }; @@ -534,6 +542,7 @@ RingD::RingD() { localFolder_ = Utils::toString(ApplicationData::Current->LocalFolder->Path); callIdsList_ = ref new Vector<String^>(); + currentCallId = nullptr; } void @@ -583,6 +592,16 @@ RingD::dequeueTasks() DRing::hangUp(Utils::toString(callId)); } break; + case Request::PauseCall: + { + DRing::hold(Utils::toString(task->_callId)); + } + break; + case Request::UnPauseCall: + { + DRing::unhold(Utils::toString(task->_callId)); + } + break; case Request::RegisterDevice: { auto pin = Utils::toString(_pin); diff --git a/RingD.h b/RingD.h index bcf6cdc123f5e453d7a5c634319359ba0de4769b..f78355bae9e9eba585d34f45a7b51505949d0bcc 100644 --- a/RingD.h +++ b/RingD.h @@ -90,12 +90,15 @@ internal: Vector<String^>^ translateKnownRingDevices(const std::map<std::string, std::string> devices); void hangUpCall2(String^ callId); + void pauseCall(String ^ callId); + void unPauseCall(String ^ callId); void askToRefreshKnownDevices(String^ accountId); void askToExportOnRing(String^ accountId, String^ password); /* TODO : move members */ ///bool hasConfig; // replaced by startingStatus std::string accountName; + String ^ currentCallId; // to save ongoing call id during visibility change /* events */ event IncomingCall^ incomingCall; @@ -116,6 +119,8 @@ private: AcceptIncommingCall, CancelOutGoingCall, HangUpCall, + PauseCall, + UnPauseCall, RegisterDevice, GetKnownDevices, ExportOnRing diff --git a/VideoPage.xaml.cpp b/VideoPage.xaml.cpp index df268a506dd3d74881c0f23e3bc47e32c08fbe51..783f4638e6081409e729613975e4fa7bb120c3e0 100644 --- a/VideoPage.xaml.cpp +++ b/VideoPage.xaml.cpp @@ -208,6 +208,12 @@ void RingClientUWP::Views::VideoPage::_btnHangUp__Tapped(Platform::Object^ sende void RingClientUWP::Views::VideoPage::_btnPause__Tapped(Platform::Object^ sender, Windows::UI::Xaml::Input::TappedRoutedEventArgs^ e) { + /*auto item = SmartPanelItemsViewModel::instance->_selectedItem; + if (item->_callStatus == CallStatus::IN_PROGRESS) + RingD::instance->pauseCall(item->_callId); + else if (item->_callStatus == CallStatus::PAUSED) + RingD::instance->unPauseCall(item->_callId);*/ + pauseCall(); }