blob: 0557bd6f20e073c0c2601735be4abecfaa802292 [file] [log] [blame]
Nicolas Jager38f15642016-09-01 09:45:58 -04001/***************************************************************************
2 * Copyright (C) 2016 by Savoir-faire Linux *
3 * Author: Jäger Nicolas <nicolas.jager@savoirfairelinux.com> *
4 * Author: Traczyk Andreas <andreas.traczyk@savoirfairelinux.com> *
5 * *
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"
Nicolas Jager7c409f32016-09-08 09:35:16 -040020#include <string> // move it
Nicolas Jager38f15642016-09-01 09:45:58 -040021#include "SmartPanel.xaml.h"
22
23using namespace Platform;
24
25using namespace RingClientUWP;
Nicolas Jager7c409f32016-09-08 09:35:16 -040026using namespace RingClientUWP::Controls;
Nicolas Jager38f15642016-09-01 09:45:58 -040027using namespace RingClientUWP::Views;
28using namespace RingClientUWP::ViewModel;
29using namespace Windows::Media::Capture;
30using namespace Windows::UI::Xaml;
31using namespace Windows::Storage;
32using namespace Windows::UI::Xaml::Media::Imaging;
33using namespace Windows::UI::Xaml::Shapes;
34using namespace Windows::UI::Xaml::Media;
35using namespace Concurrency;
36using namespace Windows::Foundation;
37
Nicolas Jagerf6a10322016-09-06 08:17:49 -040038using namespace Windows::ApplicationModel::Core;
39using namespace Windows::Storage;
40using namespace Windows::UI::Core;
41
Nicolas Jager38f15642016-09-01 09:45:58 -040042SmartPanel::SmartPanel()
43{
44 InitializeComponent();
45
Nicolas Jager7c409f32016-09-08 09:35:16 -040046 _accountsList_->ItemsSource = AccountsViewModel::instance->accountsList;
47
48 /* populate the smartlist */
49 smartPanelItemsList_ = ref new Vector<SmartPanelItem^>();
50 _smartList_->ItemsSource = smartPanelItemsList_;
51
atraczyk2425ddd2016-09-01 13:16:22 -040052 /* connect delegates */
Nicolas Jager38f15642016-09-01 09:45:58 -040053 Configuration::UserPreferences::instance->selectIndex += ref new SelectIndex([this](int index) {
54 _accountsList_->SelectedIndex = index;
55 });
atraczyk2425ddd2016-09-01 13:16:22 -040056 Configuration::UserPreferences::instance->loadProfileImage += ref new LoadProfileImage([this]() {
57 StorageFolder^ localfolder = ApplicationData::Current->LocalFolder;
58 String^ image_path = localfolder->Path + "\\.profile\\profile_image.png";
59 auto uri = ref new Windows::Foundation::Uri(image_path);
60 _selectedAccountAvatar_->ImageSource = ref new BitmapImage(uri);
61 });
atraczyk196936e2016-09-02 15:31:53 -040062 AccountsViewModel::instance->updateScrollView += ref new UpdateScrollView([this]() {
63 _accountsListScrollView_->UpdateLayout();
64 _accountsListScrollView_->ScrollToVerticalOffset(_accountsListScrollView_->ScrollableHeight);
65 });
Nicolas Jager7c409f32016-09-08 09:35:16 -040066 CallsViewModel::instance->callRecieved += ref new RingClientUWP::CallRecieved([&](
67 Call^ call) {
68 auto from = call->from;
69 auto contact = ContactsViewModel::instance->findContactByName(from);
Nicolas Jager38f15642016-09-01 09:45:58 -040070
Nicolas Jager7c409f32016-09-08 09:35:16 -040071 if (contact == nullptr)
72 contact = ContactsViewModel::instance->addNewContact(from, from); // contact checked inside addNewContact.
73
74 if (contact == nullptr) {
75 ERR_("contact not handled!");
76 return;
77 }
78
79 auto item = findItem(contact);
80 item->_call = call;
81 });
82 RingD::instance->stateChange += ref new StateChange([this](String^ callId, String^ state, int code) {
83 auto call = CallsViewModel::instance->findCall(callId);
84
85 if (call == nullptr)
86 return;
87
88 auto item = findItem(call);
89
90 if (!item) {
91 WNG_("item not found");
92 return;
93 }
94
95 if (call->state == "incoming call")
Nicolas Jager5750df02016-09-13 11:20:33 -040096 item->_IncomingCallBar = Windows::UI::Xaml::Visibility::Visible;
Nicolas Jager7c409f32016-09-08 09:35:16 -040097
Nicolas Jager5750df02016-09-13 11:20:33 -040098 if (call->state == "CURRENT") {
99 item->_IncomingCallBar = Windows::UI::Xaml::Visibility::Collapsed;
100 item->_OutGoingCallBar = Windows::UI::Xaml::Visibility::Collapsed;
101 }
Nicolas Jager7c409f32016-09-08 09:35:16 -0400102
Nicolas Jager5750df02016-09-13 11:20:33 -0400103 if (call->state == "") {
104 item->_IncomingCallBar = Windows::UI::Xaml::Visibility::Collapsed;
105 item->_OutGoingCallBar = Windows::UI::Xaml::Visibility::Collapsed;
106 }
Nicolas Jager7c409f32016-09-08 09:35:16 -0400107 });
108
109
110 ContactsViewModel::instance->contactAdded += ref new ContactAdded([this](Contact^ contact) {
111 auto smartPanelItem = ref new SmartPanelItem();
112 smartPanelItem->_contact = contact;
113 smartPanelItemsList_->Append(smartPanelItem);
114 });
115
Nicolas Jager5750df02016-09-13 11:20:33 -0400116 RingD::instance->calling += ref new RingClientUWP::Calling([&](
117 Call^ call) {
118 auto from = call->from;
119 auto contact = ContactsViewModel::instance->findContactByName(from);
120
121 if (contact == nullptr) {
122 WNG_("cannot call the peer, contact not found!");
123 return;
124 }
125
126 auto item = findItem(contact);
127
128 if (item == nullptr) {
129 WNG_("cannot call the peer, smart panel item not found!");
130 return;
131 }
132
133 /* use underscore to differentiate states from UI, we need to think more about states management */
134 call->state = "_calling_";
135
136 item->_OutGoingCallBar = Windows::UI::Xaml::Visibility::Visible;
137 item->_call = call;
138 });
139
Nicolas Jager38f15642016-09-01 09:45:58 -0400140}
141
142void
143RingClientUWP::Views::SmartPanel::updatePageContent()
144{
145 auto account = AccountsViewModel::instance->selectedAccount;
146 if (!account)
147 return;
148
149 Configuration::UserPreferences::instance->PREF_ACCOUNT_INDEX = _accountsList_->SelectedIndex;
150 Configuration::UserPreferences::instance->save();
151 _selectedAccountName_->Text = account->name_;
152}
153
154void RingClientUWP::Views::SmartPanel::_accountsMenuButton__Checked(Object^ sender, RoutedEventArgs^ e)
155{
156 _shareMenuButton_->IsChecked = false;
157 _accountsMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Visible;
158 _accountCreationMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
159}
160
161void RingClientUWP::Views::SmartPanel::_accountsMenuButton__Unchecked(Object^ sender, RoutedEventArgs^ e)
162{
163 _accountsMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
164 _accountCreationMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
165}
166
167void RingClientUWP::Views::SmartPanel::_settings__Checked(Object^ sender, RoutedEventArgs^ e)
168{
169 _smartGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
170 _settings_->Visibility = Windows::UI::Xaml::Visibility::Visible;
171}
172
173void RingClientUWP::Views::SmartPanel::_settings__Unchecked(Object^ sender, RoutedEventArgs^ e)
174{
175 _settings_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
176 _smartGrid_->Visibility = Windows::UI::Xaml::Visibility::Visible;
177}
178
179void RingClientUWP::Views::SmartPanel::setMode(RingClientUWP::Views::SmartPanel::Mode mode)
180{
181 if (mode == RingClientUWP::Views::SmartPanel::Mode::Normal) {
182 _rowRingTxtBx_->Height = 40;
atraczyk2425ddd2016-09-01 13:16:22 -0400183 _selectedAccountAvatarContainer_->Height = 80;
Nicolas Jager38f15642016-09-01 09:45:58 -0400184 _selectedAccountAvatarColumn_->Width = 90;
185 _selectedAccountRow_->Height = 90;
186 }
187 else {
188 _rowRingTxtBx_->Height = 0;
atraczyk2425ddd2016-09-01 13:16:22 -0400189 _selectedAccountAvatarContainer_->Height = 50;
Nicolas Jager38f15642016-09-01 09:45:58 -0400190 _selectedAccountAvatarColumn_->Width = 60;
191 _selectedAccountRow_->Height = 60;
192 }
193
atraczyk2425ddd2016-09-01 13:16:22 -0400194 _selectedAccountAvatarContainer_->Width = _selectedAccountAvatarContainer_->Height;
Nicolas Jager38f15642016-09-01 09:45:58 -0400195 _settingsTBtn_->IsChecked = false;
196 _accountsMenuButton_->IsChecked = false;
197 _shareMenuButton_->IsChecked = false;
198}
199
200void RingClientUWP::Views::SmartPanel::_shareMenuButton__Checked(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
201{
202 _shareMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Visible;
203 _accountsMenuButton_->IsChecked = false;
204}
205
206void RingClientUWP::Views::SmartPanel::_shareMenuButton__Unchecked(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
207{
208 _shareMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
209}
210
Nicolas Jager38f15642016-09-01 09:45:58 -0400211void RingClientUWP::Views::SmartPanel::_addAccountBtn__Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
212{
213 _accountsMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
214 _accountCreationMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Visible;
215}
216
Nicolas Jager38f15642016-09-01 09:45:58 -0400217void RingClientUWP::Views::SmartPanel::_createAccountYes__Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
218{
atraczyk196936e2016-09-02 15:31:53 -0400219 switch (_accountTypeComboBox_->SelectedIndex)
220 {
221 case 0:
Nicolas Jagerf6a10322016-09-06 08:17:49 -0400222 {
atraczyk1ddcb5a2016-09-07 16:18:30 -0400223 CoreApplication::MainView->CoreWindow->Dispatcher->RunAsync(CoreDispatcherPriority::High,
224 ref new DispatchedHandler([=]() {
225 auto frame = dynamic_cast<Windows::UI::Xaml::Controls::Frame^>(Window::Current->Content);
226 dynamic_cast<RingClientUWP::MainPage^>(frame->Content)->showLoadingOverlay(true, true);
227 }));
Nicolas Jagerf6a10322016-09-06 08:17:49 -0400228 RingD::instance->createRINGAccount(_aliasTextBox_->Text);
229 _accountCreationMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
230 _accountsMenuButton__Checked(nullptr, nullptr);
atraczyk196936e2016-09-02 15:31:53 -0400231 break;
Nicolas Jagerf6a10322016-09-06 08:17:49 -0400232 }
233 break;
atraczyk196936e2016-09-02 15:31:53 -0400234 case 1:
Nicolas Jagerf6a10322016-09-06 08:17:49 -0400235 {
236 RingD::instance->createSIPAccount(_aliasTextBox_->Text);
237 _accountCreationMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
238 _accountsMenuButton__Checked(nullptr, nullptr);
239 break;
240 }
241 default:
242 break;
atraczyk196936e2016-09-02 15:31:53 -0400243 }
atraczyk1ddcb5a2016-09-07 16:18:30 -0400244 _aliasTextBox_->Text = "";
Nicolas Jager38f15642016-09-01 09:45:58 -0400245}
246
247
248void RingClientUWP::Views::SmartPanel::_createAccountNo__Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
249{
atraczyk196936e2016-09-02 15:31:53 -0400250 _accountsMenuButton_->IsChecked = false;
251 _accountsMenuButton__Unchecked(nullptr,nullptr);
Nicolas Jager38f15642016-09-01 09:45:58 -0400252}
253
Nicolas Jager38f15642016-09-01 09:45:58 -0400254void
255SmartPanel::_smartList__SelectionChanged(Platform::Object^ sender, Windows::UI::Xaml::Controls::SelectionChangedEventArgs^ e)
256{
257 auto listbox = safe_cast<ListBox^>(sender);
Nicolas Jager7c409f32016-09-08 09:35:16 -0400258 auto item = safe_cast<SmartPanelItem^>(listbox->SelectedItem);
Nicolas Jager5750df02016-09-13 11:20:33 -0400259
260 Contact^ contact = (item) ? safe_cast<Contact^>(item->_contact) : nullptr;
261
262 ContactsViewModel::instance->selectedContact = contact;
Nicolas Jager38f15642016-09-01 09:45:58 -0400263}
264
265void
266SmartPanel::_accountList__SelectionChanged(Platform::Object^ sender, Windows::UI::Xaml::Controls::SelectionChangedEventArgs^ e)
267{
268 auto listbox = safe_cast<ListBox^>(sender);
atraczykb0154632016-09-06 12:58:08 -0400269 // disable deselction from listbox
270 if (listbox->SelectedItem == nullptr)
271 {
272 if (e->RemovedItems->Size > 0)
273 {
274 Object^ itemToReselect = e->RemovedItems->GetAt(0);
275 for each (auto item in listbox->Items) {
276 if (item == itemToReselect) {
277 listbox->SelectedItem = itemToReselect;
278 continue;
279 }
280 }
281 }
282 }
Nicolas Jager38f15642016-09-01 09:45:58 -0400283 auto account = safe_cast<Account^>(listbox->SelectedItem);
284 AccountsViewModel::instance->selectedAccount = account;
285 updatePageContent();
286}
287
288void RingClientUWP::Views::SmartPanel::_ringTxtBx__KeyDown(Platform::Object^ sender, Windows::UI::Xaml::Input::KeyRoutedEventArgs^ e)
289{
290 /* add contact, test purpose but will be reused later in some way */
291 if (e->Key == Windows::System::VirtualKey::Enter && _ringTxtBx_->Text != "") {
292 ContactsViewModel::instance->addNewContact(_ringTxtBx_->Text, _ringTxtBx_->Text);
293 _ringTxtBx_->Text = "";
294 }
295}
Nicolas Jagerf6a10322016-09-06 08:17:49 -0400296
Nicolas Jager5750df02016-09-13 11:20:33 -0400297// REFACTO : change the name IncomingCall if used with OutGoingCall too.
Nicolas Jagerf6a10322016-09-06 08:17:49 -0400298void RingClientUWP::Views::SmartPanel::_rejectIncomingCallBtn__Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
299{
300 auto button = dynamic_cast<Button^>(e->OriginalSource);
Nicolas Jager7c409f32016-09-08 09:35:16 -0400301 auto call = dynamic_cast<Call^>(button->DataContext);
Nicolas Jagerf6a10322016-09-06 08:17:49 -0400302
303 call->refuse();
Nicolas Jagerf6a10322016-09-06 08:17:49 -0400304}
305
306
307void RingClientUWP::Views::SmartPanel::_acceptIncomingCallBtn__Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
308{
309 auto button = dynamic_cast<Button^>(e->OriginalSource);
Nicolas Jager7c409f32016-09-08 09:35:16 -0400310 auto call = dynamic_cast<Call^>(button->DataContext);
Nicolas Jagerf6a10322016-09-06 08:17:49 -0400311
312 call->accept();
Nicolas Jagerf6a10322016-09-06 08:17:49 -0400313}
Nicolas Jager7c409f32016-09-08 09:35:16 -0400314
315SmartPanelItem^
316SmartPanel::findItem(Contact^ contact)
317{
318 for each (SmartPanelItem^ item in smartPanelItemsList_)
319 if (item->_contact == contact)
320 return item;
321
322 return nullptr;
323}
324
325
326SmartPanelItem^
327SmartPanel::findItem(Call^ call)
328{
329 for each (SmartPanelItem^ item in smartPanelItemsList_)
330 if (item->_call == call)
331 return item;
332
333 return nullptr;
Nicolas Jager5750df02016-09-13 11:20:33 -0400334}
335
336void
337SmartPanel::_callContact__Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
338{
339 auto button = dynamic_cast<Button^>(e->OriginalSource);
340 auto item = dynamic_cast<SmartPanelItem^>(button->DataContext);
341 auto contact = item->_contact;
342
343 RingD::instance->placeCall(contact);
344}
345
346
347void RingClientUWP::Views::SmartPanel::_cancelCallBtn__Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
348{
349 auto button = dynamic_cast<Button^>(e->OriginalSource);
350 auto call = dynamic_cast<Call^>(button->DataContext);
351
352 call->cancel();
353}
354
355
356void RingClientUWP::Views::SmartPanel::Grid_PointerEntered(Platform::Object^ sender, Windows::UI::Xaml::Input::PointerRoutedEventArgs^ e)
357{
358 auto grid = dynamic_cast<Grid^>(sender);
359 auto listBoxItem = dynamic_cast<ListBoxItem^>(sender);
360 auto item = dynamic_cast<SmartPanelItem^>(grid->DataContext);
361
362 item->_callBar = Windows::UI::Xaml::Visibility::Visible;
363}
364
365
366void RingClientUWP::Views::SmartPanel::Grid_PointerExited(Platform::Object^ sender, Windows::UI::Xaml::Input::PointerRoutedEventArgs^ e)
367{
368 auto listBoxItem = dynamic_cast<ListBoxItem^>(sender);
369 auto grid = dynamic_cast<Grid^>(sender);
370 auto item = dynamic_cast<SmartPanelItem^>(grid->DataContext);
371
372 item->_callBar = Windows::UI::Xaml::Visibility::Collapsed;
373}
374
375
376void RingClientUWP::Views::SmartPanel::_contactItem__PointerReleased(Platform::Object^ sender, Windows::UI::Xaml::Input::PointerRoutedEventArgs^ e)
377{
378 auto listBoxItem = dynamic_cast<ListBoxItem^>(sender);
379 auto smartPanelItem = dynamic_cast<SmartPanelItem^>(listBoxItem->DataContext);
380
381 if (_smartList_->SelectedItem != smartPanelItem)
382 _smartList_->SelectedItem = smartPanelItem;
383 else
384 _smartList_->SelectedItem = nullptr;
385
Nicolas Jager7c409f32016-09-08 09:35:16 -0400386}