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 101 102 103 104
    connect(collapsiblePasswordWidget_->getPasswordEdit(), &QLineEdit::textChanged,
        [this] {
            validateWizardProgression();
        });

105
    connect(collapsiblePasswordWidget_->getConfirmPasswordEdit(), &QLineEdit::textChanged,
Andreas Traczyk's avatar
Andreas Traczyk committed
106 107 108 109
        [this] {
            validateWizardProgression();
        });

110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
    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,
126 127 128 129
        [this] {
            validateWizardProgression();
        });

Andreas Traczyk's avatar
Andreas Traczyk committed
130 131 132 133 134 135 136 137 138 139 140 141 142
    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
143
        ui->lookupStatusLabel->hide();
Andreas Traczyk's avatar
Andreas Traczyk committed
144 145
        break;
    case NameRegistrationUIState::INVALID:
Andreas Traczyk's avatar
Andreas Traczyk committed
146
        ui->lookupStatusLabel->setPixmap(statusInvalidPixmap_);
Andreas Traczyk's avatar
Andreas Traczyk committed
147 148
        break;
    case NameRegistrationUIState::TAKEN:
Andreas Traczyk's avatar
Andreas Traczyk committed
149
        ui->lookupStatusLabel->setPixmap(statusErrorPixmap_);
Andreas Traczyk's avatar
Andreas Traczyk committed
150 151
        break;
    case NameRegistrationUIState::FREE:
Andreas Traczyk's avatar
Andreas Traczyk committed
152
        ui->lookupStatusLabel->setPixmap(statusSuccessPixmap_);
Andreas Traczyk's avatar
Andreas Traczyk committed
153 154
        break;
    case NameRegistrationUIState::SEARCHING:
Andreas Traczyk's avatar
Andreas Traczyk committed
155
        ui->lookupStatusLabel->setMovie(lookupSpinnerMovie_);
Andreas Traczyk's avatar
Andreas Traczyk committed
156 157
        lookupSpinnerMovie_->stop();
        lookupSpinnerMovie_->start();
Andreas Traczyk's avatar
Andreas Traczyk committed
158
        ui->lookupStatusLabel->show();
Andreas Traczyk's avatar
Andreas Traczyk committed
159 160 161 162 163 164 165 166 167 168 169 170
        break;
    }
}

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

171
void
172
NewWizardWidget::slotAccountListChanged()
173 174
{}

Andreas Traczyk's avatar
Andreas Traczyk committed
175
void
176
NewWizardWidget::on_fromDeviceButton_clicked()
Andreas Traczyk's avatar
Andreas Traczyk committed
177
{
178
    changePage(ui->importFromDevicePage);
Andreas Traczyk's avatar
Andreas Traczyk committed
179 180 181 182 183
}

void
NewWizardWidget::on_newAccountButton_clicked()
{
184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203
    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
204 205
}

206 207 208
void
NewWizardWidget::on_newSIPAccountButton_clicked()
{
209
    changePage(ui->createSIPAccountPage);
210 211
}

Andreas Traczyk's avatar
Andreas Traczyk committed
212 213 214 215 216 217 218
void NewWizardWidget::changePage(QWidget* toPage)
{
    if (toPage == ui->spinnerPage) {
        setNavBarVisibility(false);
    }
    Utils::setStackWidget(ui->stackedWidget, toPage);
    if (toPage == ui->welcomePage) {
219
        fileToImport_ = QString("");
Andreas Traczyk's avatar
Andreas Traczyk committed
220
        setNavBarVisibility(false, true);
Andreas Traczyk's avatar
Andreas Traczyk committed
221
        ui->lookupStatusLabel->hide();
222
        collapsiblePasswordWidget_->getPasswordStatusLabel()->hide();
223 224 225
        ui->newSIPAccountButton->hide();
        ui->connectAccountManagerButton->hide();
    } else if (toPage == ui->createAccountPage) {
Andreas Traczyk's avatar
Andreas Traczyk committed
226
        ui->usernameEdit->clear();
227 228
        collapsiblePasswordWidget_->getPasswordEdit()->clear();
        collapsiblePasswordWidget_->getConfirmPasswordEdit()->clear();
Andreas Traczyk's avatar
Andreas Traczyk committed
229 230
        ui->signUpCheckbox->setChecked(true);
        ui->usernameEdit->setEnabled(true);
231
        ui->fullNameEdit->setText(QString());
Andreas Traczyk's avatar
Andreas Traczyk committed
232 233 234 235 236 237 238
        setNavBarVisibility(true);
        updateCustomUI();
        registeredNameFoundConnection_ = connect(
            &LRCInstance::accountModel(), &lrc::api::NewAccountModel::registeredNameFound,
            this, &NewWizardWidget::slotRegisteredNameFound);
        validateWizardProgression();
        ui->setAvatarWidget->startBooth();
239
    } else if (toPage == ui->createSIPAccountPage) {
240 241 242 243 244 245 246 247 248
        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();
249 250 251
    } else if (toPage == ui->importFromDevicePage) {
        ui->pinFromDevice->clear();
        ui->passwordFromDevice->clear();
Andreas Traczyk's avatar
Andreas Traczyk committed
252
        setNavBarVisibility(true);
253
        ui->pinInfoLabel->hide();
Andreas Traczyk's avatar
Andreas Traczyk committed
254
    } else if (toPage == ui->spinnerPage) {
Andreas Traczyk's avatar
Andreas Traczyk committed
255
        ui->lookupStatusLabel->hide();
256
        collapsiblePasswordWidget_->getPasswordStatusLabel()->hide();
257 258 259 260 261 262 263 264 265 266 267 268 269
    } 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();
270 271
    } else if (toPage == ui->backupKeysPage) {
        setNavBarVisibility(false);
Andreas Traczyk's avatar
Andreas Traczyk committed
272 273 274 275 276 277 278 279 280 281 282
    }
}

void
NewWizardWidget::updateCustomUI()
{
}

void
NewWizardWidget::setNavBarVisibility(bool nav, bool back)
{
283 284 285
    ui->navBarWidget->setVisible(nav || back);
    ui->nextButton->setVisible(nav);
    ui->previousButton->setVisible(nav);
Andreas Traczyk's avatar
Andreas Traczyk committed
286 287 288 289 290 291 292
    ui->backButton->setVisible(back && LRCInstance::accountModel().getAccountList().size());
}

void
NewWizardWidget::on_nextButton_clicked()
{
    const QWidget* curWidget = ui->stackedWidget->currentWidget();
293 294
    ui->setAvatarWidget->stopBooth();
    disconnect(registeredNameFoundConnection_);
295
    if (curWidget == ui->createAccountPage) {
296 297
        wizardMode_ = WizardMode::CREATE;
        processWizardInformations();
298
    } else if (curWidget == ui->importFromDevicePage) {
299
        wizardMode_ = WizardMode::IMPORT;
Andreas Traczyk's avatar
Andreas Traczyk committed
300
        processWizardInformations();
301
    } else if (curWidget == ui->createSIPAccountPage) {
302 303
        wizardMode_ = WizardMode::CREATESIP;
        processWizardInformations();
304 305 306 307 308 309
    } 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
310 311 312 313 314 315 316
    }
}

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

331 332 333 334 335 336 337 338 339 340 341 342
void
NewWizardWidget::on_pinInfoBtn_clicked()
{
    ui->pinInfoLabel->setVisible(!ui->pinInfoLabel->isVisible());
}

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

343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370
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
371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392
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);
393
        NameDirectory::instance().lookupName(QString(), registeredName_);
Andreas Traczyk's avatar
Andreas Traczyk committed
394 395 396 397 398 399 400 401 402
    }
}

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

Andreas Traczyk's avatar
Andreas Traczyk committed
406 407 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
    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()
{
453 454 455 456 457 458 459 460 461 462 463
    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) {
464
        bool validImport = !fileToImport_.isEmpty();
465
        ui->nextButton->setEnabled(validImport);
466 467
        return;
    }
Andreas Traczyk's avatar
Andreas Traczyk committed
468 469 470 471 472 473
    bool usernameOk =
        !ui->signUpCheckbox->isChecked() ||
        (ui->signUpCheckbox->isChecked() &&
         !registeredName_.isEmpty() &&
         (registeredName_ == ui->usernameEdit->text()) &&
         registrationStateOk_ == true);
474 475 476 477 478
    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
479
    } else if (!passwordOk) {
480 481
        collapsiblePasswordWidget_->getPasswordStatusLabel()->show();
        collapsiblePasswordWidget_->getPasswordStatusLabel()->setPixmap(statusErrorPixmap_);
Andreas Traczyk's avatar
Andreas Traczyk committed
482
    } else {
483
        collapsiblePasswordWidget_->getPasswordStatusLabel()->hide();
Andreas Traczyk's avatar
Andreas Traczyk committed
484 485 486 487
    }
    ui->nextButton->setEnabled(usernameOk && passwordOk);
}

488 489 490
void
NewWizardWidget::processWizardInformations()
{
491
    inputPara_.clear();
492 493 494
    switch (wizardMode_) {
    case WizardMode::CREATE:
        ui->progressLabel->setText(tr("Generating your Jami account..."));
495
        inputPara_["alias"] = ui->fullNameEdit->text();
496
        inputPara_["password"] = collapsiblePasswordWidget_->getPasswordEdit()->text();
497
        ui->fullNameEdit->clear();
498 499
        collapsiblePasswordWidget_->getPasswordEdit()->clear();
        collapsiblePasswordWidget_->getConfirmPasswordEdit()->clear();
500 501 502
        break;
    case WizardMode::IMPORT:
        ui->progressLabel->setText(tr("Importing account archive..."));
503 504 505 506 507 508 509
        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();
        }
510 511 512 513
        break;
    case WizardMode::MIGRATE:
        ui->progressLabel->setText(tr("Migrating your Jami account..."));
        break;
514 515 516 517 518 519 520 521 522
    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;
523 524 525 526 527 528
    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;
529 530
    }

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

536
    changePage(ui->spinnerPage);
537
    createAccount();
538

539
    Utils::CreateStartupLink(L"Jami");
540 541
}

Andreas Traczyk's avatar
Andreas Traczyk committed
542
void
543
NewWizardWidget::createAccount()
Andreas Traczyk's avatar
Andreas Traczyk committed
544
{
545
    bool isConnectingToManager = wizardMode_ == WizardMode::CONNECTMANAGER;
546
    bool isRing = wizardMode_ == WizardMode::CREATE || wizardMode_ == WizardMode::IMPORT;
547
    bool isCreating = wizardMode_ == WizardMode::CREATE;
548 549 550
    if (isConnectingToManager) {
        Utils::oneShotConnect(&LRCInstance::accountModel(), &lrc::api::NewAccountModel::accountAdded,
            [this](const std::string& accountId) {
551 552
                if (!LRCInstance::accountModel().getAccountList().size())
                    return;
553 554 555 556 557 558 559 560 561
                //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,
562
            [this, isRing, isCreating](const std::string& accountId) {
563 564 565 566 567 568 569 570 571
                //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();
572
                }
573 574
                LRCInstance::accountModel().setAccountConfig(accountId, confProps);
                if (isRing) {
575 576 577 578 579 580
                    QSettings settings("jami.net", "Jami");
                    if (not settings.contains(SettingsKey::neverShowMeAgain)) {
                        settings.setValue(SettingsKey::neverShowMeAgain, false);
                    }
                    auto showBackup = isCreating && !settings.value(SettingsKey::neverShowMeAgain).toBool();

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

612 613 614
                }
        });
    }
615 616 617 618 619 620 621 622 623 624 625 626
    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();
        });
627
    QtConcurrent::run(
628 629 630 631 632 633 634
        [this, isRing, isConnectingToManager] {
            if (isConnectingToManager) {
                LRCInstance::accountModel().connectToAccountManager(
                    inputPara_["username"].toStdString(),
                    inputPara_["password"].toStdString(),
                    inputPara_["manager"].toStdString()
                );
635
            } else if (isRing) {
636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653
                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);
654
                emit LRCInstance::instance().accountListChanged();
655 656
            }
    });
Andreas Traczyk's avatar
Andreas Traczyk committed
657 658
    changePage(ui->spinnerPage);
    repaint();
659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675
}

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_);
        });
676
}