scrobbleconfigdlg.cpp 5.42 KB
Newer Older
1 2
/**
 * Copyright (C) 2012 Martin Sandsmark <martin.sandsmark@kde.org>
3
 * Copyright (C) 2014 Arnold Dumas <contact@arnolddumas.fr>
4 5 6 7 8 9 10 11 12 13 14 15 16
 *
 * 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 2 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/>.
 */
17 18 19

#include "scrobbleconfigdlg.h"
#include "scrobbler.h"
Michael Pyne's avatar
Michael Pyne committed
20
#include "juk_debug.h"
21

22 23
#include <KLineEdit>
#include <KLocalizedString>
24
#include <KMessageBox>
25
#include <KConfigGroup>
Michael Pyne's avatar
Michael Pyne committed
26 27
#include <KSharedConfig>
#include <KWallet>
28

29
#include <QPushButton>
30 31 32 33
#include <QLayout>
#include <QLabel>
#include <QFormLayout>

34 35 36
ScrobbleConfigDlg::ScrobbleConfigDlg(QWidget* parent)
  : QDialog(parent)
  , m_wallet(Scrobbler::openKWallet())
37 38
{
    setWindowTitle(i18n("Configure scrobbling..."));
39

40 41 42
    m_passwordEdit = new KLineEdit(this);
    m_passwordEdit->setPasswordMode(true);
    m_usernameEdit = new KLineEdit(this);
43
    m_testButton = new QPushButton(i18n("Test login..."), this);
44
    m_testFeedbackLabel = new QLabel("");
45 46 47

    auto vboxLayout = new QVBoxLayout(this);

48
    QWidget *mainWidget = new QWidget();
49 50
    QFormLayout *layout = new QFormLayout(mainWidget);
    QLabel *infoLabel = new QLabel(i18n("Please enter your <a href=\"https://last.fm/\">last.fm</a> login credentials:"));
51 52 53 54 55 56 57
    infoLabel->setOpenExternalLinks(true);
    infoLabel->setTextInteractionFlags(Qt::TextBrowserInteraction);
    layout->addRow(infoLabel);
    layout->addRow(new QLabel(i18n("Username:")), m_usernameEdit);
    layout->addRow(new QLabel(i18n("Password:")), m_passwordEdit);
    layout->addRow(m_testButton);
    layout->addRow(m_testFeedbackLabel);
58 59 60 61 62 63

    auto dlgButtonBox = new QDialogButtonBox(QDialogButtonBox::Save | QDialogButtonBox::Cancel);
    vboxLayout->addWidget(mainWidget);
    vboxLayout->addStretch();
    vboxLayout->addWidget(dlgButtonBox);

64 65 66
    connect(m_passwordEdit, SIGNAL(textEdited(QString)), this, SLOT(valuesChanged()));
    connect(m_usernameEdit, SIGNAL(textEdited(QString)), this, SLOT(valuesChanged()));
    connect(m_testButton, SIGNAL(clicked(bool)), this, SLOT(testLogin()));
67

68 69
    connect(dlgButtonBox, &QDialogButtonBox::accepted, this, &ScrobbleConfigDlg::save);
    connect(dlgButtonBox, &QDialogButtonBox::rejected, this, &QDialog::reject);
70

71
    m_saveButton = dlgButtonBox->button(QDialogButtonBox::Save);
72

73 74
    // Loading credentials using either KWallet or KConfigGroup.
    if (m_wallet) {
75 76 77 78 79 80 81 82 83 84 85
        QMap<QString, QString> scrobblingCredentials;
        m_wallet->readMap("Scrobbling", scrobblingCredentials);

        if (scrobblingCredentials.contains("Username") && scrobblingCredentials.contains("Password")) {
            m_usernameEdit->setText(scrobblingCredentials.value("Username"));
            m_passwordEdit->setText(scrobblingCredentials.value("Password"));
        }
    } else {
        // Warning message, KWallet is safer than KConfig.
        KMessageBox::information(this, i18n("KWallet is unavailable, your Last.fm credentials will be stored without encryption."), i18n("KWallet is unavailable"));

86
        KConfigGroup config(KSharedConfig::openConfig(), "Scrobbling");
87 88 89 90
        m_usernameEdit->setText(config.readEntry("Username", ""));
        m_passwordEdit->setText(config.readEntry("Password", ""));
    }

91
    if (m_passwordEdit->text().isEmpty() || m_usernameEdit->text().isEmpty()) {
92
        m_saveButton->setEnabled(false);
93 94
        m_testButton->setEnabled(false);
    }
95 96 97 98
}

void ScrobbleConfigDlg::valuesChanged()
{
99 100 101 102
    m_testButton->setEnabled(
            !m_usernameEdit->text().isEmpty() &&
            !m_passwordEdit->text().isEmpty());
    m_saveButton->setEnabled(false);
103 104 105 106 107
}

void ScrobbleConfigDlg::save()
{
    QDialog::accept();
108 109 110 111 112 113 114 115 116

    if (m_wallet) {

        QMap<QString, QString> scrobblingCredentials;
        scrobblingCredentials.insert("Username", m_usernameEdit->text());
        scrobblingCredentials.insert("Password", m_passwordEdit->text());

        if (!m_wallet->writeMap("Scrobbling", scrobblingCredentials)) {

Michael Pyne's avatar
Michael Pyne committed
117
            qCCritical(JUK_LOG) << "Couldn't save Last.fm credentials using KWallet.";
118 119 120 121
        }

    } else {

122
        KConfigGroup config(KSharedConfig::openConfig(), "Scrobbling");
123 124 125
        config.writeEntry("Username", m_usernameEdit->text());
        config.writeEntry("Password", m_passwordEdit->text());
    }
126 127 128 129 130 131 132 133 134 135 136 137 138 139
}

void ScrobbleConfigDlg::testLogin()
{
    m_testFeedbackLabel->setText(i18n("Validating login..."));
    Scrobbler *scrobbler = new Scrobbler(this);
    connect(scrobbler, SIGNAL(validAuth()), this, SLOT(validLogin()));
    connect(scrobbler, SIGNAL(invalidAuth()), this, SLOT(invalidLogin()));
    setEnabled(false);
    scrobbler->getAuthToken(m_usernameEdit->text(), m_passwordEdit->text());
}

void ScrobbleConfigDlg::invalidLogin()
{
140
    m_testFeedbackLabel->setText(i18n("Login invalid."));
141 142
    setEnabled(true);
    sender()->deleteLater();
143
    m_saveButton->setEnabled(false);
144 145 146 147
}

void ScrobbleConfigDlg::validLogin()
{
148
    m_testFeedbackLabel->setText(i18n("Login valid."));
149 150
    setEnabled(true);
    sender()->deleteLater();
151
    m_saveButton->setEnabled(true);
152
}