blob: a61c1611d8ada94f8d422abd6180bd5a083e6068 [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 */
atraczyk25608ed2016-09-15 11:12:16 -040049 _smartList_->ItemsSource = SmartPanelItemsViewModel::instance->itemsList;
Nicolas Jager7c409f32016-09-08 09:35:16 -040050
atraczyk2425ddd2016-09-01 13:16:22 -040051 /* connect delegates */
Nicolas Jager38f15642016-09-01 09:45:58 -040052 Configuration::UserPreferences::instance->selectIndex += ref new SelectIndex([this](int index) {
53 _accountsList_->SelectedIndex = index;
54 });
atraczyk2425ddd2016-09-01 13:16:22 -040055 Configuration::UserPreferences::instance->loadProfileImage += ref new LoadProfileImage([this]() {
56 StorageFolder^ localfolder = ApplicationData::Current->LocalFolder;
57 String^ image_path = localfolder->Path + "\\.profile\\profile_image.png";
58 auto uri = ref new Windows::Foundation::Uri(image_path);
59 _selectedAccountAvatar_->ImageSource = ref new BitmapImage(uri);
60 });
atraczyk196936e2016-09-02 15:31:53 -040061 AccountsViewModel::instance->updateScrollView += ref new UpdateScrollView([this]() {
62 _accountsListScrollView_->UpdateLayout();
63 _accountsListScrollView_->ScrollToVerticalOffset(_accountsListScrollView_->ScrollableHeight);
64 });
Nicolas Jager7c409f32016-09-08 09:35:16 -040065 CallsViewModel::instance->callRecieved += ref new RingClientUWP::CallRecieved([&](
66 Call^ call) {
67 auto from = call->from;
68 auto contact = ContactsViewModel::instance->findContactByName(from);
Nicolas Jager38f15642016-09-01 09:45:58 -040069
Nicolas Jager7c409f32016-09-08 09:35:16 -040070 if (contact == nullptr)
71 contact = ContactsViewModel::instance->addNewContact(from, from); // contact checked inside addNewContact.
72
73 if (contact == nullptr) {
74 ERR_("contact not handled!");
75 return;
76 }
77
atraczyk25608ed2016-09-15 11:12:16 -040078 auto item = SmartPanelItemsViewModel::instance->findItem(contact);
Nicolas Jager7c409f32016-09-08 09:35:16 -040079 item->_call = call;
80 });
81 RingD::instance->stateChange += ref new StateChange([this](String^ callId, String^ state, int code) {
82 auto call = CallsViewModel::instance->findCall(callId);
83
84 if (call == nullptr)
85 return;
86
atraczyk25608ed2016-09-15 11:12:16 -040087 auto item = SmartPanelItemsViewModel::instance->findItem(call);
Nicolas Jager7c409f32016-09-08 09:35:16 -040088
89 if (!item) {
90 WNG_("item not found");
91 return;
92 }
93
94 if (call->state == "incoming call")
Nicolas Jager5750df02016-09-13 11:20:33 -040095 item->_IncomingCallBar = Windows::UI::Xaml::Visibility::Visible;
Nicolas Jager7c409f32016-09-08 09:35:16 -040096
Nicolas Jager5750df02016-09-13 11:20:33 -040097 if (call->state == "CURRENT") {
98 item->_IncomingCallBar = Windows::UI::Xaml::Visibility::Collapsed;
99 item->_OutGoingCallBar = Windows::UI::Xaml::Visibility::Collapsed;
100 }
Nicolas Jager7c409f32016-09-08 09:35:16 -0400101
Nicolas Jager5750df02016-09-13 11:20:33 -0400102 if (call->state == "") {
103 item->_IncomingCallBar = Windows::UI::Xaml::Visibility::Collapsed;
104 item->_OutGoingCallBar = Windows::UI::Xaml::Visibility::Collapsed;
105 }
Nicolas Jager7c409f32016-09-08 09:35:16 -0400106 });
107
108
109 ContactsViewModel::instance->contactAdded += ref new ContactAdded([this](Contact^ contact) {
110 auto smartPanelItem = ref new SmartPanelItem();
111 smartPanelItem->_contact = contact;
atraczyk25608ed2016-09-15 11:12:16 -0400112 SmartPanelItemsViewModel::instance->itemsList->Append(smartPanelItem);
Nicolas Jager7c409f32016-09-08 09:35:16 -0400113 });
114
Nicolas Jager5750df02016-09-13 11:20:33 -0400115 RingD::instance->calling += ref new RingClientUWP::Calling([&](
116 Call^ call) {
117 auto from = call->from;
118 auto contact = ContactsViewModel::instance->findContactByName(from);
119
120 if (contact == nullptr) {
121 WNG_("cannot call the peer, contact not found!");
122 return;
123 }
124
atraczyk25608ed2016-09-15 11:12:16 -0400125 auto item = SmartPanelItemsViewModel::instance->findItem(contact);
Nicolas Jager5750df02016-09-13 11:20:33 -0400126
127 if (item == nullptr) {
128 WNG_("cannot call the peer, smart panel item not found!");
129 return;
130 }
131
132 /* use underscore to differentiate states from UI, we need to think more about states management */
133 call->state = "_calling_";
134
135 item->_OutGoingCallBar = Windows::UI::Xaml::Visibility::Visible;
136 item->_call = call;
137 });
138
Nicolas Jager38f15642016-09-01 09:45:58 -0400139}
140
141void
142RingClientUWP::Views::SmartPanel::updatePageContent()
143{
144 auto account = AccountsViewModel::instance->selectedAccount;
145 if (!account)
146 return;
147
148 Configuration::UserPreferences::instance->PREF_ACCOUNT_INDEX = _accountsList_->SelectedIndex;
149 Configuration::UserPreferences::instance->save();
150 _selectedAccountName_->Text = account->name_;
151}
152
153void RingClientUWP::Views::SmartPanel::_accountsMenuButton__Checked(Object^ sender, RoutedEventArgs^ e)
154{
155 _shareMenuButton_->IsChecked = false;
156 _accountsMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Visible;
157 _accountCreationMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
158}
159
160void RingClientUWP::Views::SmartPanel::_accountsMenuButton__Unchecked(Object^ sender, RoutedEventArgs^ e)
161{
162 _accountsMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
163 _accountCreationMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
164}
165
166void RingClientUWP::Views::SmartPanel::_settings__Checked(Object^ sender, RoutedEventArgs^ e)
167{
168 _smartGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
169 _settings_->Visibility = Windows::UI::Xaml::Visibility::Visible;
170}
171
172void RingClientUWP::Views::SmartPanel::_settings__Unchecked(Object^ sender, RoutedEventArgs^ e)
173{
174 _settings_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
175 _smartGrid_->Visibility = Windows::UI::Xaml::Visibility::Visible;
176}
177
178void RingClientUWP::Views::SmartPanel::setMode(RingClientUWP::Views::SmartPanel::Mode mode)
179{
180 if (mode == RingClientUWP::Views::SmartPanel::Mode::Normal) {
181 _rowRingTxtBx_->Height = 40;
atraczyk2425ddd2016-09-01 13:16:22 -0400182 _selectedAccountAvatarContainer_->Height = 80;
Nicolas Jager38f15642016-09-01 09:45:58 -0400183 _selectedAccountAvatarColumn_->Width = 90;
184 _selectedAccountRow_->Height = 90;
185 }
186 else {
187 _rowRingTxtBx_->Height = 0;
atraczyk2425ddd2016-09-01 13:16:22 -0400188 _selectedAccountAvatarContainer_->Height = 50;
Nicolas Jager38f15642016-09-01 09:45:58 -0400189 _selectedAccountAvatarColumn_->Width = 60;
190 _selectedAccountRow_->Height = 60;
191 }
192
atraczyk2425ddd2016-09-01 13:16:22 -0400193 _selectedAccountAvatarContainer_->Width = _selectedAccountAvatarContainer_->Height;
Nicolas Jager38f15642016-09-01 09:45:58 -0400194 _settingsTBtn_->IsChecked = false;
195 _accountsMenuButton_->IsChecked = false;
196 _shareMenuButton_->IsChecked = false;
197}
198
199void RingClientUWP::Views::SmartPanel::_shareMenuButton__Checked(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
200{
201 _shareMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Visible;
202 _accountsMenuButton_->IsChecked = false;
203}
204
205void RingClientUWP::Views::SmartPanel::_shareMenuButton__Unchecked(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
206{
207 _shareMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
208}
209
Nicolas Jager38f15642016-09-01 09:45:58 -0400210void RingClientUWP::Views::SmartPanel::_addAccountBtn__Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
211{
212 _accountsMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
213 _accountCreationMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Visible;
214}
215
Nicolas Jager38f15642016-09-01 09:45:58 -0400216void RingClientUWP::Views::SmartPanel::_createAccountYes__Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
217{
atraczyk196936e2016-09-02 15:31:53 -0400218 switch (_accountTypeComboBox_->SelectedIndex)
219 {
220 case 0:
Nicolas Jagerf6a10322016-09-06 08:17:49 -0400221 {
atraczyk1ddcb5a2016-09-07 16:18:30 -0400222 CoreApplication::MainView->CoreWindow->Dispatcher->RunAsync(CoreDispatcherPriority::High,
223 ref new DispatchedHandler([=]() {
224 auto frame = dynamic_cast<Windows::UI::Xaml::Controls::Frame^>(Window::Current->Content);
225 dynamic_cast<RingClientUWP::MainPage^>(frame->Content)->showLoadingOverlay(true, true);
226 }));
Nicolas Jagerf6a10322016-09-06 08:17:49 -0400227 RingD::instance->createRINGAccount(_aliasTextBox_->Text);
228 _accountCreationMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
229 _accountsMenuButton__Checked(nullptr, nullptr);
atraczyk196936e2016-09-02 15:31:53 -0400230 break;
Nicolas Jagerf6a10322016-09-06 08:17:49 -0400231 }
232 break;
atraczyk196936e2016-09-02 15:31:53 -0400233 case 1:
Nicolas Jagerf6a10322016-09-06 08:17:49 -0400234 {
235 RingD::instance->createSIPAccount(_aliasTextBox_->Text);
236 _accountCreationMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
237 _accountsMenuButton__Checked(nullptr, nullptr);
238 break;
239 }
240 default:
241 break;
atraczyk196936e2016-09-02 15:31:53 -0400242 }
atraczyk1ddcb5a2016-09-07 16:18:30 -0400243 _aliasTextBox_->Text = "";
Nicolas Jager38f15642016-09-01 09:45:58 -0400244}
245
246
247void RingClientUWP::Views::SmartPanel::_createAccountNo__Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
248{
atraczyk196936e2016-09-02 15:31:53 -0400249 _accountsMenuButton_->IsChecked = false;
250 _accountsMenuButton__Unchecked(nullptr,nullptr);
Nicolas Jager38f15642016-09-01 09:45:58 -0400251}
252
Nicolas Jager38f15642016-09-01 09:45:58 -0400253void
254SmartPanel::_smartList__SelectionChanged(Platform::Object^ sender, Windows::UI::Xaml::Controls::SelectionChangedEventArgs^ e)
255{
256 auto listbox = safe_cast<ListBox^>(sender);
Nicolas Jager7c409f32016-09-08 09:35:16 -0400257 auto item = safe_cast<SmartPanelItem^>(listbox->SelectedItem);
Nicolas Jager5750df02016-09-13 11:20:33 -0400258
259 Contact^ contact = (item) ? safe_cast<Contact^>(item->_contact) : nullptr;
260
261 ContactsViewModel::instance->selectedContact = contact;
Nicolas Jager38f15642016-09-01 09:45:58 -0400262}
263
264void
265SmartPanel::_accountList__SelectionChanged(Platform::Object^ sender, Windows::UI::Xaml::Controls::SelectionChangedEventArgs^ e)
266{
267 auto listbox = safe_cast<ListBox^>(sender);
atraczykb0154632016-09-06 12:58:08 -0400268 // disable deselction from listbox
269 if (listbox->SelectedItem == nullptr)
270 {
271 if (e->RemovedItems->Size > 0)
272 {
273 Object^ itemToReselect = e->RemovedItems->GetAt(0);
274 for each (auto item in listbox->Items) {
275 if (item == itemToReselect) {
276 listbox->SelectedItem = itemToReselect;
277 continue;
278 }
279 }
280 }
281 }
Nicolas Jager38f15642016-09-01 09:45:58 -0400282 auto account = safe_cast<Account^>(listbox->SelectedItem);
283 AccountsViewModel::instance->selectedAccount = account;
284 updatePageContent();
285}
286
287void RingClientUWP::Views::SmartPanel::_ringTxtBx__KeyDown(Platform::Object^ sender, Windows::UI::Xaml::Input::KeyRoutedEventArgs^ e)
288{
289 /* add contact, test purpose but will be reused later in some way */
290 if (e->Key == Windows::System::VirtualKey::Enter && _ringTxtBx_->Text != "") {
291 ContactsViewModel::instance->addNewContact(_ringTxtBx_->Text, _ringTxtBx_->Text);
292 _ringTxtBx_->Text = "";
293 }
294}
Nicolas Jagerf6a10322016-09-06 08:17:49 -0400295
atraczyke87716f2016-09-20 13:46:22 -0400296void RingClientUWP::Views::SmartPanel::_ringTxtBx__Click(Platform::Object^ sender, Windows::UI::Xaml::Input::KeyRoutedEventArgs^ e)
297{
298 ContactsViewModel::instance->addNewContact(_ringTxtBx_->Text, _ringTxtBx_->Text);
299 _ringTxtBx_->Text = "";
300}
301
Nicolas Jager5750df02016-09-13 11:20:33 -0400302// REFACTO : change the name IncomingCall if used with OutGoingCall too.
Nicolas Jagerf6a10322016-09-06 08:17:49 -0400303void RingClientUWP::Views::SmartPanel::_rejectIncomingCallBtn__Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
304{
305 auto button = dynamic_cast<Button^>(e->OriginalSource);
Nicolas Jager7c409f32016-09-08 09:35:16 -0400306 auto call = dynamic_cast<Call^>(button->DataContext);
Nicolas Jagerf6a10322016-09-06 08:17:49 -0400307
308 call->refuse();
Nicolas Jagerf6a10322016-09-06 08:17:49 -0400309}
310
311
312void RingClientUWP::Views::SmartPanel::_acceptIncomingCallBtn__Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
313{
314 auto button = dynamic_cast<Button^>(e->OriginalSource);
Nicolas Jager7c409f32016-09-08 09:35:16 -0400315 auto call = dynamic_cast<Call^>(button->DataContext);
Nicolas Jagerf6a10322016-09-06 08:17:49 -0400316
atraczyk25608ed2016-09-15 11:12:16 -0400317 _smartList_->SelectedIndex = SmartPanelItemsViewModel::instance->getIndex(call);
318
Nicolas Jagerf6a10322016-09-06 08:17:49 -0400319 call->accept();
Nicolas Jagerf6a10322016-09-06 08:17:49 -0400320}
Nicolas Jager7c409f32016-09-08 09:35:16 -0400321
Nicolas Jager5750df02016-09-13 11:20:33 -0400322void
323SmartPanel::_callContact__Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
324{
325 auto button = dynamic_cast<Button^>(e->OriginalSource);
326 auto item = dynamic_cast<SmartPanelItem^>(button->DataContext);
327 auto contact = item->_contact;
328
atraczyk25608ed2016-09-15 11:12:16 -0400329 _smartList_->SelectedIndex = SmartPanelItemsViewModel::instance->getIndex(contact);
330
Nicolas Jager5750df02016-09-13 11:20:33 -0400331 RingD::instance->placeCall(contact);
332}
333
334
335void RingClientUWP::Views::SmartPanel::_cancelCallBtn__Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
336{
337 auto button = dynamic_cast<Button^>(e->OriginalSource);
338 auto call = dynamic_cast<Call^>(button->DataContext);
339
340 call->cancel();
341}
342
343
344void RingClientUWP::Views::SmartPanel::Grid_PointerEntered(Platform::Object^ sender, Windows::UI::Xaml::Input::PointerRoutedEventArgs^ e)
345{
346 auto grid = dynamic_cast<Grid^>(sender);
347 auto listBoxItem = dynamic_cast<ListBoxItem^>(sender);
348 auto item = dynamic_cast<SmartPanelItem^>(grid->DataContext);
349
350 item->_callBar = Windows::UI::Xaml::Visibility::Visible;
351}
352
353
354void RingClientUWP::Views::SmartPanel::Grid_PointerExited(Platform::Object^ sender, Windows::UI::Xaml::Input::PointerRoutedEventArgs^ e)
355{
356 auto listBoxItem = dynamic_cast<ListBoxItem^>(sender);
357 auto grid = dynamic_cast<Grid^>(sender);
358 auto item = dynamic_cast<SmartPanelItem^>(grid->DataContext);
359
360 item->_callBar = Windows::UI::Xaml::Visibility::Collapsed;
361}
362
363
364void RingClientUWP::Views::SmartPanel::_contactItem__PointerReleased(Platform::Object^ sender, Windows::UI::Xaml::Input::PointerRoutedEventArgs^ e)
365{
366 auto listBoxItem = dynamic_cast<ListBoxItem^>(sender);
367 auto smartPanelItem = dynamic_cast<SmartPanelItem^>(listBoxItem->DataContext);
368
369 if (_smartList_->SelectedItem != smartPanelItem)
370 _smartList_->SelectedItem = smartPanelItem;
371 else
372 _smartList_->SelectedItem = nullptr;
373
Nicolas Jager7c409f32016-09-08 09:35:16 -0400374}