From 08350e3c80b7e644702b48148d1dfcfa355261e3 Mon Sep 17 00:00:00 2001 From: ComixHe Date: Wed, 6 Mar 2024 12:11:49 +0800 Subject: [PATCH] feat: add property `LaunchedTimes` refactor implementation of LastLaunchedTime Signed-off-by: ComixHe --- ...opspec.ApplicationManager1.Application.xml | 59 ++++++++++----- src/applicationmanagerstorage.cpp | 29 ++++---- src/applicationmanagerstorage.h | 32 ++++---- src/constant.h | 2 + src/dbus/applicationmanager1service.cpp | 9 ++- src/dbus/applicationservice.cpp | 73 ++++++++++++++++--- src/dbus/applicationservice.h | 14 +++- 7 files changed, 153 insertions(+), 65 deletions(-) diff --git a/api/dbus/org.desktopspec.ApplicationManager1.Application.xml b/api/dbus/org.desktopspec.ApplicationManager1.Application.xml index d2fa50e..1f73c2d 100644 --- a/api/dbus/org.desktopspec.ApplicationManager1.Application.xml +++ b/api/dbus/org.desktopspec.ApplicationManager1.Application.xml @@ -2,24 +2,25 @@ - - - - + + + + - - - - + + + - - + + + + + + + + + + + + - - diff --git a/src/applicationmanagerstorage.cpp b/src/applicationmanagerstorage.cpp index d5d96c9..3dddf2d 100644 --- a/src/applicationmanagerstorage.cpp +++ b/src/applicationmanagerstorage.cpp @@ -110,10 +110,8 @@ bool ApplicationManager1Storage::setFirstLaunch(bool first) noexcept return m_data["FirstLaunch"].toBool(true); } -bool ApplicationManager1Storage::createApplicationValue(const QString &appId, - const QString &groupName, - const QString &valueKey, - const QVariant &value) noexcept +bool ApplicationManager1Storage::createApplicationValue( + const QString &appId, const QString &groupName, const QString &valueKey, const QVariant &value, bool deferCommit) noexcept { if (appId.isEmpty() or groupName.isEmpty() or valueKey.isEmpty()) { qWarning() << "unexpected empty string"; @@ -139,13 +137,11 @@ bool ApplicationManager1Storage::createApplicationValue(const QString &appId, appObj.insert(groupName, groupObj); m_data.insert(appId, appObj); - return writeToFile(); + return deferCommit ? true : writeToFile(); } -bool ApplicationManager1Storage::updateApplicationValue(const QString &appId, - const QString &groupName, - const QString &valueKey, - const QVariant &value) noexcept +bool ApplicationManager1Storage::updateApplicationValue( + const QString &appId, const QString &groupName, const QString &valueKey, const QVariant &value, bool deferCommit) noexcept { if (appId.isEmpty() or groupName.isEmpty() or valueKey.isEmpty()) { qWarning() << "unexpected empty string"; @@ -173,7 +169,7 @@ bool ApplicationManager1Storage::updateApplicationValue(const QString &appId, appObj.insert(groupName, groupObj); m_data.insert(appId, appObj); - return writeToFile(); + return deferCommit ? true : writeToFile(); } QVariant ApplicationManager1Storage::readApplicationValue(const QString &appId, @@ -209,7 +205,8 @@ QVariant ApplicationManager1Storage::readApplicationValue(const QString &appId, bool ApplicationManager1Storage::deleteApplicationValue(const QString &appId, const QString &groupName, - const QString &valueKey) noexcept + const QString &valueKey, + bool deferCommit) noexcept { if (appId.isEmpty() or groupName.isEmpty() or valueKey.isEmpty()) { qWarning() << "unexpected empty string"; @@ -237,7 +234,7 @@ bool ApplicationManager1Storage::deleteApplicationValue(const QString &appId, appObj.insert(groupName, groupObj); m_data.insert(appId, appObj); - return writeToFile(); + return deferCommit ? true : writeToFile(); } bool ApplicationManager1Storage::clearData() noexcept @@ -247,7 +244,7 @@ bool ApplicationManager1Storage::clearData() noexcept return setVersion(STORAGE_VERSION); } -bool ApplicationManager1Storage::deleteApplication(const QString &appId) noexcept +bool ApplicationManager1Storage::deleteApplication(const QString &appId, bool deferCommit) noexcept { if (appId.isEmpty()) { qWarning() << "unexpected empty string."; @@ -255,10 +252,10 @@ bool ApplicationManager1Storage::deleteApplication(const QString &appId) noexcep } m_data.remove(appId); - return writeToFile(); + return deferCommit ? true : writeToFile(); } -bool ApplicationManager1Storage::deleteGroup(const QString &appId, const QString &groupName) noexcept +bool ApplicationManager1Storage::deleteGroup(const QString &appId, const QString &groupName, bool deferCommit) noexcept { if (appId.isEmpty() or groupName.isEmpty()) { qWarning() << "unexpected empty string."; @@ -272,5 +269,5 @@ bool ApplicationManager1Storage::deleteGroup(const QString &appId, const QString app.remove(groupName); m_data.insert(appId, app); - return writeToFile(); + return deferCommit ? true : writeToFile(); } diff --git a/src/applicationmanagerstorage.h b/src/applicationmanagerstorage.h index b48b81f..b72ca6c 100644 --- a/src/applicationmanagerstorage.h +++ b/src/applicationmanagerstorage.h @@ -20,20 +20,25 @@ public: ApplicationManager1Storage &operator=(ApplicationManager1Storage &&) = default; ~ApplicationManager1Storage() = default; - bool createApplicationValue(const QString &appId, - const QString &groupName, - const QString &valueKey, - const QVariant &value) noexcept; - bool updateApplicationValue(const QString &appId, - const QString &groupName, - const QString &valueKey, - const QVariant &value) noexcept; + [[nodiscard]] bool createApplicationValue(const QString &appId, + const QString &groupName, + const QString &valueKey, + const QVariant &value, + bool deferCommit = false) noexcept; + [[nodiscard]] bool updateApplicationValue(const QString &appId, + const QString &groupName, + const QString &valueKey, + const QVariant &value, + bool deferCommit = false) noexcept; [[nodiscard]] QVariant readApplicationValue(const QString &appId, const QString &groupName, const QString &valueKey) const noexcept; - bool deleteApplicationValue(const QString &appId, const QString &groupName, const QString &valueKey) noexcept; - bool clearData() noexcept; - bool deleteApplication(const QString &appId) noexcept; - bool deleteGroup(const QString &appId, const QString &groupName) noexcept; + [[nodiscard]] bool deleteApplicationValue(const QString &appId, + const QString &groupName, + const QString &valueKey, + bool deferCommit = false) noexcept; + [[nodiscard]] bool clearData() noexcept; + [[nodiscard]] bool deleteApplication(const QString &appId, bool deferCommit = false) noexcept; + [[nodiscard]] bool deleteGroup(const QString &appId, const QString &groupName, bool deferCommit = false) noexcept; bool setVersion(uint8_t version) noexcept; [[nodiscard]] uint8_t version() const noexcept; @@ -41,7 +46,8 @@ public: bool setFirstLaunch(bool first) noexcept; [[nodiscard]] bool firstLaunch() const noexcept; - static std::shared_ptr createApplicationManager1Storage(const QString &storageDir) noexcept; + [[nodiscard]] static std::shared_ptr + createApplicationManager1Storage(const QString &storageDir) noexcept; private: [[nodiscard]] bool writeToFile() const noexcept; diff --git a/src/constant.h b/src/constant.h index a76e599..ae30094 100644 --- a/src/constant.h +++ b/src/constant.h @@ -58,6 +58,8 @@ constexpr auto STORAGE_VERSION = 0; constexpr auto ApplicationPropertiesGroup = u8"Application Properties"; constexpr auto LastLaunchedTime = u8"LastLaunchedTime"; constexpr auto ScaleFactor = u8"ScaleFactor"; +constexpr auto LaunchedTimes = u8"LaunchedTimes"; +constexpr auto InstalledTime = u8"InstalledTime"; constexpr auto ApplicationManagerHookDir = u8"/deepin/dde-application-manager/hooks.d"; diff --git a/src/dbus/applicationmanager1service.cpp b/src/dbus/applicationmanager1service.cpp index b28f43b..659891c 100644 --- a/src/dbus/applicationmanager1service.cpp +++ b/src/dbus/applicationmanager1service.cpp @@ -117,7 +117,9 @@ void ApplicationManager1Service::initService(QDBusConnection &connection) noexce scanInstances(); auto storagePtr = m_storage.lock(); - storagePtr->setFirstLaunch(false); + if (!storagePtr->setFirstLaunch(false)) { + qCritical() << "failed to update state of application manager, some properties may be lost after restart."; + } loadHooks(); @@ -519,7 +521,10 @@ void ApplicationManager1Service::removeOneApplication(const QDBusObjectPath &app if (auto it = m_applicationList.find(application); it != m_applicationList.cend()) { emit InterfacesRemoved(application, getChildInterfacesFromObject(it->data())); if (auto ptr = m_storage.lock(); ptr) { - ptr->deleteApplication((*it)->id()); + auto appId = (*it)->id(); + if (!ptr->deleteApplication(appId)) { + qCritical() << "failed to delete all properties of" << appId; + } } unregisterObjectFromDBus(application.path()); m_applicationList.remove(application); diff --git a/src/dbus/applicationservice.cpp b/src/dbus/applicationservice.cpp index 9a5e462..59dfa04 100644 --- a/src/dbus/applicationservice.cpp +++ b/src/dbus/applicationservice.cpp @@ -81,23 +81,48 @@ ApplicationService::ApplicationService(DesktopFile source, } auto appId = id(); - auto value = storagePtr->readApplicationValue(appId, ApplicationPropertiesGroup, LastLaunchedTime); + auto value = storagePtr->readApplicationValue(appId, ApplicationPropertiesGroup, InstalledTime); - qint64 val{0}; if (storagePtr->firstLaunch()) { - val = QDateTime::currentMSecsSinceEpoch(); + auto ret = value.isNull() ? storagePtr->createApplicationValue(appId, ApplicationPropertiesGroup, InstalledTime, 0) : + storagePtr->updateApplicationValue(appId, ApplicationPropertiesGroup, InstalledTime, 0); + if (!ret) { + m_installedTime = -1; + qWarning() << "failed to set InstalledTime for" << appId << "at first launch"; + } + } else { + auto newInstalledTime = QDateTime::currentMSecsSinceEpoch(); + auto ret = value.isNull() ? + storagePtr->createApplicationValue(appId, ApplicationPropertiesGroup, InstalledTime, newInstalledTime) : + true; + if (!ret) { + m_installedTime = -1; + qWarning() << "failed to set InstalledTime for new apps:" << appId; + } else { + m_installedTime = newInstalledTime; + } } + value = storagePtr->readApplicationValue(appId, ApplicationPropertiesGroup, LastLaunchedTime); if (value.isNull()) { - if (!storagePtr->createApplicationValue(appId, ApplicationPropertiesGroup, LastLaunchedTime, QVariant::fromValue(val))) { + if (!storagePtr->createApplicationValue(appId, ApplicationPropertiesGroup, LastLaunchedTime, 0)) { + qWarning() << "failed to set LastLaunchedTime for" << appId; m_lastLaunch = -1; - } else { - m_lastLaunch = val; } } else { m_lastLaunch = value.toLongLong(); } + value = storagePtr->readApplicationValue(appId, ApplicationPropertiesGroup, ::LaunchedTimes); + if (value.isNull()) { + if (!storagePtr->createApplicationValue(appId, ApplicationPropertiesGroup, ::LaunchedTimes, 0)) { + qWarning() << "failed to set LaunchedTimes for" << appId; + m_launchedTimes = -1; + } + } else { + m_launchedTimes = value.toLongLong(); + } + value = storagePtr->readApplicationValue(appId, ApplicationPropertiesGroup, ScaleFactor); if (!value.isNull()) { bool ok{false}; @@ -551,16 +576,21 @@ bool ApplicationService::terminal() const noexcept return false; } -qulonglong ApplicationService::installedTime() const noexcept +qint64 ApplicationService::installedTime() const noexcept { - return m_desktopSource.createTime(); + return m_installedTime; } -qulonglong ApplicationService::lastLaunchedTime() const noexcept +qint64 ApplicationService::lastLaunchedTime() const noexcept { return m_lastLaunch; } +qint64 ApplicationService::launchedTimes() const noexcept +{ + return m_launchedTimes; +} + double ApplicationService::scaleFactor() const noexcept { return m_scaleFactor; @@ -579,7 +609,9 @@ void ApplicationService::setScaleFactor(double value) noexcept if (value == 0) { m_customScale = false; m_scaleFactor = getScaleFactor(); - storagePtr->deleteApplicationValue(appId, ApplicationPropertiesGroup, ScaleFactor); + if (!storagePtr->deleteApplicationValue(appId, ApplicationPropertiesGroup, ScaleFactor)) { + qCritical() << "failed to delete app's property:" << appId; + } return; } @@ -1131,10 +1163,27 @@ void ApplicationService::updateAfterLaunch(bool isLaunch) noexcept auto timestamp = QDateTime::currentMSecsSinceEpoch(); if (auto ptr = m_storage.lock(); ptr) { + if (!ptr->updateApplicationValue(m_desktopSource.desktopId(), + ApplicationPropertiesGroup, + ::LastLaunchedTime, + QVariant::fromValue(timestamp), + true)) { + qWarning() << "failed to update LastLaunchedTime:" << id(); + return; + } + + if (!ptr->updateApplicationValue(m_desktopSource.desktopId(), + ApplicationPropertiesGroup, + ::LaunchedTimes, + QVariant::fromValue(m_launchedTimes + 1))) { + qWarning() << "failed to update LaunchedTimes:" << id(); + return; + } + m_lastLaunch = timestamp; - ptr->updateApplicationValue( - m_desktopSource.desktopId(), ApplicationPropertiesGroup, ::LastLaunchedTime, QVariant::fromValue(timestamp)); + m_launchedTimes += 1; emit lastLaunchedTimeChanged(); + emit launchedTimesChanged(); } } diff --git a/src/dbus/applicationservice.h b/src/dbus/applicationservice.h index 2648507..97ac604 100644 --- a/src/dbus/applicationservice.h +++ b/src/dbus/applicationservice.h @@ -61,8 +61,11 @@ public: Q_PROPERTY(QStringMap Icons READ icons NOTIFY iconsChanged) [[nodiscard]] QStringMap icons() const noexcept; - Q_PROPERTY(qulonglong LastLaunchedTime READ lastLaunchedTime NOTIFY lastLaunchedTimeChanged) - [[nodiscard]] qulonglong lastLaunchedTime() const noexcept; + Q_PROPERTY(qint64 LastLaunchedTime READ lastLaunchedTime NOTIFY lastLaunchedTimeChanged) + [[nodiscard]] qint64 lastLaunchedTime() const noexcept; + + Q_PROPERTY(qint64 LaunchedTimes READ launchedTimes NOTIFY launchedTimesChanged) + [[nodiscard]] qint64 launchedTimes() const noexcept; Q_PROPERTY(double ScaleFactor READ scaleFactor WRITE setScaleFactor NOTIFY scaleFactorChanged) [[nodiscard]] double scaleFactor() const noexcept; @@ -94,8 +97,8 @@ public: Q_PROPERTY(QString X_Deepin_Vendor READ X_Deepin_Vendor) [[nodiscard]] QString X_Deepin_Vendor() const noexcept; - Q_PROPERTY(qulonglong installedTime READ installedTime NOTIFY installedTimeChanged) - [[nodiscard]] qulonglong installedTime() const noexcept; + Q_PROPERTY(qint64 InstalledTime READ installedTime NOTIFY installedTimeChanged) + [[nodiscard]] qint64 installedTime() const noexcept; Q_PROPERTY(bool isOnDesktop READ isOnDesktop NOTIFY isOnDesktopChanged) [[nodiscard]] bool isOnDesktop() const noexcept; @@ -162,6 +165,7 @@ Q_SIGNALS: void MimeTypesChanged(); void terminalChanged(); void scaleFactorChanged(); + void launchedTimesChanged(); private: friend class ApplicationManager1Service; @@ -172,6 +176,8 @@ private: DesktopFile source, ApplicationManager1Service *parent, std::weak_ptr storage) noexcept; bool m_customScale{false}; qint64 m_lastLaunch{0}; + qint64 m_installedTime{0}; + qint64 m_launchedTimes{0}; double m_scaleFactor; std::weak_ptr m_storage; AutostartSource m_autostartSource;