newwizardwidget.cpp 25.5 KB
Newer Older
Andreas Traczyk's avatar
Andreas Traczyk committed
1 2 3
/**************************************************************************
* Copyright (C) 2015-2018 by Savoir-faire Linux                           *
* Author: Edric Ladent Milaret <edric.ladent-milaret@savoirfairelinux.com>*
4
* Author: Anthony Léonard <anthony.leonard@savoirfairelinux.com>          *
Andreas Traczyk's avatar
Andreas Traczyk committed
5
* Author: Olivier Soldano <olivier.soldano@savoirfairelinux.com>          *
Andreas Traczyk's avatar
Andreas Traczyk committed
6 7
* Author: Andreas Traczyk <andreas.traczyk@savoirfairelinux.com>          *
* Author: Mingrui Zhang   <mingrui.zhang@savoirfairelinux.com>            *
Andreas Traczyk's avatar
Andreas Traczyk committed
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
*                                                                         *
* 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 "newwizardwidget.h"
#include "ui_newwizardwidget.h"

#include <QMovie>
#include <QMessageBox>
#include <QFileDialog>
#include <QBitmap>
Andreas Traczyk's avatar
Andreas Traczyk committed
30
#include <QtConcurrent/QtConcurrent>
Andreas Traczyk's avatar
Andreas Traczyk committed
31 32 33 34 35 36

#include "namedirectory.h"

#include "utils.h"
#include "ringthemeutils.h"

37
NewWizardWidget::NewWizardWidget(QWidget* parent) :
Andreas Traczyk's avatar
Andreas Traczyk committed
38 39
    NavWidget(parent),
    ui(new Ui::NewWizardWidget),
40
    wizardMode_(WizardMode::CREATE),
Andreas Traczyk's avatar
Andreas Traczyk committed
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
    lookupTimer_(this)
{
    ui->setupUi(this);

    QPixmap logo(":/images/logo-jami-standard-coul.png");

    ui->welcomeLogo->setPixmap(logo.scaledToHeight(100, Qt::SmoothTransformation));
    ui->welcomeLogo->setAlignment(Qt::AlignHCenter);

    creationSpinnerMovie_ = new QMovie(":/images/jami_eclipse_spinner.gif");
    ui->spinnerLabel->setMovie(creationSpinnerMovie_);
    creationSpinnerMovie_->start();

    lookupSpinnerMovie_ = new QMovie(":/images/jami_rolling_spinner.gif");
    lookupSpinnerMovie_->setScaledSize(QSize(30, 30));

Andreas Traczyk's avatar
Andreas Traczyk committed
57 58
    ui->lookupStatusLabel->setMovie(lookupSpinnerMovie_);
    ui->lookupStatusLabel->hide();
Andreas Traczyk's avatar
Andreas Traczyk committed
59 60 61 62 63 64 65

    registrationStateOk_ = false;

    statusSuccessPixmap_ = Utils::generateTintedPixmap(":/images/icons/baseline-done-24px.svg", RingTheme::presenceGreen_);
    statusInvalidPixmap_ = Utils::generateTintedPixmap(":/images/icons/baseline-error_outline-24px.svg", RingTheme::urgentOrange_);
    statusErrorPixmap_ = Utils::generateTintedPixmap(":/images/icons/baseline-close-24px.svg", RingTheme::red_);

66
    setNavBarVisibility(false, true);
Andreas Traczyk's avatar
Andreas Traczyk committed
67 68 69

    lookupTimer_.setSingleShot(true);

70 71 72 73 74
    collapsiblePasswordWidget_ = new CollapsiblePasswordWidget(this);
    collapsiblePasswordWidget_->setParent(ui->expandablePasswordWidget);
    ui->expandablePasswordWidget->setLabelText("Choose a password for enchanced security");
    ui->expandablePasswordWidget->addExpandWidget(collapsiblePasswordWidget_);

75 76 77 78 79 80
    connect(ui->fileImportBtn, &QPushButton::clicked,
        [this] {
            QString filePath;
            filePath = QFileDialog::getOpenFileName(this,
                tr("Open File"),
                QString(),
81
                tr("Jami archive files") + " (*.gz);" + tr("All files") + " (*)");
82 83 84 85 86
            fileToImport_ = QDir::toNativeSeparators(filePath);
            if (!fileToImport_.isEmpty()) {
                QFileInfo fi(filePath);
                ui->fileImportBtn->setText(fi.fileName());
            } else {
87
                ui->fileImportBtn->setText(tr("Archive (None)"));
88 89 90 91
            }
            validateWizardProgression();
        });

Andreas Traczyk's avatar
Andreas Traczyk committed
92 93 94 95 96 97 98 99
    connect(&lookupTimer_, &QTimer::timeout,
            this, &NewWizardWidget::timeoutNameLookupTimer);

    connect(ui->backButton, &QPushButton::clicked,
        [this] {
            emit NavigationRequested(ScreenEnum::CallScreen);
        });

100
    connect(collapsiblePasswordWidget_->getConfirmPasswordEdit(), &QLineEdit::textChanged,
Andreas Traczyk's avatar
Andreas Traczyk committed
101 102 103 104
        [this] {
            validateWizardProgression();
        });

105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
    connect(ui->pinFromDevice, &QLineEdit::textChanged,
        [this] {
            validateWizardProgression();
        });

    connect(ui->usernameManagerEdit, &QLineEdit::textChanged,
        [this] {
            validateWizardProgression();
        });

    connect(ui->accountManagerEdit, &QLineEdit::textChanged,
        [this] {
            validateWizardProgression();
        });

    connect(ui->passwordManagerEdit, &QLineEdit::textChanged,
121 122 123 124
        [this] {
            validateWizardProgression();
        });

Andreas Traczyk's avatar
Andreas Traczyk committed
125 126 127 128 129 130 131 132 133 134 135 136 137
    ui->containerWidget->setVisible(false);
}

NewWizardWidget::~NewWizardWidget()
{
    delete ui;
}

void
NewWizardWidget::updateNameRegistrationUi(NameRegistrationUIState state)
{
    switch (state) {
    case NameRegistrationUIState::BLANK:
Andreas Traczyk's avatar
Andreas Traczyk committed
138
        ui->lookupStatusLabel->hide();
Andreas Traczyk's avatar
Andreas Traczyk committed
139 140
        break;
    case NameRegistrationUIState::INVALID:
Andreas Traczyk's avatar
Andreas Traczyk committed
141
        ui->lookupStatusLabel->setPixmap(statusInvalidPixmap_);
Andreas Traczyk's avatar
Andreas Traczyk committed
142 143
        break;
    case NameRegistrationUIState::TAKEN:
Andreas Traczyk's avatar
Andreas Traczyk committed
144
        ui->lookupStatusLabel->setPixmap(statusErrorPixmap_);
Andreas Traczyk's avatar
Andreas Traczyk committed
145 146
        break;
    case NameRegistrationUIState::FREE:
Andreas Traczyk's avatar
Andreas Traczyk committed
147
        ui->lookupStatusLabel->setPixmap(statusSuccessPixmap_);
Andreas Traczyk's avatar
Andreas Traczyk committed
148 149
        break;
    case NameRegistrationUIState::SEARCHING:
Andreas Traczyk's avatar
Andreas Traczyk committed
150
        ui->lookupStatusLabel->setMovie(lookupSpinnerMovie_);
Andreas Traczyk's avatar
Andreas Traczyk committed
151 152
        lookupSpinnerMovie_->stop();
        lookupSpinnerMovie_->start();
Andreas Traczyk's avatar
Andreas Traczyk committed
153
        ui->lookupStatusLabel->show();
Andreas Traczyk's avatar
Andreas Traczyk committed
154 155 156 157 158 159 160 161 162 163 164 165
        break;
    }
}

void
NewWizardWidget::navigated(bool to)
{
    ui->containerWidget->setVisible(to);
    changePage(ui->welcomePage);
    Utils::setStackWidget(ui->stackedWidget, ui->welcomePage);
}

166
void
167
NewWizardWidget::slotAccountListChanged()
168 169
{}

Andreas Traczyk's avatar
Andreas Traczyk committed
170
void
171
NewWizardWidget::on_fromDeviceButton_clicked()
Andreas Traczyk's avatar
Andreas Traczyk committed
172
{
173
    changePage(ui->importFromDevicePage);
Andreas Traczyk's avatar
Andreas Traczyk committed
174 175 176 177 178
}

void
NewWizardWidget::on_newAccountButton_clicked()
{
179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198
    changePage(ui->createAccountPage);
}

void
NewWizardWidget::on_showAdvancedButton_clicked()
{
    ui->newSIPAccountButton->setVisible(!ui->newSIPAccountButton->isVisible());
    ui->connectAccountManagerButton->setVisible(!ui->connectAccountManagerButton->isVisible());
}

void
NewWizardWidget::on_connectAccountManagerButton_clicked()
{
    changePage(ui->connectToAccountManagerPage);
}

void
NewWizardWidget::on_fromBackupButton_clicked()
{
    changePage(ui->importFromBackupPage);
Andreas Traczyk's avatar
Andreas Traczyk committed
199 200
}

201 202 203
void
NewWizardWidget::on_newSIPAccountButton_clicked()
{
204
    changePage(ui->createSIPAccountPage);
205 206
}

Andreas Traczyk's avatar
Andreas Traczyk committed
207 208 209 210 211 212 213
void NewWizardWidget::changePage(QWidget* toPage)
{
    if (toPage == ui->spinnerPage) {
        setNavBarVisibility(false);
    }
    Utils::setStackWidget(ui->stackedWidget, toPage);
    if (toPage == ui->welcomePage) {
214
        fileToImport_ = QString("");
Andreas Traczyk's avatar
Andreas Traczyk committed
215
        setNavBarVisibility(false, true);
Andreas Traczyk's avatar
Andreas Traczyk committed
216
        ui->lookupStatusLabel->hide();
217
        collapsiblePasswordWidget_->getPasswordStatusLabel()->hide();
218 219 220
        ui->newSIPAccountButton->hide();
        ui->connectAccountManagerButton->hide();
    } else if (toPage == ui->createAccountPage) {
Andreas Traczyk's avatar
Andreas Traczyk committed
221
        ui->usernameEdit->clear();
222 223
        collapsiblePasswordWidget_->getPasswordEdit()->clear();
        collapsiblePasswordWidget_->getConfirmPasswordEdit()->clear();
Andreas Traczyk's avatar
Andreas Traczyk committed
224 225
        ui->signUpCheckbox->setChecked(true);
        ui->usernameEdit->setEnabled(true);
226
        ui->fullNameEdit->setText(QString());
Andreas Traczyk's avatar
Andreas Traczyk committed
227 228 229 230 231 232 233
        setNavBarVisibility(true);
        updateCustomUI();
        registeredNameFoundConnection_ = connect(
            &LRCInstance::accountModel(), &lrc::api::NewAccountModel::registeredNameFound,
            this, &NewWizardWidget::slotRegisteredNameFound);
        validateWizardProgression();
        ui->setAvatarWidget->startBooth();
234
    } else if (toPage == ui->createSIPAccountPage) {
235 236 237 238 239 240 241 242 243
        ui->SIPusernameEdit->clear();
        ui->SIPpasswordEdit->clear();
        ui->SIPservernameEdit->clear();
        ui->SIPproxyEdit->clear();
        ui->SIPfullNameEdit->setText(QString());
        ui->SIPusernameEdit->setEnabled(true);
        setNavBarVisibility(true);
        ui->nextButton->setEnabled(true);
        ui->setSIPAvatarWidget->startBooth();
244 245 246
    } else if (toPage == ui->importFromDevicePage) {
        ui->pinFromDevice->clear();
        ui->passwordFromDevice->clear();
Andreas Traczyk's avatar
Andreas Traczyk committed
247
        setNavBarVisibility(true);
248
        ui->pinInfoLabel->hide();
Andreas Traczyk's avatar
Andreas Traczyk committed
249
    } else if (toPage == ui->spinnerPage) {
Andreas Traczyk's avatar
Andreas Traczyk committed
250
        ui->lookupStatusLabel->hide();
251
        collapsiblePasswordWidget_->getPasswordStatusLabel()->hide();
252 253 254 255 256 257 258 259 260 261 262 263 264
    } else if (toPage == ui->connectToAccountManagerPage) {
        setNavBarVisibility(true);
        ui->usernameManagerEdit->clear();
        ui->passwordManagerEdit->clear();
        ui->accountManagerEdit->clear();
        ui->nextButton->setEnabled(false);
    } else if (toPage == ui->importFromBackupPage) {
        setNavBarVisibility(true);
        ui->passwordFromBackupEdit->clear();
        fileToImport_ = QString("");
        ui->fileImportBtn->setText(tr("Archive (None)"));
        ui->nextButton->setEnabled(false);
        ui->backupInfoLabel->hide();
Sébastien Blin's avatar
Sébastien Blin committed
265 266
    } else if (toPage == ui->backupKeysPage) {
        setNavBarVisibility(false);
Andreas Traczyk's avatar
Andreas Traczyk committed
267 268 269 270 271 272 273 274 275 276 277
    }
}

void
NewWizardWidget::updateCustomUI()
{
}

void
NewWizardWidget::setNavBarVisibility(bool nav, bool back)
{
278 279 280
    ui->navBarWidget->setVisible(nav || back);
    ui->nextButton->setVisible(nav);
    ui->previousButton->setVisible(nav);
Andreas Traczyk's avatar
Andreas Traczyk committed
281 282 283 284 285 286 287
    ui->backButton->setVisible(back && LRCInstance::accountModel().getAccountList().size());
}

void
NewWizardWidget::on_nextButton_clicked()
{
    const QWidget* curWidget = ui->stackedWidget->currentWidget();
288 289
    ui->setAvatarWidget->stopBooth();
    disconnect(registeredNameFoundConnection_);
290
    if (curWidget == ui->createAccountPage) {
291 292
        wizardMode_ = WizardMode::CREATE;
        processWizardInformations();
293
    } else if (curWidget == ui->importFromDevicePage) {
294
        wizardMode_ = WizardMode::IMPORT;
Andreas Traczyk's avatar
Andreas Traczyk committed
295
        processWizardInformations();
296
    } else if (curWidget == ui->createSIPAccountPage) {
297 298
        wizardMode_ = WizardMode::CREATESIP;
        processWizardInformations();
299 300 301 302 303 304
    } else if (curWidget == ui->connectToAccountManagerPage) {
        wizardMode_ = WizardMode::CONNECTMANAGER;
        processWizardInformations();
    } else if (curWidget == ui->importFromBackupPage) {
        wizardMode_ = WizardMode::IMPORT;
        processWizardInformations();
Andreas Traczyk's avatar
Andreas Traczyk committed
305 306 307 308 309 310 311
    }
}

void
NewWizardWidget::on_previousButton_clicked()
{
    const QWidget* curWidget = ui->stackedWidget->currentWidget();
312 313
    if (curWidget == ui->createAccountPage) { ui->setAvatarWidget->stopBooth(); }
    if (curWidget == ui->createSIPAccountPage) { ui->setSIPAvatarWidget->stopBooth(); }
314
    disconnect(registeredNameFoundConnection_);
Andreas Traczyk's avatar
Andreas Traczyk committed
315
    ui->lookupStatusLabel->hide();
316
    collapsiblePasswordWidget_->getPasswordStatusLabel()->hide();
317 318 319 320 321
    if (curWidget == ui->createAccountPage ||
        curWidget == ui->importFromDevicePage ||
        curWidget == ui->createSIPAccountPage ||
        curWidget == ui->connectToAccountManagerPage ||
        curWidget == ui->importFromBackupPage) {
Andreas Traczyk's avatar
Andreas Traczyk committed
322 323 324 325
        changePage(ui->welcomePage);
    }
}

326 327 328 329 330 331 332 333 334 335 336 337
void
NewWizardWidget::on_pinInfoBtn_clicked()
{
    ui->pinInfoLabel->setVisible(!ui->pinInfoLabel->isVisible());
}

void
NewWizardWidget::on_backupInfoBtn_clicked()
{
    ui->backupInfoLabel->setVisible(!ui->backupInfoLabel->isVisible());
}

Sébastien Blin's avatar
Sébastien Blin committed
338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365
void
NewWizardWidget::on_neverShowAgainBox_clicked()
{
    QSettings settings("jami.net", "Jami");
    settings.setValue(SettingsKey::neverShowMeAgain, ui->neverShowAgainBox->isChecked());
}

void
NewWizardWidget::on_skipBtn_clicked()
{
    emit NavigationRequested(ScreenEnum::CallScreen);
    emit LRCInstance::instance().accountListChanged();
}

void
NewWizardWidget::on_exportBtn_clicked()
{
    QFileDialog dialog(this);
    QString dir = QFileDialog::getExistingDirectory(this, tr("Export Account Here"),
        QDir::homePath() + "/Desktop", QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);

    if (!dir.isEmpty()) {
        LRCInstance::accountModel().exportToFile(LRCInstance::getCurrAccId(), (dir + "/export.gz").toStdString());
    }
    emit NavigationRequested(ScreenEnum::CallScreen);
    emit LRCInstance::instance().accountListChanged();
}

Andreas Traczyk's avatar
Andreas Traczyk committed
366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394
void
NewWizardWidget::on_passwordEdit_textChanged(const QString& arg1)
{
    Q_UNUSED(arg1);
    validateWizardProgression();
}

void
NewWizardWidget::on_usernameEdit_textChanged(const QString &arg1)
{
    registrationStateOk_ = false;
    if (ui->signUpCheckbox->isChecked() && !arg1.isEmpty()) {
        registeredName_ = ui->usernameEdit->text().simplified();
        lookupTimer_.start(200);
    } else {
        updateNameRegistrationUi(NameRegistrationUIState::BLANK);
        lookupTimer_.stop();
        if (!arg1.isEmpty()) {
            lookupTimer_.start(200);
        }
    }
    validateWizardProgression();
}

void
NewWizardWidget::timeoutNameLookupTimer()
{
    if (ui->signUpCheckbox->isChecked() && !ui->usernameEdit->text().isEmpty()) {
        updateNameRegistrationUi(NameRegistrationUIState::SEARCHING);
395
        NameDirectory::instance().lookupName(QString(), registeredName_);
Andreas Traczyk's avatar
Andreas Traczyk committed
396 397 398 399 400 401 402 403 404
    }
}

void
NewWizardWidget::slotRegisteredNameFound(const std::string& accountId,
                                         LookupStatus status,
                                         const std::string& address,
                                         const std::string& name)
{
405 406 407
    Q_UNUSED(accountId);
    Q_UNUSED(address);

Andreas Traczyk's avatar
Andreas Traczyk committed
408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454
    using namespace lrc::api::account;
    if (name.length() < 3) {
        registrationStateOk_ = false;
        updateNameRegistrationUi(NameRegistrationUIState::INVALID);
    } else if (registeredName_.toStdString() == name) {
        switch (status) {
        case LookupStatus::NOT_FOUND:
        case LookupStatus::ERROR:
            registrationStateOk_ = true;
            updateNameRegistrationUi(NameRegistrationUIState::FREE);
            break;
        case LookupStatus::INVALID_NAME:
        case LookupStatus::INVALID:
            registrationStateOk_ = false;
            updateNameRegistrationUi(NameRegistrationUIState::INVALID);
            break;
        case LookupStatus::SUCCESS:
            registrationStateOk_ = false;
            updateNameRegistrationUi(NameRegistrationUIState::TAKEN);
            break;
        }
    }
    validateWizardProgression();
}

void
NewWizardWidget::handle_nameRegistrationEnded(NameDirectory::RegisterNameStatus status, const QString& name)
{
    Q_UNUSED(name);
    Q_UNUSED(status);
}

void
NewWizardWidget::on_signUpCheckbox_toggled(bool checked)
{
    if (checked) {
        ui->usernameEdit->setEnabled(true);
    } else {
        ui->usernameEdit->setEnabled(false);
        ui->usernameEdit->clear();
    }
    validateWizardProgression();
}

void
NewWizardWidget::validateWizardProgression()
{
455 456 457 458 459 460 461 462 463 464 465
    if (ui->stackedWidget->currentWidget() == ui->importFromDevicePage) {
        bool validPin = !ui->pinFromDevice->text().isEmpty();
        ui->nextButton->setEnabled(validPin);
        return;
    } else if (ui->stackedWidget->currentWidget() == ui->connectToAccountManagerPage) {
        bool validUsername = !ui->usernameManagerEdit->text().isEmpty();
        bool validPassword = !ui->passwordManagerEdit->text().isEmpty();
        bool validManager = !ui->accountManagerEdit->text().isEmpty();
        ui->nextButton->setEnabled(validUsername && validPassword && validManager);
        return;
    } else if (ui->stackedWidget->currentWidget() == ui->importFromBackupPage) {
466
        bool validImport = !fileToImport_.isEmpty();
467
        ui->nextButton->setEnabled(validImport);
468 469
        return;
    }
Andreas Traczyk's avatar
Andreas Traczyk committed
470 471 472 473 474 475
    bool usernameOk =
        !ui->signUpCheckbox->isChecked() ||
        (ui->signUpCheckbox->isChecked() &&
         !registeredName_.isEmpty() &&
         (registeredName_ == ui->usernameEdit->text()) &&
         registrationStateOk_ == true);
476 477 478 479 480
    bool passwordOk = collapsiblePasswordWidget_->getPasswordEdit()->text()
                      == collapsiblePasswordWidget_->getConfirmPasswordEdit()->text();
    if (passwordOk && !collapsiblePasswordWidget_->getPasswordEdit()->text().isEmpty()) {
        collapsiblePasswordWidget_->getPasswordStatusLabel()->show();
        collapsiblePasswordWidget_->getPasswordStatusLabel()->setPixmap(statusSuccessPixmap_);
Andreas Traczyk's avatar
Andreas Traczyk committed
481
    } else if (!passwordOk) {
482 483
        collapsiblePasswordWidget_->getPasswordStatusLabel()->show();
        collapsiblePasswordWidget_->getPasswordStatusLabel()->setPixmap(statusErrorPixmap_);
Andreas Traczyk's avatar
Andreas Traczyk committed
484
    } else {
485
        collapsiblePasswordWidget_->getPasswordStatusLabel()->hide();
Andreas Traczyk's avatar
Andreas Traczyk committed
486 487 488 489
    }
    ui->nextButton->setEnabled(usernameOk && passwordOk);
}

490 491 492
void
NewWizardWidget::processWizardInformations()
{
493
    inputPara_.clear();
494 495 496
    switch (wizardMode_) {
    case WizardMode::CREATE:
        ui->progressLabel->setText(tr("Generating your Jami account..."));
497
        inputPara_["alias"] = ui->fullNameEdit->text();
498
        inputPara_["password"] = collapsiblePasswordWidget_->getPasswordEdit()->text();
499
        ui->fullNameEdit->clear();
500 501
        collapsiblePasswordWidget_->getPasswordEdit()->clear();
        collapsiblePasswordWidget_->getConfirmPasswordEdit()->clear();
502 503 504
        break;
    case WizardMode::IMPORT:
        ui->progressLabel->setText(tr("Importing account archive..."));
505 506 507 508 509 510 511
        if (ui->stackedWidget->currentWidget() == ui->importFromBackupPage) {
            inputPara_["password"] = ui->passwordFromBackupEdit->text();
            ui->passwordFromBackupEdit->clear();
        } else if (ui->stackedWidget->currentWidget() == ui->importFromDevicePage) {
            inputPara_["archivePin"] = ui->pinFromDevice->text();
            inputPara_["password"] = ui->passwordFromDevice->text();
        }
512 513 514 515
        break;
    case WizardMode::MIGRATE:
        ui->progressLabel->setText(tr("Migrating your Jami account..."));
        break;
516 517 518 519 520 521 522 523 524
    case WizardMode::CREATESIP:
        ui->progressLabel->setText(tr("Generating your SIP account..."));
        if (ui->SIPfullNameEdit->text().isEmpty()) { inputPara_["alias"] = "SIP"; }
        else { inputPara_["alias"] = ui->SIPfullNameEdit->text(); }
        inputPara_["hostname"] = ui->SIPservernameEdit->text();
        inputPara_["username"] = ui->SIPusernameEdit->text();
        inputPara_["password"] = ui->SIPpasswordEdit->text();
        inputPara_["proxy"] = ui->SIPproxyEdit->text();
        break;
525 526 527 528 529 530
    case WizardMode::CONNECTMANAGER:
        ui->progressLabel->setText(tr("Connecting to account manager..."));
        inputPara_["username"] = ui->usernameManagerEdit->text();
        inputPara_["password"] = ui->passwordManagerEdit->text();
        inputPara_["manager"] = ui->accountManagerEdit->text();
        break;
531 532
    }

533
    inputPara_["archivePath"] = fileToImport_;
Andreas Traczyk's avatar
Andreas Traczyk committed
534 535 536
    if (inputPara_.find("archivePin") == inputPara_.end()) {
        inputPara_["archivePin"] = "";
    }
537

538
    changePage(ui->spinnerPage);
539
    createAccount();
540

541
    Utils::CreateStartupLink(L"Jami");
542 543
}

Andreas Traczyk's avatar
Andreas Traczyk committed
544
void
545
NewWizardWidget::createAccount()
Andreas Traczyk's avatar
Andreas Traczyk committed
546
{
547
    bool isConnectingToManager = wizardMode_ == WizardMode::CONNECTMANAGER;
548
    bool isRing = wizardMode_ == WizardMode::CREATE || wizardMode_ == WizardMode::IMPORT;
Sébastien Blin's avatar
Sébastien Blin committed
549
    bool isCreating = wizardMode_ == WizardMode::CREATE;
550 551 552
    if (isConnectingToManager) {
        Utils::oneShotConnect(&LRCInstance::accountModel(), &lrc::api::NewAccountModel::accountAdded,
            [this](const std::string& accountId) {
553 554
                if (!LRCInstance::accountModel().getAccountList().size())
                    return;
555 556 557 558 559 560 561 562 563
                //set default ringtone
                auto confProps = LRCInstance::accountModel().getAccountConfig(accountId);
                confProps.Ringtone.ringtonePath = Utils::GetRingtonePath().toStdString();
                LRCInstance::accountModel().setAccountConfig(accountId, confProps);
                emit NavigationRequested(ScreenEnum::CallScreen);
                emit LRCInstance::instance().accountListChanged();
        });
    } else {
        Utils::oneShotConnect(&LRCInstance::accountModel(), &lrc::api::NewAccountModel::accountAdded,
Sébastien Blin's avatar
Sébastien Blin committed
564
            [this, isRing, isCreating](const std::string& accountId) {
565 566 567 568 569 570 571 572 573
                //set default ringtone
                auto confProps = LRCInstance::accountModel().getAccountConfig(accountId);
                confProps.Ringtone.ringtonePath = Utils::GetRingtonePath().toStdString();
                if (!isRing) {
                    // set SIP details
                    confProps.hostname = inputPara_["hostname"].toStdString();
                    confProps.username = inputPara_["username"].toStdString();
                    confProps.password = inputPara_["password"].toStdString();
                    confProps.proxyServer = inputPara_["proxy"].toStdString();
574
                }
575 576
                LRCInstance::accountModel().setAccountConfig(accountId, confProps);
                if (isRing) {
Sébastien Blin's avatar
Sébastien Blin committed
577 578 579 580 581 582
                    QSettings settings("jami.net", "Jami");
                    if (not settings.contains(SettingsKey::neverShowMeAgain)) {
                        settings.setValue(SettingsKey::neverShowMeAgain, false);
                    }
                    auto showBackup = isCreating && !settings.value(SettingsKey::neverShowMeAgain).toBool();

583
                    if (!confProps.username.empty()) {
Sébastien Blin's avatar
Sébastien Blin committed
584
                        Utils::oneShotConnect(&LRCInstance::accountModel(),
585
                            &lrc::api::NewAccountModel::nameRegistrationEnded,
Sébastien Blin's avatar
Sébastien Blin committed
586
                            [this, showBackup] {
587 588
                                lrc::api::account::ConfProperties_t accountProperties = LRCInstance::accountModel().getAccountConfig(LRCInstance::getCurrAccId());
                                LRCInstance::accountModel().setAccountConfig(LRCInstance::getCurrAccId(), accountProperties);
Sébastien Blin's avatar
Sébastien Blin committed
589 590 591 592 593 594 595
                                QSettings settings("jami.net", "Jami");
                                if (showBackup) {
                                    changePage(ui->backupKeysPage);
                                } else {
                                    emit NavigationRequested(ScreenEnum::CallScreen);
                                    emit LRCInstance::instance().accountListChanged();
                                }
596 597 598 599 600 601 602
                            });
                        LRCInstance::accountModel().registerName(
                            LRCInstance::getCurrAccId(),
                            "",
                            registeredName_.toStdString()
                        );
                    } else {
Sébastien Blin's avatar
Sébastien Blin committed
603 604 605 606 607 608
                        if (showBackup) {
                            changePage(ui->backupKeysPage);
                        } else {
                            emit NavigationRequested(ScreenEnum::CallScreen);
                            emit LRCInstance::instance().accountListChanged();
                        }
609 610 611 612
                    }
                    LRCInstance::setCurrAccAvatar(ui->setAvatarWidget->getAvatarPixmap());
                } else {
                    LRCInstance::setCurrAccAvatar(ui->setSIPAvatarWidget->getAvatarPixmap());
613

614 615 616
                }
        });
    }
617 618 619 620 621 622 623 624 625 626 627 628
    Utils::oneShotConnect(&LRCInstance::accountModel(), &lrc::api::NewAccountModel::accountRemoved,
        [this](const std::string& accountId) {
            Q_UNUSED(accountId);
            qWarning() << Q_FUNC_INFO << ": " << "accountRemoved";
            reportFailure();
        });
    Utils::oneShotConnect(&LRCInstance::accountModel(), &lrc::api::NewAccountModel::invalidAccountDetected,
        [this](const std::string& accountId) {
            Q_UNUSED(accountId);
            qWarning() << Q_FUNC_INFO << ": " << "invalidAccountDetected";
            reportFailure();
        });
629
    QtConcurrent::run(
630 631 632 633 634 635 636
        [this, isRing, isConnectingToManager] {
            if (isConnectingToManager) {
                LRCInstance::accountModel().connectToAccountManager(
                    inputPara_["username"].toStdString(),
                    inputPara_["password"].toStdString(),
                    inputPara_["manager"].toStdString()
                );
Sébastien Blin's avatar
Sébastien Blin committed
637
            } else if (isRing) {
638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655
                LRCInstance::accountModel().createNewAccount(
                    lrc::api::profile::Type::RING,
                    inputPara_["alias"].toStdString(),
                    inputPara_["archivePath"].toStdString(),
                    inputPara_["password"].toStdString(),
                    inputPara_["archivePin"].toStdString()
                );
            } else {
                LRCInstance::accountModel().createNewAccount(
                    lrc::api::profile::Type::SIP,
                    inputPara_["alias"].toStdString(),
                    inputPara_["archivePath"].toStdString(),
                    "",
                    "",
                    inputPara_["username"].toStdString()
                );
                QThread::sleep(2);
                emit NavigationRequested(ScreenEnum::CallScreen);
656
                emit LRCInstance::instance().accountListChanged();
657 658
            }
    });
Andreas Traczyk's avatar
Andreas Traczyk committed
659 660
    changePage(ui->spinnerPage);
    repaint();
661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677
}

void
NewWizardWidget::reportFailure()
{
    auto spinnerGeometry = ui->spinnerLabel->frameGeometry();
    auto pixmap = Utils::generateTintedPixmap(":/images/icons/baseline-error_outline-24px.svg", RingTheme::urgentOrange_)
        .scaled(spinnerGeometry.width(), spinnerGeometry.height());
    ui->spinnerLabel->setPixmap(pixmap);
    ui->progressLabel->setStyleSheet("color:red;");
    ui->progressLabel->setText(tr("Error creating account"));
    QTimer::singleShot(1000, this,
        [this] {
            changePage(ui->welcomePage);
            ui->progressLabel->setStyleSheet("");
            ui->spinnerLabel->setMovie(creationSpinnerMovie_);
        });
678
}