From b75bb395fd8359f162db7b5cd164aac3b9ec8655 Mon Sep 17 00:00:00 2001 From: ComixHe Date: Thu, 23 Nov 2023 15:01:31 +0800 Subject: [PATCH] refact: assuming all applications have been launched during AM create storage at first time issue: https://github.com/linuxdeepin/developer-center/issues/5768 Signed-off-by: ComixHe --- src/applicationmanagerstorage.cpp | 15 +++++++++++++++ src/applicationmanagerstorage.h | 3 +++ src/dbus/applicationmanager1service.cpp | 3 +++ src/dbus/applicationservice.cpp | 21 ++++++++++++++------- 4 files changed, 35 insertions(+), 7 deletions(-) diff --git a/src/applicationmanagerstorage.cpp b/src/applicationmanagerstorage.cpp index 3763bdd..d5d96c9 100644 --- a/src/applicationmanagerstorage.cpp +++ b/src/applicationmanagerstorage.cpp @@ -36,6 +36,7 @@ ApplicationManager1Storage::createApplicationManager1Storage(const QString &stor auto content = obj->m_file->readAll(); if (content.isEmpty()) { // new file obj->setVersion(STORAGE_VERSION); + obj->setFirstLaunch(true); return obj; } @@ -46,8 +47,11 @@ ApplicationManager1Storage::createApplicationManager1Storage(const QString &stor if (err.error != QJsonParseError::NoError) { qDebug() << "parse json failed:" << err.errorString() << "clear this file content."; obj->m_file->resize(0); + obj->setVersion(STORAGE_VERSION); + obj->setFirstLaunch(true); } else { obj->m_data = json.object(); + obj->setFirstLaunch(false); } return obj; @@ -95,6 +99,17 @@ uint8_t ApplicationManager1Storage::version() const noexcept return m_data["version"].toInt(-1); } +bool ApplicationManager1Storage::setFirstLaunch(bool first) noexcept +{ + m_data["FirstLaunch"] = first; + return writeToFile(); +} + +[[nodiscard]] bool ApplicationManager1Storage::firstLaunch() const noexcept +{ + return m_data["FirstLaunch"].toBool(true); +} + bool ApplicationManager1Storage::createApplicationValue(const QString &appId, const QString &groupName, const QString &valueKey, diff --git a/src/applicationmanagerstorage.h b/src/applicationmanagerstorage.h index 702c183..b48b81f 100644 --- a/src/applicationmanagerstorage.h +++ b/src/applicationmanagerstorage.h @@ -38,6 +38,9 @@ public: bool setVersion(uint8_t version) noexcept; [[nodiscard]] uint8_t version() const noexcept; + bool setFirstLaunch(bool first) noexcept; + [[nodiscard]] bool firstLaunch() const noexcept; + static std::shared_ptr createApplicationManager1Storage(const QString &storageDir) noexcept; private: diff --git a/src/dbus/applicationmanager1service.cpp b/src/dbus/applicationmanager1service.cpp index 3cefc1b..2e31369 100644 --- a/src/dbus/applicationmanager1service.cpp +++ b/src/dbus/applicationmanager1service.cpp @@ -84,6 +84,9 @@ void ApplicationManager1Service::initService(QDBusConnection &connection) noexce scanInstances(); + auto storagePtr = m_storage.lock(); + storagePtr->setFirstLaunch(false); + loadHooks(); if (auto *ptr = new (std::nothrow) PropertiesForwarder{DDEApplicationManager1ObjectPath, this}; ptr == nullptr) { diff --git a/src/dbus/applicationservice.cpp b/src/dbus/applicationservice.cpp index b3e027d..c12652c 100644 --- a/src/dbus/applicationservice.cpp +++ b/src/dbus/applicationservice.cpp @@ -47,14 +47,21 @@ ApplicationService::ApplicationService(DesktopFile source, auto appId = id(); auto value = storagePtr->readApplicationValue(appId, ApplicationPropertiesGroup, LastLaunchedTime); - if (value.isNull()) { - if (!storagePtr->createApplicationValue( - appId, ApplicationPropertiesGroup, LastLaunchedTime, QVariant::fromValue(0))) { - m_lastLaunch = -1; - } - return; + + qint64 val{0}; + if (storagePtr->firstLaunch()) { + val = QDateTime::currentMSecsSinceEpoch(); + } + + if (value.isNull()) { + if (!storagePtr->createApplicationValue(appId, ApplicationPropertiesGroup, LastLaunchedTime, QVariant::fromValue(val))) { + m_lastLaunch = -1; + } else { + m_lastLaunch = val; + } + } else { + m_lastLaunch = value.toLongLong(); } - m_lastLaunch = value.toInt(); value = storagePtr->readApplicationValue(appId, ApplicationPropertiesGroup, ScaleFactor); if (!value.isNull()) {