feat: add property LaunchedTimes
				
					
				
			refactor implementation of LastLaunchedTime Signed-off-by: ComixHe <heyuming@deepin.org>
This commit is contained in:
		@ -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();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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<ApplicationManager1Storage> createApplicationManager1Storage(const QString &storageDir) noexcept;
 | 
			
		||||
    [[nodiscard]] static std::shared_ptr<ApplicationManager1Storage>
 | 
			
		||||
    createApplicationManager1Storage(const QString &storageDir) noexcept;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    [[nodiscard]] bool writeToFile() const noexcept;
 | 
			
		||||
 | 
			
		||||
@ -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";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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);
 | 
			
		||||
 | 
			
		||||
@ -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();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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<ApplicationManager1Storage> storage) noexcept;
 | 
			
		||||
    bool m_customScale{false};
 | 
			
		||||
    qint64 m_lastLaunch{0};
 | 
			
		||||
    qint64 m_installedTime{0};
 | 
			
		||||
    qint64 m_launchedTimes{0};
 | 
			
		||||
    double m_scaleFactor;
 | 
			
		||||
    std::weak_ptr<ApplicationManager1Storage> m_storage;
 | 
			
		||||
    AutostartSource m_autostartSource;
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user