/*************************************************************************** | |
* 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" | |
#include <string> // move it | |
#include "SmartPanel.xaml.h" | |
#include "qrencode.h" | |
#include <MemoryBuffer.h> // IMemoryBufferByteAccess | |
using namespace Platform; | |
using namespace RingClientUWP; | |
using namespace RingClientUWP::Controls; | |
using namespace RingClientUWP::Views; | |
using namespace RingClientUWP::ViewModel; | |
using namespace Windows::Media::Capture; | |
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; | |
using namespace Windows::Graphics::Imaging; | |
using namespace Windows::Foundation; | |
using namespace Concurrency; | |
using namespace Platform::Collections; | |
using namespace Windows::ApplicationModel::Core; | |
using namespace Windows::Storage; | |
using namespace Windows::UI::Core; | |
SmartPanel::SmartPanel() | |
{ | |
InitializeComponent(); | |
/* populate accounts listBox*/ | |
_accountsList_->ItemsSource = AccountListItemsViewModel::instance->itemsList; | |
/* populate the smartlist */ | |
_smartList_->ItemsSource = SmartPanelItemsViewModel::instance->itemsList; | |
/* populate the device list*/ | |
/// _devicesIdList_ // not used so far | |
/* connect delegates */ | |
Configuration::UserPreferences::instance->selectIndex += ref new SelectIndex([this](int index) { | |
if (_accountsList_) { | |
auto accountsListSize = dynamic_cast<Vector<AccountListItem^>^>(_accountsList_->ItemsSource)->Size; | |
if (accountsListSize > index) | |
_accountsList_->SelectedIndex = index; | |
else | |
_accountsList_->SelectedIndex = 0; | |
} | |
}); | |
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); | |
}); | |
AccountsViewModel::instance->updateScrollView += ref new UpdateScrollView([this]() { | |
_accountsListScrollView_->UpdateLayout(); | |
_accountsListScrollView_->ScrollToVerticalOffset(_accountsListScrollView_->ScrollableHeight); | |
}); | |
RingD::instance->incomingCall += ref new RingClientUWP::IncomingCall([&]( | |
String^ accountId, String^ callId, String^ from) { | |
///auto from = call->from; | |
auto contact = ContactsViewModel::instance->findContactByName(from); | |
if (contact == nullptr) | |
contact = ContactsViewModel::instance->addNewContact(from, from); // contact checked inside addNewContact. | |
if (contact == nullptr) { | |
ERR_("contact not handled!"); | |
return; | |
} | |
auto item = SmartPanelItemsViewModel::instance->findItem(contact); | |
item->_callId = callId; | |
}); | |
RingD::instance->stateChange += ref new StateChange([this](String^ callId, CallStatus state, int code) { | |
auto item = SmartPanelItemsViewModel::instance->findItem(callId); | |
if (!item) { | |
WNG_("item not found"); | |
return; | |
} | |
item->_callStatus = state; | |
switch (state) { | |
case CallStatus::NONE: | |
case CallStatus::ENDED: | |
{ | |
item->_callId = ""; | |
break; | |
} | |
case CallStatus::IN_PROGRESS: | |
{ | |
_smartList_->SelectedItem = item; | |
summonVideoPage(); | |
break; | |
} | |
default: | |
break; | |
} | |
}); | |
RingD::instance->devicesListRefreshed += ref new RingClientUWP::DevicesListRefreshed(this, &RingClientUWP::Views::SmartPanel::OndevicesListRefreshed); | |
ContactsViewModel::instance->contactAdded += ref new ContactAdded([this](Contact^ contact) { | |
auto smartPanelItem = ref new SmartPanelItem(); | |
smartPanelItem->_contact = contact; | |
SmartPanelItemsViewModel::instance->itemsList->Append(smartPanelItem); | |
}); | |
RingD::instance->exportOnRingEnded += ref new RingClientUWP::ExportOnRingEnded(this, &RingClientUWP::Views::SmartPanel::OnexportOnRingEnded); | |
RingD::instance->accountUpdated += ref new RingClientUWP::AccountUpdated(this, &RingClientUWP::Views::SmartPanel::OnaccountUpdated); | |
} | |
void | |
RingClientUWP::Views::SmartPanel::updatePageContent() | |
{ | |
auto accountListItem = AccountListItemsViewModel::instance->_selectedItem; | |
if (!accountListItem) | |
return; | |
auto name = accountListItem->_account->name_; // refacto remove name variable and use the link directly on the next line... like _upnpnState..._ | |
accountListItem->_isSelected = true; | |
Configuration::UserPreferences::instance->PREF_ACCOUNT_INDEX = _accountsList_->SelectedIndex; | |
Configuration::UserPreferences::instance->save(); | |
_selectedAccountName_->Text = name; // refacto : bind this in xaml directly | |
/// _devicesIdList_->ItemsSource = account->_devicesIdList; | |
_deviceId_->Text = accountListItem->_account->_deviceId; /* this is the current device ... | |
... in the way to get all associated devices, we have to querry the daemon : */ | |
_devicesMenuButton_->Visibility = (accountListItem->_account->accountType_ == "RING") | |
? Windows::UI::Xaml::Visibility::Visible | |
: Windows::UI::Xaml::Visibility::Collapsed; | |
_shareMenuButton_->Visibility = (accountListItem->_account->accountType_ == "RING") | |
? Windows::UI::Xaml::Visibility::Visible | |
: Windows::UI::Xaml::Visibility::Collapsed; | |
_upnpState_->IsOn = accountListItem->_account->_upnpState; | |
} | |
void RingClientUWP::Views::SmartPanel::_accountsMenuButton__Checked(Object^ sender, RoutedEventArgs^ e) | |
{ | |
_shareMenuButton_->IsChecked = false; | |
_devicesMenuButton_->IsChecked = false; | |
_accountsMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Visible; | |
_accountCreationMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed; | |
_devicesMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed; | |
_addingDeviceGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed; | |
} | |
void RingClientUWP::Views::SmartPanel::_accountsMenuButton__Unchecked(Object^ sender, RoutedEventArgs^ e) | |
{ | |
_accountsMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed; | |
_accountCreationMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed; | |
_accountEditionMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed; | |
} | |
void RingClientUWP::Views::SmartPanel::_settings__Checked(Object^ sender, RoutedEventArgs^ e) | |
{ | |
_smartGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed; | |
_settings_->Visibility = Windows::UI::Xaml::Visibility::Visible; | |
} | |
void RingClientUWP::Views::SmartPanel::_settings__Unchecked(Object^ sender, RoutedEventArgs^ e) | |
{ | |
_settings_->Visibility = Windows::UI::Xaml::Visibility::Collapsed; | |
_smartGrid_->Visibility = Windows::UI::Xaml::Visibility::Visible; | |
} | |
void RingClientUWP::Views::SmartPanel::setMode(RingClientUWP::Views::SmartPanel::Mode mode) | |
{ | |
if (mode == RingClientUWP::Views::SmartPanel::Mode::Normal) { | |
_rowRingTxtBx_->Height = 40; | |
_selectedAccountAvatarContainer_->Height = 80; | |
_selectedAccountAvatarColumn_->Width = 90; | |
_selectedAccountRow_->Height = 90; | |
} | |
else { | |
_rowRingTxtBx_->Height = 0; | |
_selectedAccountAvatarContainer_->Height = 50; | |
_selectedAccountAvatarColumn_->Width = 60; | |
_selectedAccountRow_->Height = 60; | |
} | |
_selectedAccountAvatarContainer_->Width = _selectedAccountAvatarContainer_->Height; | |
_settingsTBtn_->IsChecked = false; | |
_accountsMenuButton_->IsChecked = false; | |
_shareMenuButton_->IsChecked = false; | |
} | |
void RingClientUWP::Views::SmartPanel::_shareMenuButton__Checked(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e) | |
{ | |
_shareMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Visible; | |
_accountsMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed; | |
_accountCreationMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed; | |
_accountEditionMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed; | |
_devicesMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed; | |
_addingDeviceGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed; | |
_accountsMenuButton_->IsChecked = false; | |
_devicesMenuButton_->IsChecked = false; | |
generateQRcode(); | |
} | |
void RingClientUWP::Views::SmartPanel::_shareMenuButton__Unchecked(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e) | |
{ | |
_shareMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed; | |
_accountsMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed; | |
_accountEditionMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed; | |
_accountCreationMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed; | |
} | |
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; | |
} | |
void RingClientUWP::Views::SmartPanel::_createAccountYes__Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e) | |
{ | |
switch (_accountTypeComboBox_->SelectedIndex) | |
{ | |
case 0: | |
{ | |
CoreApplication::MainView->CoreWindow->Dispatcher->RunAsync(CoreDispatcherPriority::High, | |
ref new DispatchedHandler([=]() { | |
auto frame = dynamic_cast<Windows::UI::Xaml::Controls::Frame^>(Window::Current->Content); | |
dynamic_cast<RingClientUWP::MainPage^>(frame->Content)->showLoadingOverlay(true, true); | |
})); | |
RingD::instance->createRINGAccount(_aliasTextBox_->Text); | |
_accountCreationMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed; | |
_accountsMenuButton__Checked(nullptr, nullptr); | |
break; | |
} | |
break; | |
case 1: | |
{ | |
RingD::instance->createSIPAccount(_aliasTextBox_->Text); | |
_accountCreationMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed; | |
_accountsMenuButton__Checked(nullptr, nullptr); | |
break; | |
} | |
default: | |
break; | |
} | |
_aliasTextBox_->Text = ""; | |
} | |
void RingClientUWP::Views::SmartPanel::_createAccountNo__Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e) | |
{ | |
_accountsMenuButton_->IsChecked = false; | |
_accountsMenuButton__Unchecked(nullptr,nullptr); | |
} | |
void | |
SmartPanel::_smartList__SelectionChanged(Platform::Object^ sender, Windows::UI::Xaml::Controls::SelectionChangedEventArgs^ e) | |
{ | |
auto listbox = dynamic_cast<ListBox^>(sender); | |
auto item = dynamic_cast<SmartPanelItem^>(listbox->SelectedItem); | |
SmartPanelItemsViewModel::instance->_selectedItem = item; | |
if (!item) { | |
summonWelcomePage(); | |
return; | |
} | |
auto contact = item->_contact; | |
if (item->_callStatus == CallStatus::IN_PROGRESS) { | |
if (contact) { | |
contact->_unreadMessages = 0; | |
ContactsViewModel::instance->saveContactsToFile(); | |
} | |
summonVideoPage(); | |
return; | |
} | |
if (contact) { | |
summonMessageTextPage(); | |
contact->_unreadMessages = 0; | |
ContactsViewModel::instance->saveContactsToFile(); | |
return; | |
} | |
} | |
void | |
SmartPanel::_accountList__SelectionChanged(Platform::Object^ sender, Windows::UI::Xaml::Controls::SelectionChangedEventArgs^ e) | |
{ | |
auto listbox = safe_cast<ListBox^>(sender); | |
// 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; | |
} | |
} | |
} | |
} | |
auto account = safe_cast<AccountListItem^>(listbox->SelectedItem); | |
AccountListItemsViewModel::instance->_selectedItem = account; | |
updatePageContent(); | |
} | |
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 */ | |
if (e->Key == Windows::System::VirtualKey::Enter && !_ringTxtBx_->Text->IsEmpty()) { | |
ContactsViewModel::instance->addNewContact(_ringTxtBx_->Text, _ringTxtBx_->Text); | |
_ringTxtBx_->Text = ""; | |
} | |
} | |
void RingClientUWP::Views::SmartPanel::_ringTxtBx__Click(Platform::Object^ sender, Windows::UI::Xaml::Input::KeyRoutedEventArgs^ e) | |
{ | |
ContactsViewModel::instance->addNewContact(_ringTxtBx_->Text, _ringTxtBx_->Text); | |
_ringTxtBx_->Text = ""; | |
} | |
void | |
RingClientUWP::Views::SmartPanel::_rejectIncomingCallBtn__Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e) | |
{ | |
auto button = dynamic_cast<Button^>(e->OriginalSource); | |
if (button) { | |
auto item = dynamic_cast<SmartPanelItem^>(button->DataContext); | |
if (item) { | |
auto callId = item->_callId; | |
RingD::instance->refuseIncommingCall(callId); | |
} | |
} | |
} | |
void | |
RingClientUWP::Views::SmartPanel::_acceptIncomingCallBtn__Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e) | |
{ | |
auto button = dynamic_cast<Button^>(e->OriginalSource); | |
if (button) { | |
auto item = dynamic_cast<SmartPanelItem^>(button->DataContext); | |
if (item) { | |
auto callId = item->_callId; | |
RingD::instance->acceptIncommingCall(callId); | |
} | |
} | |
} | |
void | |
SmartPanel::_callContact__Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e) | |
{ | |
auto button = dynamic_cast<Button^>(e->OriginalSource); | |
if (button) { | |
/* force to hide the button, avoid attempting to call several times... */ | |
button->Visibility = Windows::UI::Xaml::Visibility::Collapsed; | |
auto item = dynamic_cast<SmartPanelItem^>(button->DataContext); | |
if (item) { | |
auto contact = item->_contact; | |
if (contact) | |
RingD::instance->placeCall(contact); | |
} | |
} | |
} | |
void RingClientUWP::Views::SmartPanel::_cancelCallBtn__Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e) | |
{ | |
auto button = dynamic_cast<Button^>(e->OriginalSource); | |
if (button) { | |
auto item = dynamic_cast<SmartPanelItem^>(button->DataContext); | |
if (item) { | |
RingD::instance->cancelOutGoingCall2(item->_callId); | |
item->_callStatus = CallStatus::TERMINATING; | |
return; | |
} | |
} | |
} | |
void RingClientUWP::Views::SmartPanel::Grid_PointerEntered(Platform::Object^ sender, Windows::UI::Xaml::Input::PointerRoutedEventArgs^ e) | |
{ | |
auto grid = dynamic_cast<Grid^>(sender); | |
auto listBoxItem = dynamic_cast<ListBoxItem^>(sender); | |
auto item = dynamic_cast<SmartPanelItem^>(grid->DataContext); | |
if (item->_callId->IsEmpty()) | |
item->_hovered = Windows::UI::Xaml::Visibility::Visible; | |
} | |
void RingClientUWP::Views::SmartPanel::Grid_PointerExited(Platform::Object^ sender, Windows::UI::Xaml::Input::PointerRoutedEventArgs^ e) | |
{ | |
auto listBoxItem = dynamic_cast<ListBoxItem^>(sender); | |
auto grid = dynamic_cast<Grid^>(sender); | |
auto item = dynamic_cast<SmartPanelItem^>(grid->DataContext); | |
item->_hovered = Windows::UI::Xaml::Visibility::Collapsed; | |
} | |
void RingClientUWP::Views::SmartPanel::_contactItem__PointerReleased(Platform::Object^ sender, Windows::UI::Xaml::Input::PointerRoutedEventArgs^ e) | |
{ | |
auto listBoxItem = dynamic_cast<ListBoxItem^>(sender); | |
auto smartPanelItem = dynamic_cast<SmartPanelItem^>(listBoxItem->DataContext); | |
if (_smartList_->SelectedItem != smartPanelItem) | |
_smartList_->SelectedItem = smartPanelItem; | |
else | |
_smartList_->SelectedItem = nullptr; | |
} | |
void RingClientUWP::Views::SmartPanel::generateQRcode() | |
{ | |
auto ringId = AccountListItemsViewModel::instance->_selectedItem->_account->ringID_; | |
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++) { | |
int x = (float)u / (float)widthBitmap * (float)widthQrCode; | |
int y = (float)v / (float)widthBitmap * (float)widthQrCode; | |
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; | |
} | |
Object ^ RingClientUWP::Views::IncomingVisibility::Convert(Object ^ value, Windows::UI::Xaml::Interop::TypeName targetType, Object ^ parameter, String ^ language) | |
{ | |
auto state = static_cast<CallStatus>(value); | |
if (state == CallStatus::INCOMING_RINGING) | |
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); | |
if (state == CallStatus::SEARCHING || state == CallStatus::OUTGOING_RINGING) | |
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); | |
if (state == CallStatus::NONE || state == CallStatus::ENDED) | |
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() | |
{} | |
void RingClientUWP::Views::SmartPanel::_devicesMenuButton__Unchecked(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e) | |
{ | |
_devicesMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed; | |
_addingDeviceGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed; | |
_waitingForPin_->Visibility = Windows::UI::Xaml::Visibility::Collapsed; | |
_passwordForPinGenerator_->Password = ""; | |
// refacto : do something better... | |
_waitingAndResult_->Text = "Exporting account on the Ring..."; | |
} | |
void RingClientUWP::Views::SmartPanel::_devicesMenuButton__Checked(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e) | |
{ | |
_waitingDevicesList_->Visibility = Windows::UI::Xaml::Visibility::Visible; | |
_devicesIdList_->Visibility = Windows::UI::Xaml::Visibility::Collapsed; | |
auto accountId = AccountListItemsViewModel::instance->_selectedItem->_account->accountID_; | |
RingD::instance->askToRefreshKnownDevices(accountId); | |
_shareMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed; | |
_accountsMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed; | |
_accountCreationMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed; | |
_devicesMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Visible; | |
_addingDeviceGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed; | |
_accountsMenuButton_->IsChecked = false; | |
_shareMenuButton_->IsChecked = false; | |
} | |
void RingClientUWP::Views::SmartPanel::_addDevice__Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e) | |
{ | |
_devicesMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed; | |
_addingDeviceGrid_->Visibility = Windows::UI::Xaml::Visibility::Visible; | |
_closePin_->Visibility = Windows::UI::Xaml::Visibility::Visible; | |
} | |
void RingClientUWP::Views::SmartPanel::OndevicesListRefreshed(Platform::Collections::Vector<Platform::String ^, std::equal_to<Platform::String ^>, true> ^devicesList) | |
{ | |
_waitingDevicesList_->Visibility = Windows::UI::Xaml::Visibility::Collapsed; | |
AccountListItemsViewModel::instance->_selectedItem->_account->_devicesIdList = devicesList; | |
_devicesIdList_->ItemsSource = devicesList; | |
_devicesIdList_->Visibility = Windows::UI::Xaml::Visibility::Visible; | |
} | |
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; | |
auto accountId = AccountListItemsViewModel::instance->_selectedItem->_account->accountID_; | |
auto password = _passwordForPinGenerator_->Password; | |
_passwordForPinGenerator_->Password = ""; | |
/* hide the button while we are waiting... */ | |
_closePin_->Visibility = Windows::UI::Xaml::Visibility::Collapsed; | |
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; | |
_passwordForPinGenerator_->Password = ""; | |
} | |
void RingClientUWP::Views::SmartPanel::OnexportOnRingEnded(Platform::String ^accountId, Platform::String ^pin) | |
{ | |
_waitingAndResult_->Text = pin; | |
_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; | |
_devicesMenuButton_->IsChecked = false; | |
// refacto : do something better... | |
_waitingAndResult_->Text = "Exporting account on the Ring..."; | |
} | |
void RingClientUWP::Views::SmartPanel::_shareMenuDone__Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e) | |
{ | |
_shareMenuButton_->IsChecked = false; | |
_shareMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed; | |
} | |
Object ^ RingClientUWP::Views::AccountTypeToSourceImage::Convert(Object ^ value, Windows::UI::Xaml::Interop::TypeName targetType, Object ^ parameter, String ^ language) | |
{ | |
auto accountType = dynamic_cast<String^>(value); | |
Uri^ uri = (accountType == "RING") | |
? ref new Uri("ms-appx:///Assets/AccountTypeRING.png") | |
: ref new Uri("ms-appx:///Assets/AccountTypeSIP.png"); | |
return ref new BitmapImage(uri); | |
} | |
Object ^ RingClientUWP::Views::AccountTypeToSourceImage::ConvertBack(Object ^ value, Windows::UI::Xaml::Interop::TypeName targetType, Object ^ parameter, String ^ language) | |
{ | |
throw ref new Platform::NotImplementedException(); | |
} | |
RingClientUWP::Views::AccountTypeToSourceImage::AccountTypeToSourceImage() | |
{} | |
Object ^ RingClientUWP::Views::AccountSelectedToVisibility::Convert(Object ^ value, Windows::UI::Xaml::Interop::TypeName targetType, Object ^ parameter, String ^ language) | |
{ | |
//auto accountId = static_cast<bool(value); | |
if (/*AccountListItemsViewModel::instance->_selectedItem->_account->_isSelected ==*/ (bool)value == true) | |
return Windows::UI::Xaml::Visibility::Visible; | |
return Windows::UI::Xaml::Visibility::Collapsed; | |
} | |
Object ^ RingClientUWP::Views::AccountSelectedToVisibility::ConvertBack(Object ^ value, Windows::UI::Xaml::Interop::TypeName targetType, Object ^ parameter, String ^ language) | |
{ | |
throw ref new Platform::NotImplementedException(); | |
} | |
RingClientUWP::Views::AccountSelectedToVisibility::AccountSelectedToVisibility() | |
{} | |
void RingClientUWP::Views::SmartPanel::_editAccountMenuButton__Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e) | |
{ | |
auto account = AccountListItemsViewModel::instance->_selectedItem->_account; | |
_aliasTextBoxEditionMenu_->Text = account->name_; | |
_accountEditionMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Visible; | |
} | |
void RingClientUWP::Views::SmartPanel::_acceptAccountModification__Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e) | |
{ | |
auto account = AccountListItemsViewModel::instance->_selectedItem->_account; | |
auto accountId = account->accountID_; | |
// mettre ca en visibility du bouton delete | |
auto accountsListSize = dynamic_cast<Vector<AccountListItem^>^>(_accountsList_->ItemsSource)->Size; | |
if (_deleteAccountBtnEditionMenu_->IsChecked && accountsListSize > 1) { | |
RingD::instance->deleteAccount(accountId); | |
/* rebuild a new list of accounts without the one to delete */ | |
auto newAccountList = ref new Vector<AccountListItem^>(); | |
for each (AccountListItem^ item in AccountListItemsViewModel::instance->itemsList) { | |
if (item->_account->accountID_ != accountId) | |
newAccountList->Append(item); | |
} | |
_accountsList_->ItemsSource = newAccountList; | |
} else { | |
account->name_ = _aliasTextBoxEditionMenu_->Text; | |
account->_upnpState = _upnpState_->IsOn; | |
RingD::instance->updateAccount(accountId); | |
} | |
_accountEditionMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed; | |
_accountsMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed; | |
_accountsMenuButton_->IsChecked = false; | |
} | |
void RingClientUWP::Views::SmartPanel::_cancelAccountModification__Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e) | |
{ | |
_accountEditionMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed; | |
} | |
void RingClientUWP::Views::SmartPanel::OnaccountUpdated(RingClientUWP::Account ^account) | |
{ | |
updatePageContent(); | |
} |