diff --git a/Account.cpp b/Account.cpp index 747d7e1bc538cba81c595ddd7e38d02deda9a73b..902f6d6e990ffcaf96937b1d97d7b1bfec6d83c5 100644 --- a/Account.cpp +++ b/Account.cpp @@ -32,7 +32,10 @@ Account::Account(String^ name, String^ accountType, String^ accountID, String^ deviceId, - bool upnpState) + bool upnpState, + String^ sipHostname, + String^ sipUsername, + String^ sipPassword) { name_ = name; ringID_ = ringID; @@ -40,6 +43,10 @@ Account::Account(String^ name, accountID_ = accountID; _deviceId = deviceId; _upnpState = _upnpState; + _sipHostname = sipHostname; + _sipUsername = sipUsername; + _sipPassword = sipPassword; + } void diff --git a/Account.h b/Account.h index 565cfbe372ec7b47d71a9b958432e3190463efc0..50a5cba931c1aeb743a52e83a7d2f0cb4b5c827f 100644 --- a/Account.h +++ b/Account.h @@ -28,17 +28,18 @@ namespace RingClientUWP public ref class Account sealed : public INotifyPropertyChanged { public: - Account(String^ name, String^ ringID, String^ accountType, String^ accountID, String^ deviceId, bool upnpState); + Account(String^ name, String^ ringID, String^ accountType, String^ accountID, String^ deviceId, bool upnpState + , String^ sipHostname, String^ sipUsername, String^ sipPassword); virtual event PropertyChangedEventHandler^ PropertyChanged; property String^ name_ { String^ get() { - return name__; + return alias_; } void set(String^ value) { - name__ = value; + alias_ = value; NotifyPropertyChanged("name_"); } } @@ -63,14 +64,27 @@ public: } }; property bool _upnpState; + property String^ _sipHostname; + property String^ _sipUsername + { + String^ get() { + return sipUsername_; + } + void set(String^ value) { + sipUsername_ = value; + NotifyPropertyChanged("_sipUsername"); + } + } + property String^ _sipPassword; // refacto : think to encrypt password in memory protected: void NotifyPropertyChanged(String^ propertyName); private: Windows::Foundation::Collections::IVector<String^>^ devicesIdList_; - String^ name__; + String^ alias_; String^ ringID__; + String^ sipUsername_; }; } diff --git a/AccountsViewModel.cpp b/AccountsViewModel.cpp index 227a1af8f1d35b572b9d87729e1814eea34b2ccd..49392c70305ea9eaaa687662b77a1079fb6d0529 100644 --- a/AccountsViewModel.cpp +++ b/AccountsViewModel.cpp @@ -29,15 +29,38 @@ AccountsViewModel::AccountsViewModel() } void -AccountsViewModel::add(std::string& name, std::string& ringID, std::string& accountType, std::string& accountID, std::string& deviceId, bool upnpState) +AccountsViewModel::addRingAccount(std::string& alias, std::string& ringID, std::string& accountID, std::string& deviceId, bool upnpState) { auto account = ref new Account( - Utils::toPlatformString(name), + Utils::toPlatformString(alias), Utils::toPlatformString(ringID), - Utils::toPlatformString(accountType), + "RING", Utils::toPlatformString(accountID), Utils::toPlatformString(deviceId), - upnpState); + upnpState, + "" /* sip hostame not used woth ring account */, + "" /* sip username not used with ring account */, + "" /* sip password not used with ring */ ); + + accountsList_->Append(account); + updateScrollView(); + accountAdded(account); +} + +void +AccountsViewModel::addSipAccount(std::string& alias, std::string& accountID, std::string& sipHostname, std::string& sipUsername, std::string& sipPassword) +{ + auto account = ref new Account( + Utils::toPlatformString(alias), + "" /* ring Id not used with sip */ , + "SIP", + Utils::toPlatformString(accountID), + "" /* device id not used with sip */, + false /* upnpn not used with sip */, + Utils::toPlatformString(sipHostname), + Utils::toPlatformString(sipUsername), + Utils::toPlatformString(sipPassword) + ); accountsList_->Append(account); updateScrollView(); diff --git a/AccountsViewModel.h b/AccountsViewModel.h index 56f8490eda5b6afd3c61ef68bf4d3c0bc6aee976..b717c5ce4d2ee51a33842c916b7baf9848506188 100644 --- a/AccountsViewModel.h +++ b/AccountsViewModel.h @@ -46,7 +46,8 @@ internal: } /* functions */ - void add(std::string& name, std::string& ringID, std::string& accountType, std::string& accountID, std::string& deviceId, bool upnpState); + void addRingAccount(std::string& alias, std::string& ringID, std::string& accountID, std::string& deviceId, bool upnpState); + void addSipAccount(std::string& alias, std::string& accountID, std::string& sipHostname, std::string& sipUsername, std::string& sipPassword); void clearAccountList(); Account^ findItem(String^ accountId); diff --git a/RingD.cpp b/RingD.cpp index ea5bd28157e5ae27ca16c8aec597d7f43559663f..b3826506588b9d7f44bb9ee644cc7d4055359eae 100644 --- a/RingD.cpp +++ b/RingD.cpp @@ -59,38 +59,58 @@ RingClientUWP::RingD::reloadAccountList() std::vector<std::string>::reverse_iterator rit = accountList.rbegin(); for (; rit != accountList.rend(); ++rit) { - std::map<std::string,std::string> accountDetails = DRing::getAccountDetails(*rit); - std::string ringID(accountDetails.find(DRing::Account::ConfProperties::USERNAME)->second); - - bool upnpState = (accountDetails.find(DRing::Account::ConfProperties::UPNP_ENABLED)->second == ring::TRUE_STR) - ? true - : false; - - MSG_("upnp state : " + accountDetails.find(DRing::Account::ConfProperties::UPNP_ENABLED)->second); - if(!ringID.empty()) - ringID = ringID.substr(5); - - auto alias = accountDetails.find(DRing::Account::ConfProperties::ALIAS)->second; auto type = accountDetails.find(DRing::Account::ConfProperties::TYPE)->second; - auto deviceId = (type == "SIP")? std::string() : accountDetails.find(DRing::Account::ConfProperties::RING_DEVICE_ID)->second; - auto ringId = accountDetails.find(DRing::Account::ConfProperties::USERNAME)->second; - - auto accountId = Utils::toPlatformString(*rit); - auto account = AccountsViewModel::instance->findItem(accountId); - - if (account) { - account->name_ = Utils::toPlatformString(alias); - account->_upnpState = upnpState; - account->accountType_ = Utils::toPlatformString(type); - account->ringID_ = Utils::toPlatformString(ringId); - accountUpdated(account); - } - else { - RingClientUWP::ViewModel::AccountsViewModel::instance->add(alias, ringID, type, *rit /*account id*/, deviceId, upnpState); + if (type == "RING") { + auto ringID = accountDetails.find(DRing::Account::ConfProperties::USERNAME)->second; + if (!ringID.empty()) + ringID = ringID.substr(5); + + bool upnpState = (accountDetails.find(DRing::Account::ConfProperties::UPNP_ENABLED)->second == ring::TRUE_STR) + ? true + : false; + auto alias = accountDetails.find(DRing::Account::ConfProperties::ALIAS)->second; + auto deviceId = accountDetails.find(DRing::Account::ConfProperties::RING_DEVICE_ID)->second; + auto accountId = *rit; + + auto account = AccountsViewModel::instance->findItem(Utils::toPlatformString(accountId)); + + if (account) { + account->name_ = Utils::toPlatformString(alias); + account->_upnpState = upnpState; + account->accountType_ = Utils::toPlatformString(type); + account->ringID_ = Utils::toPlatformString(ringID); + accountUpdated(account); + } + else { + RingClientUWP::ViewModel::AccountsViewModel::instance->addRingAccount(alias, ringID, accountId, deviceId, upnpState); + } } + else { /* SIP */ + auto alias = accountDetails.find(DRing::Account::ConfProperties::ALIAS)->second; + auto accountId = *rit; + auto sipHostname = accountDetails.find(DRing::Account::ConfProperties::HOSTNAME)->second; + auto sipUsername = accountDetails.find(DRing::Account::ConfProperties::USERNAME)->second; + auto sipPassword = accountDetails.find(DRing::Account::ConfProperties::PASSWORD)->second; + + auto account = AccountsViewModel::instance->findItem(Utils::toPlatformString(accountId)); + + if (account) { + account->name_ = Utils::toPlatformString(alias); + account->accountType_ = Utils::toPlatformString(type); + account->_sipHostname = Utils::toPlatformString(sipHostname); + account->_sipUsername = Utils::toPlatformString(sipUsername); + account->_sipPassword = Utils::toPlatformString(sipPassword); + accountUpdated(account); + } + else { + RingClientUWP::ViewModel::AccountsViewModel::instance->addSipAccount(alias, accountId, sipHostname, sipUsername, sipPassword); + } + sipPassword = ""; // avoid to keep password in memory + + } } // load user preferences @@ -163,30 +183,38 @@ void RingClientUWP::RingD::sendSIPTextMessage(String^ message) } void -RingD::createRINGAccount(String^ alias) +RingD::createRINGAccount(String^ alias, String^ archivePassword, bool upnp) { - editModeOn_ = true; auto frame = dynamic_cast<Frame^>(Window::Current->Content); dynamic_cast<RingClientUWP::MainPage^>(frame->Content)->showLoadingOverlay(true, true); - // refactoring : create a dedicated class constructor task and removes accountName from RingD - accountName = Utils::toString(alias); - tasksList_.push(ref new RingD::Task(Request::AddRingAccount)); + auto task = ref new RingD::Task(Request::AddRingAccount); + + task->_alias = alias; + task->_password = archivePassword; + task->_upnp = upnp; + + tasksList_.push(task); } void -RingD::createSIPAccount(String^ alias) +RingD::createSIPAccount(String^ alias, String^ sipPassword, String^ sipHostname, String^ sipusername) { editModeOn_ = true; auto frame = dynamic_cast<Frame^>(Window::Current->Content); dynamic_cast<RingClientUWP::MainPage^>(frame->Content)->showLoadingOverlay(true, true); - // refactoring : create a dedicated class constructor task and removes accountName from RingD - accountName = Utils::toString(alias); - tasksList_.push(ref new RingD::Task(Request::AddSIPAccount)); + auto task = ref new RingD::Task(Request::AddSIPAccount); + + task->_alias = alias; + task->_sipPassword = sipPassword; + task->_sipHostname = sipHostname; + task->_sipUsername = sipusername; + + tasksList_.push(task); } void RingClientUWP::RingD::refuseIncommingCall(String^ callId) @@ -600,7 +628,6 @@ RingClientUWP::RingD::startDaemon() case StartingStatus::REGISTERING_ON_THIS_PC: { tasksList_.push(ref new RingD::Task(Request::AddRingAccount)); - tasksList_.push(ref new RingD::Task(Request::AddSIPAccount)); break; } case StartingStatus::REGISTERING_THIS_DEVICE: @@ -663,17 +690,28 @@ RingD::dequeueTasks() case Request::AddRingAccount: { std::map<std::string, std::string> ringAccountDetails; - ringAccountDetails.insert(std::make_pair(DRing::Account::ConfProperties::ALIAS, accountName)); - ringAccountDetails.insert(std::make_pair(DRing::Account::ConfProperties::ARCHIVE_PASSWORD, accountName)); + ringAccountDetails.insert(std::make_pair(DRing::Account::ConfProperties::ALIAS + , Utils::toString(task->_alias))); + ringAccountDetails.insert(std::make_pair(DRing::Account::ConfProperties::ARCHIVE_PASSWORD, + Utils::toString(task->_password))); ringAccountDetails.insert(std::make_pair(DRing::Account::ConfProperties::TYPE,"RING")); + ringAccountDetails.insert(std::make_pair(DRing::Account::ConfProperties::UPNP_ENABLED + , (task->_upnp)? ring::TRUE_STR : ring::FALSE_STR)); DRing::addAccount(ringAccountDetails); } break; case Request::AddSIPAccount: { std::map<std::string, std::string> sipAccountDetails; - sipAccountDetails.insert(std::make_pair(DRing::Account::ConfProperties::ALIAS, accountName + " (SIP)")); + sipAccountDetails.insert(std::make_pair(DRing::Account::ConfProperties::ALIAS + , Utils::toString(task->_alias))); sipAccountDetails.insert(std::make_pair(DRing::Account::ConfProperties::TYPE,"SIP")); + sipAccountDetails.insert(std::make_pair(DRing::Account::ConfProperties::PASSWORD + , Utils::toString(task->_sipPassword))); + sipAccountDetails.insert(std::make_pair(DRing::Account::ConfProperties::HOSTNAME + , Utils::toString(task->_sipHostname))); + sipAccountDetails.insert(std::make_pair(DRing::Account::ConfProperties::USERNAME + , Utils::toString(task->_sipUsername))); DRing::addAccount(sipAccountDetails); } break; diff --git a/RingD.h b/RingD.h index a304139f610ef5f5a00c38345cf6acf3041cd973..725e8730c5cf440719157ebdf87642b8d3b149e1 100644 --- a/RingD.h +++ b/RingD.h @@ -61,8 +61,8 @@ public: } } property StartingStatus _startingStatus; - property String^ _pin; - property String^ _password; + property String^ _pin; // you should RM ME + property String^ _password; // refatco : think a little... RM ME void cancelOutGoingCall2(String^ callId); // marche @@ -82,8 +82,8 @@ internal: void reloadAccountList(); void sendAccountTextMessage(String^ message); void sendSIPTextMessage(String^ message); - void createRINGAccount(String^ alias); - void createSIPAccount(String^ alias); + void createRINGAccount(String^ alias, String^ archivePassword, bool upnp); + void createSIPAccount(String^ alias, String^ sipPassword, String^ sipHostname, String^ sipusername); void refuseIncommingCall(String^ call); void acceptIncommingCall(String^ call); void placeCall(Contact^ contact); @@ -102,7 +102,7 @@ internal: /* TODO : move members */ ///bool hasConfig; // replaced by startingStatus - std::string accountName; + std::string accountName; // YOU SHOULD RM ME String ^ currentCallId; // to save ongoing call id during visibility change /* events */ @@ -155,10 +155,15 @@ private: } public: property Request request; + property String^ _alias; property String^ _callId; property String^ _pin; - property String^ _password; + property String^ _password; // refacto : is it safe ? are tasks destroy quickly after been used ? property String^ _accountId; + property bool _upnp; + property String^ _sipPassword; + property String^ _sipHostname; + property String^ _sipUsername; }; /* functions */ diff --git a/SmartPanel.xaml b/SmartPanel.xaml index 0d1fabdeedab664a93938f28b6cdd9fed19a3d7a..8773b596311bf80c206fd902cfc809cd51818253 100644 --- a/SmartPanel.xaml +++ b/SmartPanel.xaml @@ -35,6 +35,7 @@ <views:HasAnActiveCall x:Key="_HasAnActiveCall_" /> <views:AccountTypeToSourceImage x:Key="_AccountTypeToSourceImage_" /> <views:AccountSelectedToVisibility x:Key="_AccountSelectedToVisibility_" /> + <views:CollapseEmptyString x:Key="_CollapseEmptyString_" /> <Style x:Key="addContactTextBoxStyle" TargetType="TextBox"> @@ -207,9 +208,15 @@ Style="{StaticResource TextStyle5}" Text="{x:Bind _account.name_, Mode=OneWay}"/> <TextBlock x:Name="_ringID_" - Grid.ColumnSpan="2" - Style="{StaticResource TextStyle6}" - Text="{x:Bind _account.ringID_, Mode=OneWay}"/> + Grid.ColumnSpan="2" + Style="{StaticResource TextStyle6}" + Visibility="{x:Bind _account.ringID_, Converter={StaticResource _CollapseEmptyString_}, Mode=OneWay}" + Text="{x:Bind _account.ringID_, Mode=OneWay}"/> + <TextBlock x:Name="_sipUsername_" + Grid.ColumnSpan="2" + Visibility="{x:Bind _account._sipUsername, Converter={StaticResource _CollapseEmptyString_}, Mode=OneWay}" + Style="{StaticResource TextStyle6}" + Text="{x:Bind _account._sipUsername, Mode=OneWay}"/> </StackPanel> </Grid> </DataTemplate> @@ -464,33 +471,77 @@ <StackPanel Orientation="Vertical" Grid.Row="0" Background="#FFE4F1F9"> - <StackPanel Orientation="Horizontal"> - <TextBlock VerticalAlignment="Center" - Text="Account type : " - Margin="10,10,0,10"/> - <ComboBox x:Name="_accountTypeComboBox_" + <!-- alias sub menu. --> + <StackPanel Orientation="Horizontal" Margin="10"> + <TextBlock Style="{StaticResource TextSegoeStyle-20pt-black}" + Text=""/> + <TextBlock Text="Alias" Margin="10"/> + </StackPanel> + <TextBox x:Name="_ringAliasTextBox_" + TextChanged="_ringAliasTextBox__TextChanged" + Margin="10" + PlaceholderText="Enter alias"/> + <!-- account type chooser --> + <StackPanel Orientation="Horizontal" Margin="10"> + <TextBlock Style="{StaticResource TextSegoeStyle-20pt-black}" + Text=""/> + <TextBlock Text="Account type" Margin="10"/> + </StackPanel> + <ComboBox x:Name="_accountTypeComboBox_" SelectedIndex="0" Margin="10" + SelectionChanged="_accountTypeComboBox__SelectionChanged" VerticalAlignment="Center" Width="195"> - <ComboBoxItem Content="Ring"/> - <ComboBoxItem Content="Sip"/> - </ComboBox> - </StackPanel> + <ComboBoxItem Content="Ring"/> + <ComboBoxItem Content="Sip"/> + </ComboBox> <!-- RING account. --> <StackPanel x:Name="_ringAccountCreationStack_" Visibility="Visible"> - <TextBox x:Name="_aliasTextBox_" - Margin="10" - PlaceholderText="Enter your username"/> - <PasswordBox x:Name="_passwordBoxAccountCreation_" + <!-- password sub menu. --> + <StackPanel Orientation="Horizontal" Margin="10"> + <TextBlock Style="{StaticResource TextSegoeStyle-20pt-black}" + Text=""/> + <TextBlock Text="Archive password" Margin="10"/> + </StackPanel> + <PasswordBox x:Name="_ringPasswordBoxAccountCreation_" Margin="10" PasswordChanged="_passwordBoxAccountCreationCheck__PasswordChanged" - PlaceholderText="Enter your password"/> - <PasswordBox x:Name="_passwordBoxAccountCreationCheck_" + PlaceholderText="Enter archive password"/> + <PasswordBox x:Name="_ringPasswordBoxAccountCreationCheck_" Margin="10" PasswordChanged="_passwordBoxAccountCreationCheck__PasswordChanged" - PlaceholderText="Repeat your Password"/> + PlaceholderText="Repeat archive Password"/> + <!-- upnp sub menu. --> + <StackPanel Orientation="Horizontal" Margin="10"> + <TextBlock Style="{StaticResource TextSegoeStyle-20pt-black}" + Text=""/> + <TextBlock Text="UPnP" Margin="10"/> + </StackPanel> + <ToggleSwitch x:Name="_upnpStateAccountCreation_" + IsOn="True" + Margin="20,10"/> + </StackPanel> + <!-- SIP account. --> + <StackPanel x:Name="_sipAccountCreationStack_" + Visibility="Collapsed"> + <StackPanel Orientation="Horizontal" + Margin="10"> + <TextBlock Style="{StaticResource TextSegoeStyle-20pt-black}" + Text=""/> + <TextBlock Text="SIP account parameters" + Margin="10"/> + </StackPanel> + <TextBox x:Name="_sipHostnameTextBox_" + Margin="10" + PlaceholderText="Enter hostname"/> + <TextBox x:Name="_sipUsernameTextBox_" + Margin="10" + PlaceholderText="Enter username"/> + <PasswordBox x:Name="_sipPasswordBoxAccountCreation_" + Margin="10" + PlaceholderText="Enter password"/> </StackPanel> </StackPanel> <!-- buttons yes/no to create the new account. --> @@ -535,15 +586,37 @@ <TextBox x:Name="_aliasTextBoxEditionMenu_" FontSize="20" Margin="20,10" - PlaceholderText="Enter your username"/> + PlaceholderText="Enter alias"/> <!-- upnp sub menu. --> - <StackPanel Orientation="Horizontal" Margin="10"> - <TextBlock Style="{StaticResource TextSegoeStyle-20pt-black}" - Text=""/> - <TextBlock Text="UPnP" Margin="10"/> + <StackPanel x:Name="_upnpStackEditionMenu_"> + <StackPanel Orientation="Horizontal" Margin="10"> + <TextBlock Style="{StaticResource TextSegoeStyle-20pt-black}" + Text=""/> + <TextBlock Text="UPnP" Margin="10"/> + </StackPanel> + <ToggleSwitch x:Name="_upnpState_" + Margin="20,10"/> + </StackPanel> + <!-- SIP parameters. --> + <StackPanel x:Name="_sipAccountStackEditionMenu_" + Visibility="Collapsed"> + <StackPanel Orientation="Horizontal" + Margin="10"> + <TextBlock Style="{StaticResource TextSegoeStyle-20pt-black}" + Text=""/> + <TextBlock Text="SIP account parameters" + Margin="10"/> + </StackPanel> + <TextBox x:Name="_sipHostnameEditionMenu_" + Margin="10" + PlaceholderText="Enter hostname"/> + <TextBox x:Name="_sipUsernameEditionTextBox_" + Margin="10" + PlaceholderText="Enter username"/> + <PasswordBox x:Name="_sipPasswordEditionMenu_" + Margin="10" + PlaceholderText="Enter password"/> </StackPanel> - <ToggleSwitch x:Name="_upnpState_" - Margin="20,10"/> <!-- delete account sub menu. --> <StackPanel Orientation="Horizontal" Margin="10"> <TextBlock Style="{StaticResource TextSegoeStyle-20pt-black}" diff --git a/SmartPanel.xaml.cpp b/SmartPanel.xaml.cpp index 951a693cd8048b16bdf8af230c757de817eafa58..caf31bd847a5a6b67976f75ec267d45547d4dbe1 100644 --- a/SmartPanel.xaml.cpp +++ b/SmartPanel.xaml.cpp @@ -248,34 +248,42 @@ void RingClientUWP::Views::SmartPanel::_addAccountBtn__Click(Platform::Object^ s { _accountsMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed; _accountCreationMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Visible; + _createAccountYes_->IsEnabled = false; + + _accountTypeComboBox_->SelectedIndex = 0; + _upnpStateAccountCreation_->IsOn = true; + _ringAliasTextBox_->Text = ""; } void RingClientUWP::Views::SmartPanel::_createAccountYes__Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e) { - switch (_accountTypeComboBox_->SelectedIndex) - { - case 0: + switch (_accountTypeComboBox_->SelectedIndex) { + case 0: /* RING account */ { - RingD::instance->createRINGAccount(_aliasTextBox_->Text); - _accountCreationMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed; - _accountsMenuButton__Checked(nullptr, nullptr); + RingD::instance->createRINGAccount(_ringAliasTextBox_->Text, _ringPasswordBoxAccountCreation_->Password, _upnpStateAccountCreation_->IsOn); + _ringPasswordBoxAccountCreation_->Password = ""; + _ringPasswordBoxAccountCreationCheck_->Password = ""; break; } break; - case 1: + case 1: /* SIP account */ { - RingD::instance->createSIPAccount(_aliasTextBox_->Text); - _accountCreationMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed; - _accountsMenuButton__Checked(nullptr, nullptr); + RingD::instance->createSIPAccount(_ringAliasTextBox_->Text, _sipPasswordBoxAccountCreation_->Password, _sipHostnameTextBox_->Text, _sipUsernameTextBox_->Text); + _sipPasswordBoxAccountCreation_->Password = ""; + _sipUsernameTextBox_->Text = ""; + _sipHostnameTextBox_->Text = ""; break; } default: break; } - _aliasTextBox_->Text = ""; - _passwordBoxAccountCreation_->Password = ""; - _passwordBoxAccountCreationCheck_->Password = ""; + + _accountCreationMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed; + _accountsMenuGrid_->Visibility = Windows::UI::Xaml::Visibility::Collapsed; + _accountsMenuButton__Checked(nullptr, nullptr); + + } @@ -728,6 +736,16 @@ void RingClientUWP::Views::SmartPanel::_editAccountMenuButton__Click(Platform::O _deleteAccountBtnEditionMenu_->IsChecked = false; _deleteAccountBtnEditionMenu_->IsEnabled = (AccountListItemsViewModel::instance->itemsList->Size > 1)? true : false; _createAccountYes_->IsEnabled = false; + _sipAccountStackEditionMenu_->Visibility = (account->accountType_ == "SIP") + ? Windows::UI::Xaml::Visibility::Visible + :Windows::UI::Xaml::Visibility::Collapsed; + _upnpStackEditionMenu_->Visibility = (account->accountType_ == "RING") + ? Windows::UI::Xaml::Visibility::Visible + : Windows::UI::Xaml::Visibility::Collapsed; + _sipHostnameEditionMenu_->Text = account->_sipHostname; + _sipUsernameEditionTextBox_->Text = account->_sipUsername; + _sipPasswordEditionMenu_->Password = account->_sipPassword; + } @@ -779,8 +797,64 @@ void RingClientUWP::Views::SmartPanel::OnaccountUpdated(RingClientUWP::Account ^ void RingClientUWP::Views::SmartPanel::_passwordBoxAccountCreationCheck__PasswordChanged(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e) { - _createAccountYes_->IsEnabled = (_passwordBoxAccountCreation_->Password - == _passwordBoxAccountCreationCheck_->Password - && _passwordBoxAccountCreation_->Password->Length() > 0) + _createAccountYes_->IsEnabled = (_ringPasswordBoxAccountCreation_->Password + == _ringPasswordBoxAccountCreationCheck_->Password + && _ringPasswordBoxAccountCreation_->Password->Length() > 0) ? true : false; } + + +void RingClientUWP::Views::SmartPanel::_accountTypeComboBox__SelectionChanged(Platform::Object^ sender, Windows::UI::Xaml::Controls::SelectionChangedEventArgs^ e) +{ + auto accountTypeComboBox = dynamic_cast<ComboBox^>(sender); + + /* avoid exception at start */ + if (_ringAccountCreationStack_ == nullptr && _sipAccountCreationStack_ == nullptr) + return; + + /* empty everything, avoid to keep credentials in memory... */ + _ringPasswordBoxAccountCreation_->Password = ""; + _ringPasswordBoxAccountCreationCheck_->Password = ""; + _sipPasswordBoxAccountCreation_->Password = ""; + _sipUsernameTextBox_->Text = ""; + _sipHostnameTextBox_->Text = ""; + + if (accountTypeComboBox->SelectedIndex == 0 /* RING type is selected */) { + _ringAccountCreationStack_->Visibility = Windows::UI::Xaml::Visibility::Visible; + _sipAccountCreationStack_->Visibility = Windows::UI::Xaml::Visibility::Collapsed; + _createAccountYes_->IsEnabled = false; + _upnpStateAccountCreation_->IsOn = true; + } else { /* SIP type is selected */ + _ringAccountCreationStack_->Visibility = Windows::UI::Xaml::Visibility::Collapsed; + _sipAccountCreationStack_->Visibility = Windows::UI::Xaml::Visibility::Visible; + _createAccountYes_->IsEnabled = (_ringAliasTextBox_->Text->IsEmpty()) ? false : true; + } +} + + + + +void RingClientUWP::Views::SmartPanel::_ringAliasTextBox__TextChanged(Platform::Object^ sender, Windows::UI::Xaml::Controls::TextChangedEventArgs^ e) +{ + _createAccountYes_->IsEnabled = (_ringAliasTextBox_->Text->IsEmpty() + || (_accountTypeComboBox_->SelectedIndex == 0 /* RING type is selected */ + && _ringPasswordBoxAccountCreation_->Password->Length() < 1)) + ? false : true; +} + +Object ^ RingClientUWP::Views::CollapseEmptyString::Convert(Object ^ value, Windows::UI::Xaml::Interop::TypeName targetType, Object ^ parameter, String ^ language) +{ + auto stringValue = dynamic_cast<String^>(value); + + return (stringValue->IsEmpty()) + ? Windows::UI::Xaml::Visibility::Collapsed + : Windows::UI::Xaml::Visibility::Visible; +} + +Object ^ RingClientUWP::Views::CollapseEmptyString::ConvertBack(Object ^ value, Windows::UI::Xaml::Interop::TypeName targetType, Object ^ parameter, String ^ language) +{ + throw ref new Platform::NotImplementedException(); +} + +RingClientUWP::Views::CollapseEmptyString::CollapseEmptyString() +{} diff --git a/SmartPanel.xaml.h b/SmartPanel.xaml.h index 4cd5cabd2a2107dec63c94d870f8d3fe9240b855..2419ee70ca199b7c286f4e79e1f138f50529ef55 100644 --- a/SmartPanel.xaml.h +++ b/SmartPanel.xaml.h @@ -71,6 +71,13 @@ public: NewMessageBubleNotification(); }; +public ref class CollapseEmptyString sealed : IValueConverter { +public: + virtual Object^ Convert(Object^ value, Windows::UI::Xaml::Interop::TypeName targetType, Object^ parameter, String^ language); + virtual Object^ ConvertBack(Object^ value, Windows::UI::Xaml::Interop::TypeName targetType, Object^ parameter, String^ language); + CollapseEmptyString(); +}; + public ref class SmartPanel sealed { public: @@ -124,6 +131,8 @@ private: void _cancelAccountModification__Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e); void OnaccountUpdated(RingClientUWP::Account ^account); void _passwordBoxAccountCreationCheck__PasswordChanged(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e); + void _accountTypeComboBox__SelectionChanged(Platform::Object^ sender, Windows::UI::Xaml::Controls::SelectionChangedEventArgs^ e); + void _ringAliasTextBox__TextChanged(Platform::Object^ sender, Windows::UI::Xaml::Controls::TextChangedEventArgs^ e); }; } } \ No newline at end of file