blob: db86d424538a0114d87be81206130737817d49a0 [file] [log] [blame]
Nicolas Jager998fbd72016-08-08 11:41:28 -04001/**************************************************************************
2* Copyright (C) 2016 by Savoir-faire Linux *
3* Author: Jäger Nicolas <nicolas.jager@savoirfairelinux.com> *
atraczyk6cae7a62016-11-30 14:56:31 -05004* Author: Traczyk Andreas <andreas.traczyk@savoirfairelinux.com> *
Nicolas Jager998fbd72016-08-08 11:41:28 -04005* *
6* This program is free software; you can redistribute it and/or modify *
7* it under the terms of the GNU General Public License as published by *
8* the Free Software Foundation; either version 3 of the License, or *
9* (at your option) any later version. *
10* *
11* This program is distributed in the hope that it will be useful, *
12* but WITHOUT ANY WARRANTY; without even the implied warranty of *
13* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14* GNU General Public License for more details. *
15* *
16* You should have received a copy of the GNU General Public License *
17* along with this program. If not, see <http://www.gnu.org/licenses/>. *
18**************************************************************************/
19#include "pch.h"
20
Nicolas Jager8a85e1f2016-08-15 15:11:06 -040021#include "ContactsViewModel.h"
22#include "MessageTextPage.xaml.h"
Nicolas Jager998fbd72016-08-08 11:41:28 -040023#include "SmartPanel.xaml.h"
24#include "RingConsolePanel.xaml.h"
Nicolas Jagere069c412016-08-15 15:00:17 -040025#include "VideoPage.xaml.h"
atraczykacc4c412016-11-10 22:56:52 -050026#include "PreviewPage.xaml.h"
Nicolas Jager998fbd72016-08-08 11:41:28 -040027#include "WelcomePage.xaml.h"
28
29#include "MainPage.xaml.h"
30
31using namespace RingClientUWP;
32using namespace RingClientUWP::Views;
Nicolas Jager8a85e1f2016-08-15 15:11:06 -040033using namespace RingClientUWP::ViewModel;
Nicolas Jager998fbd72016-08-08 11:41:28 -040034
35using namespace Platform;
Nicolas Jager15861202016-08-12 11:13:05 -040036using namespace Windows::ApplicationModel::Core;
Nicolas Jager998fbd72016-08-08 11:41:28 -040037using namespace Windows::Foundation;
38using namespace Windows::Foundation::Collections;
39using namespace Windows::UI::ViewManagement;
40using namespace Windows::UI::Xaml;
41using namespace Windows::UI::Xaml::Controls;
42using namespace Windows::UI::Xaml::Controls::Primitives;
43using namespace Windows::UI::Core;
44using namespace Windows::UI::Xaml::Data;
45using namespace Windows::UI::Xaml::Input;
46using namespace Windows::UI::Xaml::Interop;
Nicolas Jager998fbd72016-08-08 11:41:28 -040047using namespace Windows::UI::Xaml::Navigation;
48using namespace Windows::ApplicationModel::Activation;
49using namespace Windows::Graphics::Display;
50using namespace Windows::System;
atraczyk49f1b572016-10-27 12:33:28 -040051using namespace Concurrency;
atraczyk6cae7a62016-11-30 14:56:31 -050052using namespace Windows::System::Threading;
Nicolas Jager998fbd72016-08-08 11:41:28 -040053
54MainPage::MainPage()
55{
56 InitializeComponent();
57
atraczyk49f1b572016-10-27 12:33:28 -040058 UserModel::instance->getUserData();
Nicolas Jagerdf0a0672016-10-18 09:25:37 -040059
atraczyk1ddcb5a2016-09-07 16:18:30 -040060 Window::Current->SizeChanged += ref new WindowSizeChangedEventHandler(this, &MainPage::OnResize);
61
Nicolas Jager998fbd72016-08-08 11:41:28 -040062 _welcomeFrame_->Navigate(TypeName(RingClientUWP::Views::WelcomePage::typeid));
63 _smartPanel_->Navigate(TypeName(RingClientUWP::Views::SmartPanel::typeid));
64 _consolePanel_->Navigate(TypeName(RingClientUWP::Views::RingConsolePanel::typeid));
Nicolas Jagere069c412016-08-15 15:00:17 -040065 _videoFrame_->Navigate(TypeName(RingClientUWP::Views::VideoPage::typeid));
atraczykacc4c412016-11-10 22:56:52 -050066 _previewFrame_->Navigate(TypeName(RingClientUWP::Views::PreviewPage::typeid));
Nicolas Jager8a85e1f2016-08-15 15:11:06 -040067 _messageTextFrame_->Navigate(TypeName(RingClientUWP::Views::MessageTextPage::typeid));
68
69 /* connect to delegates */
Nicolas Jagerc551c362016-10-01 19:24:50 -040070 RingD::instance->stateChange += ref new RingClientUWP::StateChange(this, &RingClientUWP::MainPage::OnstateChange);
71 auto smartPanel = dynamic_cast<SmartPanel^>(_smartPanel_->Content);
72 smartPanel->summonMessageTextPage += ref new RingClientUWP::SummonMessageTextPage(this, &RingClientUWP::MainPage::OnsummonMessageTextPage);
73 smartPanel->summonWelcomePage += ref new RingClientUWP::SummonWelcomePage(this, &RingClientUWP::MainPage::OnsummonWelcomePage);
atraczykacc4c412016-11-10 22:56:52 -050074 smartPanel->summonPreviewPage += ref new RingClientUWP::SummonPreviewPage(this, &RingClientUWP::MainPage::OnsummonPreviewPage);
75 smartPanel->hidePreviewPage += ref new RingClientUWP::HidePreviewPage(this, &RingClientUWP::MainPage::OnhidePreviewPage);
Nicolas Jagerc551c362016-10-01 19:24:50 -040076 smartPanel->summonVideoPage += ref new RingClientUWP::SummonVideoPage(this, &RingClientUWP::MainPage::OnsummonVideoPage);
77 auto videoPage = dynamic_cast<VideoPage^>(_videoFrame_->Content);
78 videoPage->pressHangUpCall += ref new RingClientUWP::PressHangUpCall(this, &RingClientUWP::MainPage::OnpressHangUpCall);
Nicolas Jagere72856b2016-10-30 15:06:17 -040079 auto messageTextFrame = dynamic_cast<MessageTextPage^>(_messageTextFrame_->Content);
80 messageTextFrame->closeMessageTextPage += ref new RingClientUWP::CloseMessageTextPage(this, &RingClientUWP::MainPage::OncloseMessageTextPage);
81
atraczyk6cae7a62016-11-30 14:56:31 -050082 dpiChangedtoken = (DisplayInformation::GetForCurrentView()->DpiChanged += ref new TypedEventHandler<DisplayInformation^,
Nicolas Jager7bef1492016-09-14 11:23:29 -040083 Platform::Object^>(this, &MainPage::DisplayProperties_DpiChanged));
atraczyk6290cc32016-10-07 08:47:15 -040084
85 visibilityChangedEventToken = Window::Current->VisibilityChanged +=
Nicolas Jager598aee22016-11-14 09:32:02 -050086 ref new WindowVisibilityChangedEventHandler(this, &MainPage::Application_VisibilityChanged);
atraczyk6cae7a62016-11-30 14:56:31 -050087
88 applicationSuspendingEventToken = Application::Current->Suspending +=
Nicolas Jagercba46f72016-12-02 16:04:50 -050089 ref new SuspendingEventHandler(this, &MainPage::Application_Suspending);
atraczyk6cae7a62016-11-30 14:56:31 -050090 applicationResumingEventToken = Application::Current->Resuming +=
Nicolas Jagercba46f72016-12-02 16:04:50 -050091 ref new EventHandler<Object^>(this, &MainPage::Application_Resuming);
atraczyk6cae7a62016-11-30 14:56:31 -050092
Nicolas Jager026a84b2016-11-28 10:58:22 -050093 RingD::instance->registrationStateErrorGeneric += ref new RingClientUWP::RegistrationStateErrorGeneric(this, &RingClientUWP::MainPage::OnregistrationStateErrorGeneric);
94 RingD::instance->registrationStateRegistered += ref new RingClientUWP::RegistrationStateRegistered(this, &RingClientUWP::MainPage::OnregistrationStateRegistered);
Nicolas Jagercba46f72016-12-02 16:04:50 -050095 RingD::instance->callPlaced += ref new RingClientUWP::CallPlaced(this, &RingClientUWP::MainPage::OncallPlaced);
atraczykaef68d02016-12-06 13:58:24 -050096
Nicolas Jager7f34b772016-12-09 12:25:25 -050097 RingD::instance->setLoadingStatusText += ref new SetLoadingStatusText([this](String^ statusText, String^ color) {
atraczykaef68d02016-12-06 13:58:24 -050098 _loadingStatus_->Text = statusText;
99 auto col = Utils::ColorFromString(color);
100 auto brush = ref new Windows::UI::Xaml::Media::SolidColorBrush(col);
101 _loadingStatus_->Foreground = brush;
102 });
Nicolas Jager998fbd72016-08-08 11:41:28 -0400103}
104
105void
106MainPage::OnKeyDown(KeyRoutedEventArgs^ e)
107{
108 if (e->Key == VirtualKey::F5) {
109 _outerSplitView_->OpenPaneLength = Window::Current->Bounds.Width;
110 _outerSplitView_->IsPaneOpen = !_outerSplitView_->IsPaneOpen;
111 }
Nicolas Jager15861202016-08-12 11:13:05 -0400112}
113
114void RingClientUWP::MainPage::_toggleSmartBoxButton__Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
115{
116 _innerSplitView_->IsPaneOpen = !_innerSplitView_->IsPaneOpen;
atraczyk0cf42d72016-09-06 11:16:37 -0400117 if (_innerSplitView_->IsPaneOpen) {
118 dynamic_cast<SmartPanel^>(_smartPanel_->Content)->setMode(Views::SmartPanel::Mode::Normal);
119 _hamburgerButtonBar_->Width = 320;
120 }
121 else {
122 dynamic_cast<SmartPanel^>(_smartPanel_->Content)->setMode(Views::SmartPanel::Mode::Minimized);
123 _hamburgerButtonBar_->Width = 60;
124 }
Nicolas Jager15861202016-08-12 11:13:05 -0400125}
Nicolas Jager8a85e1f2016-08-15 15:11:06 -0400126
127void
128RingClientUWP::MainPage::showFrame(Windows::UI::Xaml::Controls::Frame^ frame)
129{
130 _navGrid_->SetRow(_welcomeFrame_, 0);
131 _navGrid_->SetRow(_messageTextFrame_, 0);
132 _navGrid_->SetRow(_videoFrame_, 0);
133
134 if (frame == _welcomeFrame_) {
135 _navGrid_->SetRow(_welcomeFrame_, 1);
136 } else if (frame == _videoFrame_) {
137 _navGrid_->SetRow(_videoFrame_, 1);
138 } else if (frame == _messageTextFrame_) {
139 _navGrid_->SetRow(_messageTextFrame_, 1);
Nicolas Jager8a85e1f2016-08-15 15:11:06 -0400140 }
141}
atraczyk61b28422016-08-24 09:25:59 -0400142
143void
144RingClientUWP::MainPage::OnNavigatedTo(NavigationEventArgs ^ e)
145{
atraczyk593926f2016-12-06 16:02:30 -0500146 auto iter = BackgroundTaskRegistration::AllTasks->First();
147 auto hascur = iter->HasCurrent;
148 while (hascur)
149 {
150 auto cur = iter->Current->Value;
151 cur->Unregister(true);
152 hascur = iter->MoveNext();
153 }
154 BackgroundExecutionManager::RequestAccessAsync();
155 BackgroundTaskBuilder^ builder = ref new BackgroundTaskBuilder();
156 builder->Name = "CallRefusalBackgroundTask";
157 //builder->TaskEntryPoint = "RingClientUWP.BackgroundActivity";
158 builder->SetTrigger(ref new ToastNotificationActionTrigger());
159 BackgroundTaskRegistration^ registration = builder->Register();
160
atraczyk9e71a6b2016-11-18 17:00:15 -0500161 RingD::instance->init();
atraczyk593926f2016-12-06 16:02:30 -0500162
atraczyk1ddcb5a2016-09-07 16:18:30 -0400163 showLoadingOverlay(true, false);
164}
165
166void
167RingClientUWP::MainPage::showLoadingOverlay(bool load, bool modal)
168{
169 if (!isLoading && load) {
170 isLoading = true;
171 _loadingOverlay_->Visibility = Windows::UI::Xaml::Visibility::Visible;
172 if (modal) {
173 _fadeInModalStoryboard_->Begin();
174 auto blackBrush = ref new Windows::UI::Xaml::Media::SolidColorBrush(Windows::UI::Colors::Black);
175 _loadingOverlayRect_->Fill = blackBrush;
176 }
177 else {
178 auto whiteBrush = ref new Windows::UI::Xaml::Media::SolidColorBrush(Windows::UI::Colors::White);
179 _loadingOverlayRect_->Fill = whiteBrush;
180 _loadingOverlayRect_->Opacity = 1.0;
181 }
atraczyk1ddcb5a2016-09-07 16:18:30 -0400182 }
atraczykaeb4a5c2016-12-01 19:17:18 -0500183 else if (!load && isLoading) {
atraczyk1ddcb5a2016-09-07 16:18:30 -0400184 isLoading = false;
185 _fadeOutStoryboard_->Begin();
186 }
187}
188
189void
atraczyk1ddcb5a2016-09-07 16:18:30 -0400190RingClientUWP::MainPage::OnResize(Platform::Object^ sender, Windows::UI::Core::WindowSizeChangedEventArgs^ e)
191{
atraczyk1ddcb5a2016-09-07 16:18:30 -0400192}
193
194void
195RingClientUWP::MainPage::DisplayProperties_DpiChanged(DisplayInformation^ sender, Platform::Object^ args)
196{
197 OnResize(nullptr, nullptr);
198}
199
200void
201RingClientUWP::MainPage::hideLoadingOverlay()
202{
203 _loadingOverlay_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
Nicolas Jagerc551c362016-10-01 19:24:50 -0400204}
205
206void RingClientUWP::MainPage::OnsummonMessageTextPage()
207{
208 auto messageTextPage = dynamic_cast<MessageTextPage^>(_messageTextFrame_->Content);
209 messageTextPage->updatePageContent();
210 showFrame(_messageTextFrame_);
211
212}
213
214
215void RingClientUWP::MainPage::OnsummonWelcomePage()
216{
217 showFrame(_welcomeFrame_);
218}
219
atraczykacc4c412016-11-10 22:56:52 -0500220void RingClientUWP::MainPage::OnsummonPreviewPage()
221{
atraczykc25f69d2016-11-22 19:55:16 -0500222 MSG_("Show Settings Preview");
atraczykacc4c412016-11-10 22:56:52 -0500223 _previewFrame_->Visibility = VIS::Visible;
224}
225
226void RingClientUWP::MainPage::OnhidePreviewPage()
227{
atraczykc25f69d2016-11-22 19:55:16 -0500228 MSG_("Hide Settings Preview");
atraczykacc4c412016-11-10 22:56:52 -0500229 _previewFrame_->Visibility = VIS::Collapsed;
230}
Nicolas Jagerc551c362016-10-01 19:24:50 -0400231
232void RingClientUWP::MainPage::OnsummonVideoPage()
233{
Nicolas Jagercba46f72016-12-02 16:04:50 -0500234 auto item = SmartPanelItemsViewModel::instance->_selectedItem;
235 auto videoPage = dynamic_cast<VideoPage^>(_videoFrame_->Content);;
236
237 if (item) {
238 switch (item->_callStatus) {
239 case CallStatus::IN_PROGRESS:
240 videoPage->screenVideo(true);
241 break;
242 case CallStatus::PEER_PAUSED:
243 case CallStatus::PAUSED:
244 videoPage->screenVideo(false);
245 break;
246 }
247 }
248
Nicolas Jagerc551c362016-10-01 19:24:50 -0400249 videoPage->updatePageContent();
250 showFrame(_videoFrame_);
251}
252
253
254void RingClientUWP::MainPage::OnpressHangUpCall()
255{
256 OnsummonMessageTextPage();
257}
258
Nicolas Jagerc551c362016-10-01 19:24:50 -0400259void RingClientUWP::MainPage::OnstateChange(Platform::String ^callId, RingClientUWP::CallStatus state, int code)
260{
261 auto item = SmartPanelItemsViewModel::instance->_selectedItem;
262
263 switch (state) {
264 /* send the user to the peer's message text page */
atraczyk85e12312016-11-03 10:31:23 -0400265 case CallStatus::ENDED:
Nicolas Jagerc551c362016-10-01 19:24:50 -0400266 {
267 if (item)
268 OnsummonMessageTextPage();
269 break;
270 }
Nicolas Jagerc551c362016-10-01 19:24:50 -0400271 default:
272 break;
273 }
274
275}
atraczykacc4c412016-11-10 22:56:52 -0500276
atraczyk14ba30c2016-09-22 18:31:59 -0400277void
278MainPage::Application_Suspending(Object^, Windows::ApplicationModel::SuspendingEventArgs^ e)
279{
atraczykc25f69d2016-11-22 19:55:16 -0500280 MSG_("Application_Suspending");
atraczyk6cae7a62016-11-30 14:56:31 -0500281 auto deferral = e->SuspendingOperation->GetDeferral();
atraczyk890921f2016-12-02 16:26:31 -0500282 Video::VideoManager::instance->captureManager()->CleanupCameraAsync();
atraczyk6cae7a62016-11-30 14:56:31 -0500283 MSG_("Hang up calls...");
284 RingD::instance->deinit();
285 deferral->Complete();
atraczyk14ba30c2016-09-22 18:31:59 -0400286}
287
288void
289MainPage::Application_VisibilityChanged(Object^ sender, VisibilityChangedEventArgs^ e)
290{
atraczykacc4c412016-11-10 22:56:52 -0500291 auto vcm = Video::VideoManager::instance->captureManager();
atraczyk6290cc32016-10-07 08:47:15 -0400292 if (e->Visible) {
atraczykc25f69d2016-11-22 19:55:16 -0500293 MSG_("->Visible");
atraczykc8f949a2016-10-07 11:34:03 -0400294 bool isInCall = false;
295 for (auto item : SmartPanelItemsViewModel::instance->itemsList) {
296 if (item->_callId && item->_callStatus == CallStatus::IN_PROGRESS) {
297 isInCall = true;
298 break;
299 }
300 }
301 if (isInCall) {
302 /*if (RingD::instance->currentCallId)
303 RingD::instance->unPauseCall(RingD::instance->currentCallId);*/
atraczykacc4c412016-11-10 22:56:52 -0500304 vcm->InitializeCameraAsync(false);
305 vcm->videoFrameCopyInvoker->Start();
306 }
307 else if (vcm->isSettingsPreviewing) {
308 vcm->CleanupCameraAsync()
Nicolas Jagera4d062a2016-11-23 13:29:44 -0500309 .then([=](task<void> cleanupCameraTask) {
atraczyk9e71a6b2016-11-18 17:00:15 -0500310 try {
311 cleanupCameraTask.get();
312 CoreApplication::MainView->CoreWindow->Dispatcher->RunAsync(
313 CoreDispatcherPriority::High, ref new DispatchedHandler([=]()
314 {
315 vcm->InitializeCameraAsync(true);
316 }));
317 }
318 catch (Exception^ e) {
319 WriteException(e);
320 }
atraczykacc4c412016-11-10 22:56:52 -0500321 });
atraczykc8f949a2016-10-07 11:34:03 -0400322 }
atraczyk14ba30c2016-09-22 18:31:59 -0400323 }
atraczyk6290cc32016-10-07 08:47:15 -0400324 else {
atraczykc25f69d2016-11-22 19:55:16 -0500325 MSG_("->Invisible");
atraczykc8f949a2016-10-07 11:34:03 -0400326 bool isInCall = false;
327 for (auto item : SmartPanelItemsViewModel::instance->itemsList) {
328 if (item->_callId && item->_callStatus == CallStatus::IN_PROGRESS) {
329 isInCall = true;
330 RingD::instance->currentCallId = item->_callId;
331 break;
332 }
333 }
334 if (isInCall) {
atraczykacc4c412016-11-10 22:56:52 -0500335 // TODO
atraczykc8f949a2016-10-07 11:34:03 -0400336 /*if (RingD::instance->currentCallId) {
atraczykc25f69d2016-11-22 19:55:16 -0500337 MSG_("Pausing call: " + RingD::instance->currentCallId);
atraczykc8f949a2016-10-07 11:34:03 -0400338 RingD::instance->pauseCall(RingD::instance->currentCallId);
339 }*/
atraczykacc4c412016-11-10 22:56:52 -0500340 if (vcm->isPreviewing) {
341 vcm->StopPreviewAsync();
342 if (vcm->captureTaskTokenSource)
343 vcm->captureTaskTokenSource->cancel();
344 vcm->videoFrameCopyInvoker->Stop();
atraczykc8f949a2016-10-07 11:34:03 -0400345 }
346 }
atraczykacc4c412016-11-10 22:56:52 -0500347 else if (vcm->isSettingsPreviewing) {
348 vcm->StopPreviewAsync();
349 }
atraczyk14ba30c2016-09-22 18:31:59 -0400350 }
Nicolas Jager083b3ae2016-10-04 08:46:19 -0400351}
352
atraczyk6290cc32016-10-07 08:47:15 -0400353void MainPage::Application_Resuming(Object^, Object^)
354{
atraczykc25f69d2016-11-22 19:55:16 -0500355 MSG_("Application_Resuming");
atraczyk6290cc32016-10-07 08:47:15 -0400356}
357
Nicolas Jagere72856b2016-10-30 15:06:17 -0400358void RingClientUWP::MainPage::OncloseMessageTextPage()
359{
Nicolas Jager8fb42962016-12-11 19:51:51 -0500360 SmartPanelItemsViewModel::instance->_selectedItem = nullptr;
361 showFrame(_welcomeFrame_);
Nicolas Jagere72856b2016-10-30 15:06:17 -0400362}
Nicolas Jager026a84b2016-11-28 10:58:22 -0500363
364
365void RingClientUWP::MainPage::OnregistrationStateErrorGeneric(const std::string& accountId)
366{
367 showLoadingOverlay(false, false);
368}
369
370
371void RingClientUWP::MainPage::OnregistrationStateRegistered()
372{
373 showLoadingOverlay(false, false);
Nicolas Jagerc680e4f2016-12-06 16:02:23 -0500374
375 /* do not connect those delegates before initial registration on dht is fine.
376 Otherwise your going to mess with the wizard */
377 RingD::instance->nameRegistred += ref new RingClientUWP::NameRegistred(this, &RingClientUWP::MainPage::OnnameRegistred);
378 RingD::instance->volatileDetailsChanged += ref new RingClientUWP::VolatileDetailsChanged(this, &RingClientUWP::MainPage::OnvolatileDetailsChanged);
Nicolas Jager026a84b2016-11-28 10:58:22 -0500379}
Nicolas Jagercba46f72016-12-02 16:04:50 -0500380
381
382void RingClientUWP::MainPage::OncallPlaced(Platform::String ^callId)
383{
384 showFrame(_welcomeFrame_);
385}
Nicolas Jagerc680e4f2016-12-06 16:02:23 -0500386
387
388void RingClientUWP::MainPage::OnnameRegistred(bool status)
389{
390 showLoadingOverlay(false, false);
391}
392
393
394void RingClientUWP::MainPage::OnvolatileDetailsChanged(const std::string &accountId, const std::map<std::string, std::string, std::less<std::string>, std::allocator<std::pair<const std::string, std::string>>> &details)
395{
396 showLoadingOverlay(false, false);
397}