SmartPanel.xaml.cpp 81.9 KB
Newer Older
Nicolas Jager's avatar
Nicolas Jager committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/***************************************************************************
 * Copyright (C) 2016 by Savoir-faire Linux                                *
 * Author: Jäger Nicolas <nicolas.jager@savoirfairelinux.com>              *
 * Author: Traczyk Andreas <andreas.traczyk@savoirfairelinux.com>          *
 *                                                                         *
 * This program is free software; you can redistribute it and/or modify    *
 * it under the terms of the GNU General Public License as published by    *
 * the Free Software Foundation; either version 3 of the License, or       *
 * (at your option) any later version.                                     *
 *                                                                         *
 * This program is distributed in the hope that it will be useful,         *
 * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
 * GNU General Public License for more details.                            *
 *                                                                         *
 * You should have received a copy of the GNU General Public License       *
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.   *
 **************************************************************************/
#include "pch.h"
atraczyk's avatar
atraczyk committed
20
21
#include <string>
#include <direct.h>
Nicolas Jager's avatar
Nicolas Jager committed
22
#include "SmartPanel.xaml.h"
23
24
#include "qrencode.h"
#include <MemoryBuffer.h>   // IMemoryBufferByteAccess
Nicolas Jager's avatar
Nicolas Jager committed
25
26
27
28

using namespace Platform;

using namespace RingClientUWP;
29
using namespace RingClientUWP::Controls;
Nicolas Jager's avatar
Nicolas Jager committed
30
31
32
using namespace RingClientUWP::Views;
using namespace RingClientUWP::ViewModel;
using namespace Windows::Media::Capture;
33
using namespace Windows::Media::MediaProperties;
Nicolas Jager's avatar
Nicolas Jager committed
34
35
36
37
38
39
40
using namespace Windows::UI::Xaml;
using namespace Windows::Storage;
using namespace Windows::UI::Xaml::Media::Imaging;
using namespace Windows::UI::Xaml::Shapes;
using namespace Windows::UI::Xaml::Media;
using namespace Concurrency;
using namespace Windows::Foundation;
41
42
43
using namespace Windows::Graphics::Imaging;
using namespace Windows::Foundation;
using namespace Concurrency;
Nicolas Jager's avatar
Nicolas Jager committed
44
45
using namespace Platform::Collections;

46
47
48
using namespace Windows::ApplicationModel::Core;
using namespace Windows::Storage;
using namespace Windows::UI::Core;
49
using namespace Windows::System::Threading;
50

Nicolas Jager's avatar
Nicolas Jager committed
51
52
53
54
SmartPanel::SmartPanel()
{
    InitializeComponent();

Nicolas Jager's avatar
Nicolas Jager committed
55
56
    /* populate accounts listBox*/
    _accountsList_->ItemsSource = AccountListItemsViewModel::instance->itemsList;
57
58

    /* populate the smartlist */
59
    _smartList_->ItemsSource = SmartPanelItemsViewModel::instance->itemsList;
60

Nicolas Jager's avatar
Nicolas Jager committed
61
62
63
64

    /* populate the device list*/
///	_devicesIdList_ // not used so far

65
    /* connect delegates */
Nicolas Jager's avatar
Nicolas Jager committed
66
    Configuration::UserPreferences::instance->selectIndex += ref new SelectIndex([this](int index) {
67
68
69
70
        if (_accountsList_) {
            auto accountsListSize = dynamic_cast<Vector<AccountListItem^>^>(_accountsList_->ItemsSource)->Size;
            if (accountsListSize > index)
                _accountsList_->SelectedIndex = index;
71
72
73
74
            else {
                if (accountsListSize > 0)
                    _accountsList_->SelectedIndex = 0;
            }
75
        }
Nicolas Jager's avatar
Nicolas Jager committed
76
    });
77
78
79
80
81
    Configuration::UserPreferences::instance->loadProfileImage += ref new LoadProfileImage([this]() {
        StorageFolder^ localfolder = ApplicationData::Current->LocalFolder;
        String^ image_path = localfolder->Path + "\\.profile\\profile_image.png";
        auto uri = ref new Windows::Foundation::Uri(image_path);
        _selectedAccountAvatar_->ImageSource = ref new BitmapImage(uri);
atraczyk's avatar
atraczyk committed
82
    });
83
    ContactsViewModel::instance->contactDataModified += ref new ContactDataModified([this](Contact^ contact) {
84
    });
atraczyk's avatar
atraczyk committed
85
86
87
88
    AccountsViewModel::instance->updateScrollView += ref new UpdateScrollView([this]() {
        _accountsListScrollView_->UpdateLayout();
        _accountsListScrollView_->ScrollToVerticalOffset(_accountsListScrollView_->ScrollableHeight);
    });
89
90
91
    RingD::instance->incomingCall += ref new RingClientUWP::IncomingCall([&](
    String^ accountId, String^ callId, String^ from) {
        ///auto from = call->from;
Nicolas Jager's avatar
Nicolas Jager committed
92
        auto contact = ContactsViewModel::instance->findContactByRingId(from);
93
94
95
96
97
98
99
100
101

        if (contact == nullptr)
            contact = ContactsViewModel::instance->addNewContact(from, from); // contact checked inside addNewContact.

        if (contact == nullptr) {
            ERR_("contact not handled!");
            return;
        }

102
        RingD::instance->lookUpAddress(from);
103
104
        contact->_accountIdAssociated = accountId;

105
        auto item = SmartPanelItemsViewModel::instance->findItem(contact);
106
        item->_callId = callId;
Nicolas Jager's avatar
Nicolas Jager committed
107

108
109
110
111
112
113
114
115
        /* move the item of the top of the list */
        unsigned int index;
        if (_smartList_->Items->IndexOf(item, &index)) {
            SmartPanelItemsViewModel::instance->moveItemToTheTop(item);
            _smartList_->UpdateLayout();
            _smartList_->ScrollIntoView(item);
        }

116
    });
Nicolas Jager's avatar
Nicolas Jager committed
117
    RingD::instance->stateChange += ref new StateChange([this](String^ callId, CallStatus state, int code) {
118

119
        auto item = SmartPanelItemsViewModel::instance->findItem(callId);
120
121
122
123
124
125

        if (!item) {
            WNG_("item not found");
            return;
        }

126
127
        switch (state) {
        case CallStatus::NONE:
128
        case CallStatus::ENDED:
129
        {
atraczyk's avatar
atraczyk committed
130
            bool isInCall = false;
Nicolas Jager's avatar
Nicolas Jager committed
131
            for (auto item : SmartPanelItemsViewModel::instance->itemsList) { // WTF!!! item instead of it!!!! (XXX)
atraczyk's avatar
atraczyk committed
132
133
134
135
136
137
138
139
                if (item->_callId && item->_callStatus == CallStatus::IN_PROGRESS) {
                    isInCall = true;
                    RingD::instance->currentCallId = item->_callId;
                    break;
                }
            }
            if (!isInCall)
                _settingsMenuButton_->Visibility = VIS::Visible;
140
141
142
143
            break;
        }
        case CallStatus::IN_PROGRESS:
        {
144
            SmartPanelItemsViewModel::instance->_selectedItem = item;
145
146
147
            summonVideoPage();
            break;
        }
148
149
150
        case CallStatus::PEER_PAUSED:
        case CallStatus::PAUSED:
        {
151
            SmartPanelItemsViewModel::instance->_selectedItem = item;
152
153
154
            summonVideoPage();
            break;
        }
155
156
157
        default:
            break;
        }
158
159

    });
160
    RingD::instance->devicesListRefreshed += ref new RingClientUWP::DevicesListRefreshed(this, &RingClientUWP::Views::SmartPanel::OndevicesListRefreshed);
161
162
163
164

    ContactsViewModel::instance->contactAdded += ref new ContactAdded([this](Contact^ contact) {
        auto smartPanelItem = ref new SmartPanelItem();
        smartPanelItem->_contact = contact;
165
        SmartPanelItemsViewModel::instance->itemsList->Append(smartPanelItem);
166
    });
Nicolas Jager's avatar
Nicolas Jager committed
167

168
    RingD::instance->exportOnRingEnded += ref new RingClientUWP::ExportOnRingEnded(this, &RingClientUWP::Views::SmartPanel::OnexportOnRingEnded);
169
    RingD::instance->accountUpdated += ref new RingClientUWP::AccountUpdated(this, &RingClientUWP::Views::SmartPanel::OnaccountUpdated);
Nicolas Jager's avatar
Nicolas Jager committed
170
    RingD::instance->registeredNameFound += ref new RingClientUWP::RegisteredNameFound(this, &RingClientUWP::Views::SmartPanel::OnregisteredNameFound);
Nicolas Jager's avatar
Nicolas Jager committed
171

172
173
174
    RingD::instance->finishCaptureDeviceEnumeration += ref new RingClientUWP::FinishCaptureDeviceEnumeration([this]() {
        populateVideoDeviceSettingsComboBox();
    });
175
176
    RingD::instance->registrationStateErrorGeneric += ref new RingClientUWP::RegistrationStateErrorGeneric(this, &RingClientUWP::Views::SmartPanel::OnregistrationStateErrorGeneric);
    RingD::instance->registrationStateRegistered += ref new RingClientUWP::RegistrationStateRegistered(this, &RingClientUWP::Views::SmartPanel::OnregistrationStateRegistered);
177
    RingD::instance->callPlaced += ref new RingClientUWP::CallPlaced(this, &RingClientUWP::Views::SmartPanel::OncallPlaced);
178
    RingD::instance->incomingAccountMessage += ref new RingClientUWP::IncomingAccountMessage(this, &RingClientUWP::Views::SmartPanel::OnincomingAccountMessage);
Nicolas Jager's avatar
Nicolas Jager committed
179
180

    menuOpen = MenuOpen::CONTACTS_LIST;
Nicolas Jager's avatar
Nicolas Jager committed
181
182
183
184
185
}

void
RingClientUWP::Views::SmartPanel::updatePageContent()
{
Nicolas Jager's avatar
Nicolas Jager committed
186
187
    auto accountListItem = AccountListItemsViewModel::instance->_selectedItem;
    if (!accountListItem)
Nicolas Jager's avatar
Nicolas Jager committed
188
189
        return;

190
191
192
    auto name = accountListItem->_account->name_; // refacto remove name variable and use the link directly on the next line... like _upnpnState..._

    accountListItem->_isSelected = true;
Nicolas Jager's avatar
Nicolas Jager committed
193

Nicolas Jager's avatar
Nicolas Jager committed
194
195
    Configuration::UserPreferences::instance->PREF_ACCOUNT_INDEX = _accountsList_->SelectedIndex;
    Configuration::UserPreferences::instance->save();
Nicolas Jager's avatar
Nicolas Jager committed
196

Nicolas Jager's avatar
Nicolas Jager committed
197
    _selectedAccountName_->Text = name; // refacto : bind this in xaml directly
198
///    _devicesIdList_->ItemsSource = account->_devicesIdList;
Nicolas Jager's avatar
Nicolas Jager committed
199
    _deviceId_->Text = accountListItem->_account->_deviceId; /* this is the current device ...
Nicolas Jager's avatar
Nicolas Jager committed
200
    ... in the way to get all associated devices, we have to querry the daemon : */
201

Nicolas Jager's avatar
Nicolas Jager committed
202
    _devicesMenuButton_->Visibility = (accountListItem->_account->accountType_ == "RING")
203
204
                                      ? Windows::UI::Xaml::Visibility::Visible
                                      : Windows::UI::Xaml::Visibility::Collapsed;
205

Nicolas Jager's avatar
Nicolas Jager committed
206
    _shareMenuButton_->Visibility = (accountListItem->_account->accountType_ == "RING")
207
208
                                    ? Windows::UI::Xaml::Visibility::Visible
                                    : Windows::UI::Xaml::Visibility::Collapsed;
209
210

    _upnpState_->IsOn = accountListItem->_account->_upnpState;
Nicolas Jager's avatar
Nicolas Jager committed
211
212
213
214
215
216
217
218
219
220

    if (_upnpState_->IsOn) {
        _usernameTextBoxEdition_->IsEnabled = true;
        _usernameInvalidEdition_->Visibility = Windows::UI::Xaml::Visibility::Visible;

    } else {
        _usernameTextBoxEdition_->IsEnabled = false;
        _usernameInvalidEdition_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
    }

Nicolas Jager's avatar
Nicolas Jager committed
221
222
}

223
// refacto : rm me
224
225
void RingClientUWP::Views::SmartPanel::unselectContact()
{
226
    // _smartList_->SelectedItem = nullptr;
227
228
}

atraczyk's avatar
atraczyk committed
229
230
231
232
233
234
235
236
237
238
239
240
241
242
void RingClientUWP::Views::SmartPanel::_smartGridButton__Clicked(Object^ sender, RoutedEventArgs^ e)
{
    _accountsMenuButton__Unchecked(nullptr,nullptr);
    _accountsMenuButton_->IsChecked = false;
    _shareMenuButton__Unchecked(nullptr,nullptr);
    _shareMenuButton_->IsChecked = false;
    _devicesMenuButton__Unchecked(nullptr,nullptr);
    _devicesMenuButton_->IsChecked = false;
    _settingsMenu_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
    _settingsMenuButton_->IsChecked = false;

    _smartGrid_->Visibility = Windows::UI::Xaml::Visibility::Visible;
}

Nicolas Jager's avatar
Nicolas Jager committed
243
244
void RingClientUWP::Views::SmartPanel::_accountsMenuButton__Checked(Object^ sender, RoutedEventArgs^ e)
{
Nicolas Jager's avatar
Nicolas Jager committed
245
    menuOpen = MenuOpen::ACCOUNTS_LIST;
atraczyk's avatar
atraczyk committed
246
    _settingsMenu_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
247
    _settingsMenuButton_->IsChecked = false;
Nicolas Jager's avatar
Nicolas Jager committed
248
    _shareMenuButton_->IsChecked = false;
249
    _devicesMenuButton_->IsChecked = false;
Nicolas Jager's avatar
Nicolas Jager committed
250
251
    _accountsMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Visible;
    _accountCreationMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
252
253
    _devicesMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
    _addingDeviceGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
atraczyk's avatar
atraczyk committed
254
255

    _smartGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
Nicolas Jager's avatar
Nicolas Jager committed
256
257
258
259
}

void RingClientUWP::Views::SmartPanel::_accountsMenuButton__Unchecked(Object^ sender, RoutedEventArgs^ e)
{
Nicolas Jager's avatar
Nicolas Jager committed
260
    menuOpen = MenuOpen::CONTACTS_LIST;
Nicolas Jager's avatar
Nicolas Jager committed
261
262
    _accountsMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
    _accountCreationMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
Nicolas Jager's avatar
Nicolas Jager committed
263
    _accountEditionGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
264
    _accountAddMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
atraczyk's avatar
atraczyk committed
265
266

    _smartGrid_->Visibility = Windows::UI::Xaml::Visibility::Visible;
Nicolas Jager's avatar
Nicolas Jager committed
267
268
}

269
void RingClientUWP::Views::SmartPanel::_settingsMenu__Checked(Object^ sender, RoutedEventArgs^ e)
Nicolas Jager's avatar
Nicolas Jager committed
270
{
Nicolas Jager's avatar
Nicolas Jager committed
271
    menuOpen - MenuOpen::SETTINGS;
272
273
274
275
276
277
278
    _accountsMenuButton__Unchecked(nullptr,nullptr);
    _accountsMenuButton_->IsChecked = false;
    _shareMenuButton__Unchecked(nullptr,nullptr);
    _shareMenuButton_->IsChecked = false;
    _devicesMenuButton__Unchecked(nullptr,nullptr);
    _devicesMenuButton_->IsChecked = false;
    _settingsMenu_->Visibility = Windows::UI::Xaml::Visibility::Visible;
atraczyk's avatar
atraczyk committed
279
280
281

    _smartGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;

282
    auto vcm = Video::VideoManager::instance->captureManager();
atraczyk's avatar
atraczyk committed
283
284
285
286
287
288
    if (vcm->deviceList->Size > 0) {
        if (!vcm->isInitialized)
            vcm->InitializeCameraAsync(true);
        else
            vcm->StartPreviewAsync(true);
    }
289
    summonPreviewPage();
Nicolas Jager's avatar
Nicolas Jager committed
290
291
}

292
void RingClientUWP::Views::SmartPanel::_settingsMenu__Unchecked(Object^ sender, RoutedEventArgs^ e)
Nicolas Jager's avatar
Nicolas Jager committed
293
{
Nicolas Jager's avatar
Nicolas Jager committed
294
    menuOpen = MenuOpen::CONTACTS_LIST;
295
    _settingsMenu_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
atraczyk's avatar
atraczyk committed
296

Nicolas Jager's avatar
Nicolas Jager committed
297
    _smartGrid_->Visibility = Windows::UI::Xaml::Visibility::Visible;
atraczyk's avatar
atraczyk committed
298

atraczyk's avatar
atraczyk committed
299
300
301
    auto vcm = Video::VideoManager::instance->captureManager();
    if (vcm->deviceList->Size > 0) {
        vcm->StopPreviewAsync()
302
        .then([](task<void> stopPreviewTask)
atraczyk's avatar
atraczyk committed
303
304
305
306
307
308
309
310
311
312
        {
            try {
                stopPreviewTask.get();
                Video::VideoManager::instance->captureManager()->isSettingsPreviewing = false;
            }
            catch (Exception^ e) {
                WriteException(e);
            }
        });
    }
313
    hidePreviewPage();
Nicolas Jager's avatar
Nicolas Jager committed
314
315
316
317
318
319
}

void RingClientUWP::Views::SmartPanel::setMode(RingClientUWP::Views::SmartPanel::Mode mode)
{
    if (mode == RingClientUWP::Views::SmartPanel::Mode::Normal) {
        _rowRingTxtBx_->Height = 40;
320
        _selectedAccountAvatarContainer_->Height = 80;
321
        _shaderPhotoboothIcon_->Height = 80;
Nicolas Jager's avatar
Nicolas Jager committed
322
323
324
325
326
        _selectedAccountAvatarColumn_->Width = 90;
        _selectedAccountRow_->Height = 90;
    }
    else {
        _rowRingTxtBx_->Height = 0;
327
        _selectedAccountAvatarContainer_->Height = 50;
328
        _shaderPhotoboothIcon_->Height = 50;
Nicolas Jager's avatar
Nicolas Jager committed
329
330
331
332
        _selectedAccountAvatarColumn_->Width = 60;
        _selectedAccountRow_->Height = 60;
    }

333
    _selectedAccountAvatarContainer_->Width = _selectedAccountAvatarContainer_->Height;
334
    _shaderPhotoboothIcon_->Width = _shaderPhotoboothIcon_->Height;
335
    _settingsMenuButton_->IsChecked = false;
Nicolas Jager's avatar
Nicolas Jager committed
336
337
    _accountsMenuButton_->IsChecked = false;
    _shareMenuButton_->IsChecked = false;
338
    _devicesMenuButton_->IsChecked = false;
Nicolas Jager's avatar
Nicolas Jager committed
339
340
341
342
}

void RingClientUWP::Views::SmartPanel::_shareMenuButton__Checked(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
Nicolas Jager's avatar
Nicolas Jager committed
343
    menuOpen = MenuOpen::SHARE;
atraczyk's avatar
atraczyk committed
344
    _settingsMenu_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
345
    _settingsMenuButton_->IsChecked = false;
Nicolas Jager's avatar
Nicolas Jager committed
346
    _shareMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Visible;
347
348
    _accountsMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
    _accountCreationMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
Nicolas Jager's avatar
Nicolas Jager committed
349
    _accountEditionGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
350
351
    _devicesMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
    _addingDeviceGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
Nicolas Jager's avatar
Nicolas Jager committed
352
    _accountsMenuButton_->IsChecked = false;
353
    _devicesMenuButton_->IsChecked = false;
354

atraczyk's avatar
atraczyk committed
355
356
    _smartGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;

357
    generateQRcode();
Nicolas Jager's avatar
Nicolas Jager committed
358
359
360
361
}

void RingClientUWP::Views::SmartPanel::_shareMenuButton__Unchecked(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
Nicolas Jager's avatar
Nicolas Jager committed
362
    menuOpen = MenuOpen::CONTACTS_LIST;
Nicolas Jager's avatar
Nicolas Jager committed
363
    _shareMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
364
    _accountsMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
Nicolas Jager's avatar
Nicolas Jager committed
365
    _accountEditionGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
366
    _accountCreationMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
atraczyk's avatar
atraczyk committed
367
368

    _smartGrid_->Visibility = Windows::UI::Xaml::Visibility::Visible;
Nicolas Jager's avatar
Nicolas Jager committed
369
370
371
372
373
374
}

void RingClientUWP::Views::SmartPanel::_addAccountBtn__Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
    _accountsMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
    _accountCreationMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Visible;
375

376
    _createAccountYes_->IsEnabled = false;
377
378
379

    _accountTypeComboBox_->SelectedIndex = 0;
    _upnpStateAccountCreation_->IsOn = true;
Nicolas Jager's avatar
Nicolas Jager committed
380
381
382
    _RegisterStateEdition_->IsOn = true;
    _accountAliasTextBox_->Text = "";
    _usernameTextBox_->Text = "";
Nicolas Jager's avatar
Nicolas Jager committed
383
384

    checkStateAddAccountMenu();
Nicolas Jager's avatar
Nicolas Jager committed
385
386
387
388
}

void RingClientUWP::Views::SmartPanel::_createAccountYes__Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
389
390
    switch (_accountTypeComboBox_->SelectedIndex) {
    case 0: /* RING account */
391
    {
Nicolas Jager's avatar
Nicolas Jager committed
392
393
394
395
396
        RingD::instance->createRINGAccount(_accountAliasTextBox_->Text
                                           , _ringPasswordBoxAccountCreation_->Password
                                           , _upnpStateAccountCreation_->IsOn
                                           , (_RegisterState_->IsOn) ? _usernameTextBox_->Text : "");

397
398
        _ringPasswordBoxAccountCreation_->Password = "";
        _ringPasswordBoxAccountCreationCheck_->Password = "";
Nicolas Jager's avatar
Nicolas Jager committed
399
        _usernameTextBox_->Text = "";
atraczyk's avatar
atraczyk committed
400
        break;
401
402
    }
    break;
403
    case 1: /* SIP account */
404
    {
Nicolas Jager's avatar
Nicolas Jager committed
405
        RingD::instance->createSIPAccount(_accountAliasTextBox_->Text, _sipPasswordBoxAccountCreation_->Password, _sipHostnameTextBox_->Text, _sipUsernameTextBox_->Text);
406
407
408
        _sipPasswordBoxAccountCreation_->Password = "";
        _sipUsernameTextBox_->Text = "";
        _sipHostnameTextBox_->Text = "";
409
410
411
412
        break;
    }
    default:
        break;
atraczyk's avatar
atraczyk committed
413
    }
414
415
416
417

    _accountCreationMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
    _accountsMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
    _accountsMenuButton__Checked(nullptr, nullptr);
Nicolas Jager's avatar
Nicolas Jager committed
418
419
420
421
422
}


void RingClientUWP::Views::SmartPanel::_createAccountNo__Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
atraczyk's avatar
atraczyk committed
423
424
    _accountsMenuButton_->IsChecked = false;
    _accountsMenuButton__Unchecked(nullptr,nullptr);
Nicolas Jager's avatar
Nicolas Jager committed
425
426
}

427
428
/* using the usual selection behaviour doesn't allow us to deselect by simple click. The selection is managed
   by Grid_PointerReleased */
Nicolas Jager's avatar
Nicolas Jager committed
429
430
431
void
SmartPanel::_smartList__SelectionChanged(Platform::Object^ sender, Windows::UI::Xaml::Controls::SelectionChangedEventArgs^ e)
{
432
433
434
    auto listbox = dynamic_cast<ListBox^>(sender); // same as _smartList_
    listbox->SelectedItem = nullptr;
    return;
Nicolas Jager's avatar
Nicolas Jager committed
435
436
437
438
439
440
}

void
SmartPanel::_accountList__SelectionChanged(Platform::Object^ sender, Windows::UI::Xaml::Controls::SelectionChangedEventArgs^ e)
{
    auto listbox = safe_cast<ListBox^>(sender);
441
442
443
444
445
446
447
448
449
450
451
452
453
454
    // disable deselction from listbox
    if (listbox->SelectedItem == nullptr)
    {
        if (e->RemovedItems->Size > 0)
        {
            Object^ itemToReselect = e->RemovedItems->GetAt(0);
            for each (auto item in listbox->Items) {
                if (item == itemToReselect) {
                    listbox->SelectedItem = itemToReselect;
                    continue;
                }
            }
        }
    }
Nicolas Jager's avatar
Nicolas Jager committed
455
456
    auto account = safe_cast<AccountListItem^>(listbox->SelectedItem);
    AccountListItemsViewModel::instance->_selectedItem = account;
457

Nicolas Jager's avatar
Nicolas Jager committed
458
459
460
    updatePageContent();
}

Nicolas Jager's avatar
Nicolas Jager committed
461
// (XXX) use only KeyUp
Nicolas Jager's avatar
Nicolas Jager committed
462
463
464
void RingClientUWP::Views::SmartPanel::_ringTxtBx__KeyDown(Platform::Object^ sender, Windows::UI::Xaml::Input::KeyRoutedEventArgs^ e)
{
    /* add contact, test purpose but will be reused later in some way */
Nicolas Jager's avatar
Nicolas Jager committed
465
466
467
468
469
470
471
472
    //if (e->Key == Windows::System::VirtualKey::Enter && !_ringTxtBx_->Text->IsEmpty()) {
    //    for (auto it : SmartPanelItemsViewModel::instance->itemsList) {
    //        if (it->_contact->name_ == _ringTxtBx_->Text) {
    //            _smartList_->SelectedItem = it;
    //            _ringTxtBx_->Text = "";
    //            return;
    //        }
    //    }
473

Nicolas Jager's avatar
Nicolas Jager committed
474
475
476
477
478
    //    /* if the string has 40 chars, we simply consider it as a ring id. It has to be improved */
    //    if (_ringTxtBx_->Text->Length() == 40) {
    //        ContactsViewModel::instance->addNewContact(_ringTxtBx_->Text, _ringTxtBx_->Text);
    //        _ringTxtBx_->Text = "";
    //    }
479
480


Nicolas Jager's avatar
Nicolas Jager committed
481
482
    //    RingD::instance->lookUpName(_ringTxtBx_->Text);
    //}
Nicolas Jager's avatar
Nicolas Jager committed
483
}
484

485
486
void RingClientUWP::Views::SmartPanel::_ringTxtBx__Click(Platform::Object^ sender, Windows::UI::Xaml::Input::KeyRoutedEventArgs^ e)
{
487
    RingD::instance->lookUpName(_ringTxtBx_->Text);
488
489
}

490
491
void
RingClientUWP::Views::SmartPanel::_rejectIncomingCallBtn__Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
492
493
{
    auto button = dynamic_cast<Button^>(e->OriginalSource);
494
495
496
    if (button) {
        auto item = dynamic_cast<SmartPanelItem^>(button->DataContext);
        if (item) {
497
498
            auto callId = item->_callId;
            RingD::instance->refuseIncommingCall(callId);
499
500
        }
    }
501
502
}

503
504
void
RingClientUWP::Views::SmartPanel::_acceptIncomingCallBtn__Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
505
506
{
    auto button = dynamic_cast<Button^>(e->OriginalSource);
507
508
509
    if (button) {
        auto item = dynamic_cast<SmartPanelItem^>(button->DataContext);
        if (item) {
510
            auto callId = item->_callId;
511
512
513
514
515

            for (auto it : SmartPanelItemsViewModel::instance->itemsList)
                if (it->_callStatus != CallStatus::IN_PROGRESS)
                    RingD::instance->pauseCall(Utils::toString(it->_callId));

516

517
            RingD::instance->acceptIncommingCall(callId);
518
519
        }
    }
Nicolas Jager's avatar
Nicolas Jager committed
520
521
522
523
524
525
}

void
SmartPanel::_callContact__Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
    auto button = dynamic_cast<Button^>(e->OriginalSource);
526
    if (button) {
527
528
529
        /* force to hide the button, avoid attempting to call several times... */
        button->Visibility = Windows::UI::Xaml::Visibility::Collapsed;

atraczyk's avatar
atraczyk committed
530
531
        _settingsMenuButton_->Visibility = VIS::Collapsed;

532
533
534
535
        auto item = dynamic_cast<SmartPanelItem^>(button->DataContext);
        if (item) {
            auto contact = item->_contact;
            if (contact)
536
537
538
539
540
            {
                for (auto it : SmartPanelItemsViewModel::instance->itemsList)
                    if (it->_callStatus == CallStatus::IN_PROGRESS)
                        RingD::instance->pauseCall(Utils::toString(it->_callId));

541
                if (item->_callStatus == CallStatus::ENDED || item->_callStatus == CallStatus::NONE) {
Nicolas Jager's avatar
Nicolas Jager committed
542
                    item->_callStatus = CallStatus::OUTGOING_REQUESTED;
543
                    RingD::instance->placeCall(contact);
Nicolas Jager's avatar
Nicolas Jager committed
544
                    item->_contact->_lastTime = "looking for " + item->_contact->_name + ".";
545
546
                }

547
548
549
550
551
552
553
                /* move the item of the top of the list */
                unsigned int index;
                if (_smartList_->Items->IndexOf(item, &index)) {
                    SmartPanelItemsViewModel::instance->moveItemToTheTop(item);
                    _smartList_->UpdateLayout();
                    _smartList_->ScrollIntoView(item);
                }
554
            }
555
556
        }
    }
Nicolas Jager's avatar
Nicolas Jager committed
557
558
559
560
561
}

void RingClientUWP::Views::SmartPanel::_cancelCallBtn__Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
    auto button = dynamic_cast<Button^>(e->OriginalSource);
562
563
564
565
    if (button) {
        auto item = dynamic_cast<SmartPanelItem^>(button->DataContext);
        if (item) {
            RingD::instance->cancelOutGoingCall2(item->_callId);
566
            item->_callStatus = CallStatus::TERMINATING;
567
568
569
            return;
        }
    }
Nicolas Jager's avatar
Nicolas Jager committed
570
571
572
573
574
575
576
}

void RingClientUWP::Views::SmartPanel::Grid_PointerEntered(Platform::Object^ sender, Windows::UI::Xaml::Input::PointerRoutedEventArgs^ e)
{
    auto grid = dynamic_cast<Grid^>(sender);
    auto item = dynamic_cast<SmartPanelItem^>(grid->DataContext);

Nicolas Jager's avatar
Nicolas Jager committed
577
    for (auto it : SmartPanelItemsViewModel::instance->itemsList) {
578
        it->_isHovered = false;
Nicolas Jager's avatar
Nicolas Jager committed
579
580
    }

581
    item->_isHovered = true;
Nicolas Jager's avatar
Nicolas Jager committed
582
583
584
585
586
587
588
589
}


void RingClientUWP::Views::SmartPanel::Grid_PointerExited(Platform::Object^ sender, Windows::UI::Xaml::Input::PointerRoutedEventArgs^ e)
{
    auto grid = dynamic_cast<Grid^>(sender);
    auto item = dynamic_cast<SmartPanelItem^>(grid->DataContext);

590
591
592
593
    // to avoid visual bug, do it on the whole list
    for each (auto it in SmartPanelItemsViewModel::instance->itemsList) {
        it->_isHovered = false;
    }
Nicolas Jager's avatar
Nicolas Jager committed
594
595
}

596
// refacto : rm
Nicolas Jager's avatar
Nicolas Jager committed
597
598
void RingClientUWP::Views::SmartPanel::_contactItem__PointerReleased(Platform::Object^ sender, Windows::UI::Xaml::Input::PointerRoutedEventArgs^ e)
{
599
    /*auto listBoxItem = dynamic_cast<ListBoxItem^>(sender);
Nicolas Jager's avatar
Nicolas Jager committed
600
601
602
603
604
605
    auto smartPanelItem = dynamic_cast<SmartPanelItem^>(listBoxItem->DataContext);

    if (_smartList_->SelectedItem != smartPanelItem)
        _smartList_->SelectedItem = smartPanelItem;
    else
        _smartList_->SelectedItem = nullptr;
606
    */
Nicolas Jager's avatar
Nicolas Jager committed
607
608
}

609
610
void RingClientUWP::Views::SmartPanel::generateQRcode()
{
Nicolas Jager's avatar
Nicolas Jager committed
611
    auto ringId = AccountListItemsViewModel::instance->_selectedItem->_account->ringID_;
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
    auto ringId2 = Utils::toString(ringId);

    _ringId_->Text = ringId;

    auto qrcode = QRcode_encodeString(ringId2.c_str(),
                                      0, //Let the version be decided by libqrencode
                                      QR_ECLEVEL_L, // Lowest level of error correction
                                      QR_MODE_8, // 8-bit data mode
                                      1);

    if (!qrcode) {
        WNG_("Failed to generate QR code: ");
        return;
    }

    const int STRETCH_FACTOR = 4;
    const int widthQrCode = qrcode->width;
    const int widthBitmap = STRETCH_FACTOR * widthQrCode;

    unsigned char* qrdata = qrcode->data;

    auto frame = ref new SoftwareBitmap(BitmapPixelFormat::Bgra8, widthBitmap, widthBitmap, BitmapAlphaMode::Premultiplied);

    const int BYTES_PER_PIXEL = 4;


    BitmapBuffer^ buffer = frame->LockBuffer(BitmapBufferAccessMode::ReadWrite);
    IMemoryBufferReference^ reference = buffer->CreateReference();

    Microsoft::WRL::ComPtr<IMemoryBufferByteAccess> byteAccess;
    if (SUCCEEDED(reinterpret_cast<IUnknown*>(reference)->QueryInterface(IID_PPV_ARGS(&byteAccess))))
    {
        byte* data;
        unsigned capacity;
        byteAccess->GetBuffer(&data, &capacity);

        auto desc = buffer->GetPlaneDescription(0);

        unsigned char* row, * p;
        p = qrcode->data;

        for (int u = 0 ; u < widthBitmap ; u++) {
            for (int v = 0; v < widthBitmap; v++) {
655
656
                int x = static_cast<int>((float)u / (float)widthBitmap * (float)widthQrCode);
                int y = static_cast<int>((float)v / (float)widthBitmap * (float)widthQrCode);
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677

                auto currPixelRow = desc.StartIndex + desc.Stride * u + BYTES_PER_PIXEL * v;
                row = (p + (y * widthQrCode));

                if (*(row + x) & 0x1) {
                    data[currPixelRow + 3] = 255;
                }
            }
        }

    }
    delete reference;
    delete buffer;

    auto sbSource = ref new Media::Imaging::SoftwareBitmapSource();

    sbSource->SetBitmapAsync(frame);

    _selectedAccountQrCode_->Source = sbSource;
}

Nicolas Jager's avatar
Nicolas Jager committed
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
void RingClientUWP::Views::SmartPanel::checkStateAddAccountMenu()
{
    bool isRingAccountType = (_accountTypeComboBox_->SelectedIndex == 0) ? true : false;

    bool isAccountAlias = (_accountAliasTextBox_->Text->IsEmpty()) ? false : true;

    if (isAccountAlias) {
        _accountAliasValid_->Visibility = Windows::UI::Xaml::Visibility::Visible;
        _accountAliasInvalid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
    } else {
        _accountAliasValid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
        _accountAliasInvalid_->Visibility = Windows::UI::Xaml::Visibility::Visible;
    }

    if (isRingAccountType) {
        bool isPublic = _RegisterState_->IsOn;

Nicolas Jager's avatar
Nicolas Jager committed
695
696
        bool isUsernameValid = (_usernameValid_->Visibility == Windows::UI::Xaml::Visibility::Visible
                                && !_usernameTextBox_->Text->IsEmpty()) ? true : false;
Nicolas Jager's avatar
Nicolas Jager committed
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722

        bool isPasswordValid = (_ringPasswordBoxAccountCreation_->Password->IsEmpty()) ? false : true;

        bool isRingPasswordCheck = (_ringPasswordBoxAccountCreation_->Password
                                    == _ringPasswordBoxAccountCreationCheck_->Password
                                    && isPasswordValid)
                                   ? true : false;

        if (isPasswordValid) {
            _passwordValid_->Visibility = Windows::UI::Xaml::Visibility::Visible;
            _passwordInvalid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
        }
        else {
            _passwordValid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
            _passwordInvalid_->Visibility = Windows::UI::Xaml::Visibility::Visible;
        }

        if (isRingPasswordCheck) {
            _passwordCheckValid_->Visibility = Windows::UI::Xaml::Visibility::Visible;
            _passwordCheckInvalid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
        }
        else {
            _passwordCheckValid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
            _passwordCheckInvalid_->Visibility = Windows::UI::Xaml::Visibility::Visible;
        }

Nicolas Jager's avatar
Nicolas Jager committed
723
724
725
726
727
728
729
        if (isUsernameValid) {
            _usernameValid_->Visibility = Windows::UI::Xaml::Visibility::Visible;
            _usernameInvalid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
        } else {
            _usernameValid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
            _usernameInvalid_->Visibility = Windows::UI::Xaml::Visibility::Visible;
        }
Nicolas Jager's avatar
Nicolas Jager committed
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802

        if (isPublic)
            if (isUsernameValid && isAccountAlias && isRingPasswordCheck && isPasswordValid)
                _createAccountYes_->IsEnabled = true;
            else
                _createAccountYes_->IsEnabled = false;
        else if (isAccountAlias && isRingPasswordCheck && isPasswordValid)
            _createAccountYes_->IsEnabled = true;
        else
            _createAccountYes_->IsEnabled = false;

    } else {
        if (isAccountAlias)
            _createAccountYes_->IsEnabled = true;
        else
            _createAccountYes_->IsEnabled = false;
    }

}

void RingClientUWP::Views::SmartPanel::checkStateEditionMenu()
{
    if (AccountListItemsViewModel::instance->_selectedItem == nullptr)
        return;
    bool isRingAccountType = (AccountListItemsViewModel::instance->_selectedItem->_account->accountType_ == "RING")
                             ? true : false;

    bool isAccountAlias = (_accountAliasTextBoxEdition_->Text->IsEmpty()) ? false : true;

    bool isAlreadyRegistered = (_RegisterStateEdition_->IsEnabled) ? false : true;

    if (isAccountAlias) {
        _accountAliasValidEdition_->Visibility = Windows::UI::Xaml::Visibility::Visible;
        _accountAliasInvalidEdition_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
    }
    else {
        _accountAliasValidEdition_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
        _accountAliasInvalidEdition_->Visibility = Windows::UI::Xaml::Visibility::Visible;
    }

    if (isRingAccountType) {
        bool isPublic = _RegisterStateEdition_->IsOn;

        bool isUsernameValid = (_usernameValidEdition_->Visibility == Windows::UI::Xaml::Visibility::Visible)
                               ? true : false;

        bool isPasswordValid = (_ringPasswordBoxAccountCreation_->Password->IsEmpty()) ? false : true;

        bool isRingPasswordCheck = (_ringPasswordBoxAccountCreation_->Password
                                    == _ringPasswordBoxAccountCreationCheck_->Password
                                    && isPasswordValid)
                                   ? true : false;
        if (isPublic)
            if (isUsernameValid && isAccountAlias || isAlreadyRegistered) {
                _acceptAccountModification_->IsEnabled = true;
                //_registerOnBlockchainEdition_->IsEnabled = true;
            } else {
                _acceptAccountModification_->IsEnabled = false;
                //_registerOnBlockchainEdition_->IsEnabled = false;
            }
        else if (isAccountAlias)
            _acceptAccountModification_->IsEnabled = true;
        else
            _acceptAccountModification_->IsEnabled = false;
    }
    else {
        if (isAccountAlias)
            _acceptAccountModification_->IsEnabled = true;
        else
            _acceptAccountModification_->IsEnabled = false;
    }
}

803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
void RingClientUWP::Views::SmartPanel::ringTxtBxPlaceHolderDelay(String^ placeHolderText, int delayInMilliSeconds)
{
    _ringTxtBx_->PlaceholderText = placeHolderText;
    TimeSpan delay;
    delay.Duration = 10000 * delayInMilliSeconds;
    ThreadPoolTimer^ delayTimer = ThreadPoolTimer::CreateTimer(
                                      ref new TimerElapsedHandler([this](ThreadPoolTimer^ source)
    {
        Dispatcher->RunAsync(CoreDispatcherPriority::High,
                             ref new DispatchedHandler([this]()
        {
            _ringTxtBx_->PlaceholderText = "";
        }));
    }), delay);
}

819
820
821
822
823
824
825
826
827
828
void RingClientUWP::Views::SmartPanel::showLinkThisDeviceStep1()
{
    _step1Menu_->Visibility = Windows::UI::Xaml::Visibility::Visible;
    _step2Menu_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;

    _nextstep_->Visibility = Windows::UI::Xaml::Visibility::Visible;
    _addAccountYes_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
    _addAccountNo_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
}

Nicolas Jager's avatar
Nicolas Jager committed
829
830
831
Object ^ RingClientUWP::Views::IncomingVisibility::Convert(Object ^ value, Windows::UI::Xaml::Interop::TypeName targetType, Object ^ parameter, String ^ language)
{
    auto state = static_cast<CallStatus>(value);
832

833
    if (state == CallStatus::INCOMING_RINGING)
Nicolas Jager's avatar
Nicolas Jager committed
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
        return  Windows::UI::Xaml::Visibility::Visible;
    else
        return  Windows::UI::Xaml::Visibility::Collapsed;
}

Object ^ RingClientUWP::Views::IncomingVisibility::ConvertBack(Object ^ value, Windows::UI::Xaml::Interop::TypeName targetType, Object ^ parameter, String ^ language)
{
    throw ref new Platform::NotImplementedException();
}

RingClientUWP::Views::IncomingVisibility::IncomingVisibility()
{}


Object ^ RingClientUWP::Views::OutGoingVisibility::Convert(Object ^ value, Windows::UI::Xaml::Interop::TypeName targetType, Object ^ parameter, String ^ language)
{
    auto state = static_cast<CallStatus>(value);

852
853
854
    if (state == CallStatus::SEARCHING
            || state == CallStatus::OUTGOING_RINGING
            || state == CallStatus::OUTGOING_REQUESTED)
Nicolas Jager's avatar
Nicolas Jager committed
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
        return  Windows::UI::Xaml::Visibility::Visible;
    else
        return  Windows::UI::Xaml::Visibility::Collapsed;
}

Object ^ RingClientUWP::Views::OutGoingVisibility::ConvertBack(Object ^ value, Windows::UI::Xaml::Interop::TypeName targetType, Object ^ parameter, String ^ language)
{
    throw ref new Platform::NotImplementedException();
}

RingClientUWP::Views::OutGoingVisibility::OutGoingVisibility()
{}

Object ^ RingClientUWP::Views::HasAnActiveCall::Convert(Object ^ value, Windows::UI::Xaml::Interop::TypeName targetType, Object ^ parameter, String ^ language)
{
    auto state = static_cast<CallStatus>(value);

872
    if (state == CallStatus::NONE || state == CallStatus::ENDED)
Nicolas Jager's avatar
Nicolas Jager committed
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
        return Windows::UI::Xaml::Visibility::Collapsed;
    else
        return Windows::UI::Xaml::Visibility::Visible;
}

Object ^ RingClientUWP::Views::HasAnActiveCall::ConvertBack(Object ^ value, Windows::UI::Xaml::Interop::TypeName targetType, Object ^ parameter, String ^ language)
{
    throw ref new Platform::NotImplementedException();
}

RingClientUWP::Views::HasAnActiveCall::HasAnActiveCall()
{}

Object ^ RingClientUWP::Views::NewMessageBubleNotification::Convert(Object ^ value, Windows::UI::Xaml::Interop::TypeName targetType, Object ^ parameter, String ^ language)
{
    auto unreadMessages = static_cast<uint32>(value);

    if (unreadMessages > 0)
        return Windows::UI::Xaml::Visibility::Visible;

    return Windows::UI::Xaml::Visibility::Collapsed;
}

Object ^ RingClientUWP::Views::NewMessageBubleNotification::ConvertBack(Object ^ value, Windows::UI::Xaml::Interop::TypeName targetType, Object ^ parameter, String ^ language)
{
    throw ref new Platform::NotImplementedException();
}

RingClientUWP::Views::NewMessageBubleNotification::NewMessageBubleNotification()
{}
903
904
905

void RingClientUWP::Views::SmartPanel::_devicesMenuButton__Unchecked(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
Nicolas Jager's avatar
Nicolas Jager committed
906
    menuOpen = MenuOpen::CONTACTS_LIST;
907
    _devicesMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
908
    _addingDeviceGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
Nicolas Jager's avatar
Nicolas Jager committed
909
910
911
912
913
    _waitingForPin_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
    _passwordForPinGenerator_->Password = "";
    // refacto : do something better...
    _waitingAndResult_->Text = "Exporting account on the Ring...";

atraczyk's avatar
atraczyk committed
914
    _smartGrid_->Visibility = Windows::UI::Xaml::Visibility::Visible;
915
916
917
918
919
}


void RingClientUWP::Views::SmartPanel::_devicesMenuButton__Checked(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
Nicolas Jager's avatar
Nicolas Jager committed
920
    menuOpen = MenuOpen::DEVICE;
atraczyk's avatar
atraczyk committed
921
    _settingsMenu_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
922
923
    _settingsMenuButton_->IsChecked = false;

Nicolas Jager's avatar
Nicolas Jager committed
924
925
926
    _waitingDevicesList_->Visibility = Windows::UI::Xaml::Visibility::Visible;
    _devicesIdList_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;

927
928
929
930
931
932
933
934
935
    auto account = AccountListItemsViewModel::instance->_selectedItem->_account;

    _deviceId_->Text = account->_deviceId;
    if (_deviceId_->Text->IsEmpty()) {
        _deviceId_->Text = "No device id found!";
        ERR_("device Id not found for account " + Utils::toString(account->_deviceId));
    }

    RingD::instance->askToRefreshKnownDevices(account->accountID_);
Nicolas Jager's avatar
Nicolas Jager committed
936

937
938
939
    _shareMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
    _accountsMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
    _accountCreationMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
940
    _devicesMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Visible;
941
942
943
    _addingDeviceGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
    _accountsMenuButton_->IsChecked = false;
    _shareMenuButton_->IsChecked = false;
atraczyk's avatar
atraczyk committed
944
945

    _smartGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
946
947
948
949
950
}


void RingClientUWP::Views::SmartPanel::_addDevice__Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
951
952
    _devicesMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
    _addingDeviceGrid_->Visibility = Windows::UI::Xaml::Visibility::Visible;
Nicolas Jager's avatar
Nicolas Jager committed
953
    _closePin_->Visibility = Windows::UI::Xaml::Visibility::Visible;
954
955
956
957
958
}


void RingClientUWP::Views::SmartPanel::OndevicesListRefreshed(Platform::Collections::Vector<Platform::String ^, std::equal_to<Platform::String ^>, true> ^devicesList)
{
Nicolas Jager's avatar
Nicolas Jager committed
959
    _waitingDevicesList_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
Nicolas Jager's avatar
Nicolas Jager committed
960
    AccountListItemsViewModel::instance->_selectedItem->_account->_devicesIdList = devicesList;
961
    _devicesIdList_->ItemsSource = devicesList;
Nicolas Jager's avatar
Nicolas Jager committed
962
    _devicesIdList_->Visibility = Windows::UI::Xaml::Visibility::Visible;
963
964
965
966
967
968
969
970
}


void RingClientUWP::Views::SmartPanel::_pinGeneratorYes__Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
    _addingDeviceGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
    _waitingForPin_->Visibility = Windows::UI::Xaml::Visibility::Visible;

Nicolas Jager's avatar
Nicolas Jager committed
971
    auto accountId = AccountListItemsViewModel::instance->_selectedItem->_account->accountID_;
972
    auto password = _passwordForPinGenerator_->Password;
Nicolas Jager's avatar
Nicolas Jager committed
973
974
975
976
    _passwordForPinGenerator_->Password = "";

    /* hide the button while we are waiting... */
    _closePin_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
977
978
979
980
981
982
983
984
985

    RingD::instance->askToExportOnRing(accountId, password);
}


void RingClientUWP::Views::SmartPanel::_pinGeneratorNo__Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
    _addingDeviceGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
    _devicesMenuButton_->IsChecked = false;
Nicolas Jager's avatar
Nicolas Jager committed
986
    _passwordForPinGenerator_->Password = "";
987
}
988

989
990
991
992

void RingClientUWP::Views::SmartPanel::OnexportOnRingEnded(Platform::String ^accountId, Platform::String ^pin)
{
    _waitingAndResult_->Text = pin;
Nicolas Jager's avatar
Nicolas Jager committed
993
994
995
996
997
998
999
1000
    _closePin_->Visibility = Windows::UI::Xaml::Visibility::Visible;

}


void RingClientUWP::Views::SmartPanel::_closePin__Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
    _waitingForPin_->Visibility = Windows::UI::Xaml::Visibility::Collapsed;