diff --git a/changelog/unreleased/5644 b/changelog/unreleased/5644 new file mode 100644 index 00000000000..3fe657ee25b --- /dev/null +++ b/changelog/unreleased/5644 @@ -0,0 +1,6 @@ +Enhancement: Show last sync date in tray menu + +Users can see what "Up to date" refers to explicitly now. + +https://github.com/owncloud/client/issues/5644 +https://github.com/owncloud/client/pull/8547 diff --git a/src/gui/folderman.cpp b/src/gui/folderman.cpp index 7f69927bd63..f351c59db7e 100644 --- a/src/gui/folderman.cpp +++ b/src/gui/folderman.cpp @@ -1230,11 +1230,9 @@ void FolderMan::setDirtyNetworkLimits() } } -void FolderMan::trayOverallStatus(const QList &folders, - SyncResult::Status *status, bool *unresolvedConflicts) +TrayOverallStatusResult FolderMan::trayOverallStatus(const QList &folders) { - *status = SyncResult::Undefined; - *unresolvedConflicts = false; + TrayOverallStatusResult result; int cnt = folders.count(); @@ -1249,22 +1247,33 @@ void FolderMan::trayOverallStatus(const QList &folders, if (folder) { auto syncResult = folder->syncResult(); if (folder->syncPaused()) { - *status = SyncResult::Paused; + result.overallStatus = SyncResult::Paused; } else { SyncResult::Status syncStatus = syncResult.status(); switch (syncStatus) { case SyncResult::Undefined: - *status = SyncResult::Error; + result.overallStatus = SyncResult::Error; break; case SyncResult::Problem: // don't show the problem icon in tray. - *status = SyncResult::Success; + result.overallStatus = SyncResult::Success; break; default: - *status = syncStatus; + result.overallStatus = syncStatus; break; } } - *unresolvedConflicts = syncResult.hasUnresolvedConflicts(); + + result.hasUnresolvedConflicts = syncResult.hasUnresolvedConflicts(); + + auto currentFolderLastSyncDone = QDateTime::currentDateTime().addMSecs(-1 * folder->msecSinceLastSync().count()); + + if (result.lastSyncDone.isNull()) { + result.lastSyncDone = currentFolderLastSyncDone; + } else { + if (currentFolderLastSyncDone > result.lastSyncDone) { + result.lastSyncDone = currentFolderLastSyncDone; + } + } } } else { int errorsSeen = 0; @@ -1304,19 +1313,21 @@ void FolderMan::trayOverallStatus(const QList &folders, } } if (folderResult.hasUnresolvedConflicts()) - *unresolvedConflicts = true; + result.hasUnresolvedConflicts = true; } if (errorsSeen > 0) { - *status = SyncResult::Error; + result.overallStatus = SyncResult::Error; } else if (abortOrPausedSeen > 0 && abortOrPausedSeen == cnt) { // only if all folders are paused - *status = SyncResult::Paused; + result.overallStatus = SyncResult::Paused; } else if (runSeen > 0) { - *status = SyncResult::SyncRunning; + result.overallStatus = SyncResult::SyncRunning; } else if (goodSeen > 0) { - *status = SyncResult::Success; + result.overallStatus = SyncResult::Success; } } + + return result; } QString FolderMan::trayTooltipStatusString( diff --git a/src/gui/folderman.h b/src/gui/folderman.h index 375ffe88270..b45f4ad4615 100644 --- a/src/gui/folderman.h +++ b/src/gui/folderman.h @@ -34,6 +34,18 @@ class SyncResult; class SocketApi; class LockWatcher; +/** + * @brief Return object for Folder::trayOverallStatus. + * @ingroup gui + */ +class TrayOverallStatusResult +{ +public: + SyncResult::Status overallStatus; + bool hasUnresolvedConflicts; + QDateTime lastSyncDone; +}; + /** * @brief The FolderMan class * @ingroup gui @@ -134,9 +146,11 @@ class FolderMan : public QObject /// Produce text for use in the tray tooltip static QString trayTooltipStatusString(SyncResult::Status syncStatus, bool hasUnresolvedConflicts, bool paused); - /// Compute status summarizing multiple folders - static void trayOverallStatus(const QList &folders, - SyncResult::Status *status, bool *unresolvedConflicts); + /** + * Compute status summarizing multiple folders + * @return tuple containing folders, status, unresolvedConflicts and lastSyncDone + */ + static TrayOverallStatusResult trayOverallStatus(const QList &folders); // Escaping of the alias which is used in QSettings AND the file // system, thus need to be escaped. diff --git a/src/gui/owncloudgui.cpp b/src/gui/owncloudgui.cpp index 56ae4896b07..32a619237e4 100644 --- a/src/gui/owncloudgui.cpp +++ b/src/gui/owncloudgui.cpp @@ -263,14 +263,12 @@ void ownCloudGui::slotComputeOverallSyncStatus() FolderMan *folderMan = FolderMan::instance(); Folder::Map map = folderMan->map(); - SyncResult::Status overallStatus = SyncResult::Undefined; - bool hasUnresolvedConflicts = false; - FolderMan::trayOverallStatus(map.values(), &overallStatus, &hasUnresolvedConflicts); + auto trayOverallStatusResult = FolderMan::trayOverallStatus(map.values()); // If the sync succeeded but there are unresolved conflicts, // show the problem icon! - auto iconStatus = overallStatus; - if (iconStatus == SyncResult::Success && hasUnresolvedConflicts) { + auto iconStatus = trayOverallStatusResult.overallStatus; + if (iconStatus == SyncResult::Success && trayOverallStatusResult.hasUnresolvedConflicts) { iconStatus = SyncResult::Problem; } @@ -286,7 +284,7 @@ void ownCloudGui::slotComputeOverallSyncStatus() if (map.count() > 0) { #ifdef Q_OS_WIN // Windows has a 128-char tray tooltip length limit. - trayMessage = folderMan->trayTooltipStatusString(overallStatus, hasUnresolvedConflicts, false); + trayMessage = folderMan->trayTooltipStatusString(trayOverallStatusResult.overallStatus, trayOverallStatusResult.hasUnresolvedConflicts, false); #else QStringList allStatusStrings; foreach (Folder *folder, map.values()) { @@ -300,13 +298,22 @@ void ownCloudGui::slotComputeOverallSyncStatus() #endif _tray->setToolTip(trayMessage); - if (overallStatus == SyncResult::Success || overallStatus == SyncResult::Problem) { - if (hasUnresolvedConflicts) { + if (trayOverallStatusResult.overallStatus == SyncResult::Success || trayOverallStatusResult.overallStatus == SyncResult::Problem) { + if (trayOverallStatusResult.hasUnresolvedConflicts) { setStatusText(tr("Unresolved conflicts")); } else { - setStatusText(tr("Up to date")); + QString lastSyncDoneString; + + // display only the time in case the last sync was today + if (QDateTime::currentDateTime().date() == trayOverallStatusResult.lastSyncDone.date()) { + lastSyncDoneString = QLocale().toString(trayOverallStatusResult.lastSyncDone.time()); + } else { + lastSyncDoneString = QLocale().toString(trayOverallStatusResult.lastSyncDone); + } + + setStatusText(tr("Up to date (%1)").arg(lastSyncDoneString)); } - } else if (overallStatus == SyncResult::Paused) { + } else if (trayOverallStatusResult.overallStatus == SyncResult::Paused) { setStatusText(tr("Synchronization is paused")); } else { setStatusText(tr("Error during synchronization"));