diff --git a/src/modules/launcher/dbusadaptorlauncher.cpp b/src/modules/launcher/dbusadaptorlauncher.cpp
index 5ebc1bd..75b1379 100644
--- a/src/modules/launcher/dbusadaptorlauncher.cpp
+++ b/src/modules/launcher/dbusadaptorlauncher.cpp
@@ -108,8 +108,10 @@ bool DBusAdaptorLauncher::RequestSendToDesktop(const QString &id)
return parent()->requestSendToDesktop(id);
}
-void DBusAdaptorLauncher::RequestUninstall(const QString &id)
+void DBusAdaptorLauncher::RequestUninstall(const QString &id, bool unused)
{
+ Q_UNUSED(unused);
+
parent()->requestUninstall(id);
}
diff --git a/src/modules/launcher/dbusadaptorlauncher.h b/src/modules/launcher/dbusadaptorlauncher.h
index fc9626b..b195c78 100644
--- a/src/modules/launcher/dbusadaptorlauncher.h
+++ b/src/modules/launcher/dbusadaptorlauncher.h
@@ -79,6 +79,7 @@ class DBusAdaptorLauncher: public QDBusAbstractAdaptor
" \n"
" \n"
" \n"
+ " \n"
" \n"
" \n"
" \n"
@@ -133,7 +134,7 @@ public Q_SLOTS: // METHODS
bool IsItemOnDesktop(const QString &id);
bool RequestRemoveFromDesktop(const QString &id);
bool RequestSendToDesktop(const QString &id);
- void RequestUninstall(const QString &id);
+ void RequestUninstall(const QString &id, bool unused);
void SetDisableScaling(const QString &id, bool value);
void SetUseProxy(const QString &id, bool value);
diff --git a/src/modules/launcher/launcher.cpp b/src/modules/launcher/launcher.cpp
index b45b352..adc0d36 100644
--- a/src/modules/launcher/launcher.cpp
+++ b/src/modules/launcher/launcher.cpp
@@ -47,6 +47,10 @@ DCORE_USE_NAMESPACE
#define SETTING LauncherSettings::instance()
+const QString LASTORE_SERVICE = "com.deepin.lastore";
+const QString LASTORE_PATH = "/com/deepin/lastore";
+const QString LASTORE_INTERFACE = "com.deepin.lastore.Manager";
+
Launcher::Launcher(QObject *parent)
: SynModule(parent)
{
@@ -293,21 +297,19 @@ void Launcher::requestUninstall(QString appId)
}
// 执行卸载动作
- std::thread thread([&](QString appId) {
- const auto &item = itemsMap[appId];
+ auto uninstallFunc = [ this ](const QString &appId) {
+ const Item &item = itemsMap[appId];
DesktopInfo info(item.info.path.toStdString());
- if (!info.isValidDesktop())
+ if (!info.isValidDesktop()) {
+ qInfo() << "invalid desktop file...";
return;
+ }
- // 即将卸载appId
- QDBusInterface interface = QDBusInterface("org.deepin.daemon.AlRecorder1", "/org/deepin/daemon/AlRecorder1", "org.deepin.daemon.AlRecorder1");
- interface.call("UninstallHints", QStringList() << item.info.path);
-
- bool ret = doUninstall(info, item); // 阻塞等待
+ // 阻塞等待
+ bool ret = doUninstall(info, item);
if (!ret) {
QString msg = QString("uninstall %1 result %2").arg(info.getName().c_str()).arg(ret);
Q_EMIT uninstallFailed(appId, msg);
- qInfo() << msg;
return;
}
@@ -316,8 +318,10 @@ void Launcher::requestUninstall(QString appId)
QFile file(filePath);
file.remove();
Q_EMIT uninstallSuccess(appId);
- }, appId);
- thread.detach();
+ };
+
+ std::thread uninstallThread(uninstallFunc, appId);
+ uninstallThread.detach();
}
/**
@@ -434,6 +438,27 @@ void Launcher::onAppSuffixNameChanged(bool)
Q_EMIT appSuffixChanged();
}
+void Launcher::onHandleUninstall(const QDBusMessage &message)
+{
+ QList arguments = message.arguments();
+
+ if (3 != arguments.count())
+ return;
+
+ QVariantMap changedProps = qdbus_cast(arguments.at(1).value());
+ const QStringList keys = changedProps.keys();
+
+ QString status;
+ if (keys.contains("Status"))
+ status = changedProps["Status"].toString();
+
+ if (status == "succeed" || status == "end") {
+ Q_EMIT uninstallStatusChanged(true);
+ } else if (status == "failed") {
+ Q_EMIT uninstallStatusChanged(false);
+ }
+}
+
/**
* @brief Launcher::initSettings 初始化启动器配置
*/
@@ -954,12 +979,16 @@ bool Launcher::doUninstall(DesktopInfo &info, const Item &item)
if (!pkg.isEmpty()) {
// 检测包是否安装
- QDBusInterface lastoreDbus = QDBusInterface("com.deepin.lastore", "/com/deepin/lastore", "com.deepin.lastore.Manager", QDBusConnection::systemBus());
+ QDBusInterface lastoreDbus = QDBusInterface(LASTORE_SERVICE, LASTORE_PATH, LASTORE_INTERFACE, QDBusConnection::systemBus());
QDBusReply reply = lastoreDbus.call("PackageExists", pkg);
- if (!(reply.isValid() && reply.value())) // 包未安装
+
+ // 包未安装时
+ if (!(reply.isValid() && reply.value()))
return false;
- else
- return uninstallSysApp(item.info.name, pkg); // 卸载系统应用
+
+ // 卸载系统应用
+ m_desktopAndItemMap.remove(item.info.path);
+ return uninstallSysApp(item.info.name, pkg);
}
switch (getAppType(info, item)) {
@@ -1067,33 +1096,22 @@ bool Launcher::uninstallWineApp(const Item &item)
*/
bool Launcher::uninstallSysApp(const QString &name, const QString &pkg)
{
- QDBusInterface lastoreDbus = QDBusInterface("com.deepin.lastore", "/com/deepin/lastore", "com.deepin.lastore.Manager", QDBusConnection::systemBus());
- QDBusReply reply = lastoreDbus.call("RemovePackage", name, pkg);
- QDBusObjectPath jobPath;
- if (reply.isValid())
- reply.value();
+ QDBusInterface lastoreDbus = QDBusInterface(LASTORE_SERVICE, LASTORE_PATH, LASTORE_INTERFACE, QDBusConnection::systemBus());
+ QDBusReply reply = lastoreDbus.call(QDBus::Block, "RemovePackage", name, pkg);
- if (jobPath.path().isEmpty())
+ if (!reply.isValid() || reply.value().path().isEmpty())
return false;
QEventLoop loop;
- bool ret = false;
- QDBusConnection::sessionBus().connect("com.deepin.lastore",
- jobPath.path(),
- "com.deepin.lastore.Job",
- "Status",
- "sa",
- this,
- SLOT([&](QDBusMessage msg) {
- QString status = msg.arguments().at(0).toString();
- if (status == "succeed" || status == "end")
- ret = true;
- else if (status == "failed")
- ret = false;
+ QString servicePath = reply.value().path();
+ QDBusConnection::systemBus().connect(LASTORE_SERVICE, servicePath, "org.freedesktop.DBus.Properties", "PropertiesChanged","sa{sv}as", this, SLOT(onHandleUninstall(const QDBusMessage &)));
- loop.quit();
- }));
- loop.exec(); // 阻塞等待任务结束
+ bool ret = false;
+ connect(this, &Launcher::uninstallStatusChanged, &loop, [ & ](const bool status) {
+ loop.quit();
+ ret = status;
+ });
+ loop.exec();
qInfo() << "uninstall app " << name << "result is " << ret;
return ret;
diff --git a/src/modules/launcher/launcher.h b/src/modules/launcher/launcher.h
index 8b6a7ea..3fc8d25 100644
--- a/src/modules/launcher/launcher.h
+++ b/src/modules/launcher/launcher.h
@@ -116,11 +116,14 @@ Q_SIGNALS:
void fullScreenChanged(bool isFull);
void appSuffixChanged();
+ void uninstallStatusChanged(const bool status);
+
private Q_SLOTS:
void handleFSWatcherEvents(QDBusMessage msg);
void onAppSuffixNameChanged(bool hidden);
void onCheckDesktopFile(const QString &filePath, int type = 0);
void onNewAppLaunched(const QString &filePath);
+ void onHandleUninstall(const QDBusMessage &message);
private:
void initConnection();