From 1562613084cc96ce5aa047425a2c2394e3409604 Mon Sep 17 00:00:00 2001 From: Dirk Hohndel Date: Fri, 23 Feb 2024 16:21:17 -0800 Subject: [PATCH] mobile: show incorrect cloud password state While the startup flow should make it obvious when a user is not correctly logged into the cloud, we still do see fairly frequent situations where a user has an incorrect password on a mobile device and is confused about why their data isn't syncing with their PC. Now this is clearly shown in the main menu. Signed-off-by: Dirk Hohndel --- mobile-widgets/qml/main.qml | 16 ++++++++++++++++ mobile-widgets/qmlmanager.cpp | 22 ++++++++++++++++++++-- mobile-widgets/qmlmanager.h | 4 +++- 3 files changed, 39 insertions(+), 3 deletions(-) diff --git a/mobile-widgets/qml/main.qml b/mobile-widgets/qml/main.qml index f909fcd1c..b9a54af52 100644 --- a/mobile-widgets/qml/main.qml +++ b/mobile-widgets/qml/main.qml @@ -261,6 +261,22 @@ Kirigami.ApplicationWindow { font.weight: Font.Normal } } + RowLayout { + Layout.leftMargin: Kirigami.Units.smallSpacing + Layout.topMargin: 0 + Kirigami.Heading { + Layout.fillWidth: true + Layout.topMargin: 0 + visible: text.length > 0 + level: 5 + color: "white" + text: manager.passwordState + wrapMode: Text.NoWrap + elide: Text.ElideRight + font.weight: Font.Normal + } + } + RowLayout { Layout.leftMargin: Kirigami.Units.smallSpacing Layout.topMargin: 0 diff --git a/mobile-widgets/qmlmanager.cpp b/mobile-widgets/qmlmanager.cpp index 4bcce5f6d..d3fd79de3 100644 --- a/mobile-widgets/qmlmanager.cpp +++ b/mobile-widgets/qmlmanager.cpp @@ -393,16 +393,20 @@ void QMLManager::openLocalThenRemote(QString url) if (credStatus != qPrefCloudStorage::CS_NOCLOUD) { appendTextToLog(QStringLiteral("loading dives from cache failed %1").arg(error)); setNotificationText(tr("Opening local data file failed")); - if (credStatus != qPrefCloudStorage::CS_INCORRECT_USER_PASSWD) + if (credStatus != qPrefCloudStorage::CS_INCORRECT_USER_PASSWD) { qPrefCloudStorage::set_cloud_verification_status(qPrefCloudStorage::CS_NEED_TO_VERIFY); + emit passwordStateChanged(); + } } } else { // if we can load from the cache, we know that we have a valid cloud account // and we know that there was at least one successful sync with the cloud when // that local cache was created - so there is a common ancestor setLoadFromCloud(true); - if (qPrefCloudStorage::cloud_verification_status() == qPrefCloudStorage::CS_UNKNOWN) + if (qPrefCloudStorage::cloud_verification_status() == qPrefCloudStorage::CS_UNKNOWN) { qPrefCloudStorage::set_cloud_verification_status(qPrefCloudStorage::CS_VERIFIED); + emit passwordStateChanged(); + } qPrefUnits::set_unit_system(git_prefs.unit_system); qPrefTechnicalDetails::set_tankbar(git_prefs.tankbar); qPrefTechnicalDetails::set_show_ccr_setpoint(git_prefs.show_ccr_setpoint); @@ -572,6 +576,7 @@ void QMLManager::finishSetup() rememberOldStatus(); set_filename(qPrintable(nocloud_localstorage())); qPrefCloudStorage::set_cloud_verification_status(qPrefCloudStorage::CS_NOCLOUD); + emit passwordStateChanged(); saveCloudCredentials(qPrefCloudStorage::cloud_storage_email(), qPrefCloudStorage::cloud_storage_password(), qPrefCloudStorage::cloud_storage_pin()); appendTextToLog(tr("working in no-cloud mode")); int error = parse_file(existing_filename, &divelog); @@ -587,6 +592,7 @@ void QMLManager::finishSetup() } } else { qPrefCloudStorage::set_cloud_verification_status(qPrefCloudStorage::CS_UNKNOWN); + emit passwordStateChanged(); appendTextToLog(tr("no cloud credentials")); setStartPageText(RED_FONT + tr("Please enter valid cloud credentials.") + END_FONT); } @@ -651,6 +657,7 @@ void QMLManager::saveCloudCredentials(const QString &newEmail, const QString &ne !cloudCredentialsChanged) { // just go back to the dive list qPrefCloudStorage::set_cloud_verification_status(m_oldStatus); + emit passwordStateChanged(); } if (!noCloud && !verifyCredentials(email, newPassword, pin)) { @@ -760,6 +767,7 @@ void QMLManager::deleteAccount() qPrefCloudStorage::set_cloud_storage_email_encoded(""); qPrefCloudStorage::set_cloud_storage_password(""); qPrefCloudStorage::set_cloud_verification_status(qPrefCloudStorage::CS_NOCLOUD); + emit passwordStateChanged(); set_filename(qPrintable(nocloud_localstorage())); setStartPageText(tr("Cloud storage account deleted.")); return; @@ -863,6 +871,7 @@ void QMLManager::revertToNoCloudIfNeeded() qPrefCloudStorage::set_cloud_storage_password(""); rememberOldStatus(); qPrefCloudStorage::set_cloud_verification_status(qPrefCloudStorage::CS_NOCLOUD); + emit passwordStateChanged(); set_filename(qPrintable(nocloud_localstorage())); setStartPageText(RED_FONT + tr("Failed to connect to cloud server, reverting to no cloud status") + END_FONT); } @@ -2383,3 +2392,12 @@ QString QMLManager::getSyncState() const return tr("(changes synced locally)"); return tr("(synced with cloud)"); } + +// show the state of the cloud login +QString QMLManager::getPasswordState() const +{ + auto credStatus = qPrefCloudStorage::cloud_verification_status(); + if (credStatus == qPrefCloudStorage::CS_INCORRECT_USER_PASSWD) + return tr("(incorrect cloud email or password)"); + return QString(); +} diff --git a/mobile-widgets/qmlmanager.h b/mobile-widgets/qmlmanager.h index c22267121..89e072670 100644 --- a/mobile-widgets/qmlmanager.h +++ b/mobile-widgets/qmlmanager.h @@ -58,7 +58,7 @@ class QMLManager : public QObject { Q_PROPERTY(bool diveListProcessing MEMBER m_diveListProcessing WRITE setDiveListProcessing NOTIFY diveListProcessingChanged) Q_PROPERTY(bool initialized MEMBER m_initialized NOTIFY initializedChanged) Q_PROPERTY(QString syncState READ getSyncState NOTIFY syncStateChanged) - + Q_PROPERTY(QString passwordState READ getPasswordState NOTIFY passwordStateChanged) public: QMLManager(); ~QMLManager(); @@ -162,6 +162,7 @@ public: void rememberOldStatus(); QString getSyncState() const; + QString getPasswordState() const; public slots: void appInitialized(); @@ -297,6 +298,7 @@ signals: void redoTextChanged(); void restartDownloadSignal(); void syncStateChanged(); + void passwordStateChanged(); // From upload process void uploadFinish(bool success, const QString &text);