feat: 任务栏安全模式通知

当任务栏9分钟内累计崩溃3次进入安全模式后,发出通知,用户点击通知中的退出安全模式,任务栏重新加载插件。

Log: 新增任务栏安全模式通知。
Task: https://pms.uniontech.com/zentao/task-view-58411.html
Change-Id: I06b65ce4fdea29b635ff2af2dda0d0199035f4e8
This commit is contained in:
Zhang Qipeng 2021-01-21 15:31:25 +08:00 committed by zhangqipeng
parent be8d82f255
commit 625f6ba2b9
5 changed files with 81 additions and 12 deletions

View File

@ -45,8 +45,12 @@ void DBusDockAdaptors::callShow()
return parent()->callShow();
}
void DBusDockAdaptors::ReloadPlugins()
{
return parent()->relaodPlugins();
}
QRect DBusDockAdaptors::geometry() const
{
return parent()->geometry();
}

View File

@ -37,6 +37,7 @@ class DBusDockAdaptors: public QDBusAbstractAdaptor
" <interface name=\"com.deepin.dde.Dock\">\n"
" <property access=\"read\" type=\"(iiii)\" name=\"geometry\"/>\n"
" <method name=\"callShow\"/>"
" <method name=\"ReloadPlugins\"/>"
" <signal name=\"geometryChanged\">"
"<arg name=\"geometry\" type=\"(iiii)\"/>"
"</signal>"
@ -51,6 +52,7 @@ public:
public Q_SLOTS: // METHODS
void callShow();
void ReloadPlugins();
public: // PROPERTIES
Q_PROPERTY(QRect geometry READ geometry NOTIFY geometryChanged)

View File

@ -64,15 +64,14 @@ bool IsSaveMode()
QSettings settings(g_cfgPath, QSettings::IniFormat);
settings.beginGroup(qApp->applicationName());
int collapseNum = settings.value("collapse").toInt();
// 自动进入安全模式
/* 崩溃次数达到3次进入安全模式不加载插件 */
if (collapseNum >= 3) {
settings.remove(""); // 删除记录的数据
settings.setValue("collapse", 0);
settings.endGroup();
settings.sync();
return true;
}
return false;
}
@ -95,16 +94,38 @@ bool IsSaveMode()
QSettings settings(g_cfgPath, QSettings::IniFormat);
settings.beginGroup("dde-dock");
QDateTime lastDate = QDateTime::fromString(settings.value("lastDate").toString(), "yyyy-MM-dd hh:mm:ss:zzz");
int collapseNum = settings.value("collapse").toInt();
// 10秒以内发生崩溃则累加,记录到文件中
if (qAbs(lastDate.secsTo(QDateTime::currentDateTime())) < 10) {
settings.setValue("collapse", collapseNum + 1);
} else {
settings.setValue("collapse", 0);
/* 第一次崩溃或进入安全模式后的第一次崩溃,将时间重置 */
if (collapseNum == 0) {
settings.setValue("first_time", QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz"));
}
settings.setValue("lastDate", QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz"));
QDateTime lastDate = QDateTime::fromString(settings.value("first_time").toString(), "yyyy-MM-dd hh:mm:ss:zzz");
/* 将当前崩溃时间与第一次崩溃时间比较小于9分钟记录一次崩溃大于9分钟覆盖之前的崩溃时间 */
if (qAbs(lastDate.secsTo(QDateTime::currentDateTime())) < 9 * 60) {
settings.setValue("collapse", collapseNum + 1);
switch (collapseNum) {
case 0:
settings.setValue("first_time", QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz"));
break;
case 1:
settings.setValue("second_time", QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz"));
break;
case 2:
settings.setValue("third_time", QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz"));
break;
default:
qDebug() << "Error, the collapse is wrong!";
break;
}
} else {
if (collapseNum == 2){
settings.setValue("first_time", settings.value("second_time").toString());
settings.setValue("second_time", QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz"));
} else {
settings.setValue("first_time", QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz"));
}
}
settings.endGroup();
settings.sync();
@ -243,6 +264,9 @@ int main(int argc, char *argv[])
if (!IsSaveMode() && !parser.isSet(disablePlugOption)) {
DockItemManager::instance()->startLoadPlugins();
qApp->setProperty("PLUGINSLOADED", true);
} else {
mw.sendNotifications();
}
return app.exec();

View File

@ -187,6 +187,16 @@ void MainWindow::callShow()
});
}
void MainWindow::relaodPlugins()
{
if (qApp->property("PLUGINSLOADED").toBool()) {
return;
}
DockItemManager::instance()->startLoadPlugins();
qApp->setProperty("PLUGINSLOADED", true);
}
void MainWindow::showEvent(QShowEvent *e)
{
QWidget::showEvent(e);
@ -566,4 +576,31 @@ void MainWindow::setGeometry(const QRect &rect)
emit panelGeometryChanged();
}
/**
* @brief
*/
void MainWindow::sendNotifications()
{
QStringList actionButton;
actionButton << "reload" << tr("Exit Safe Mode");
QVariantMap hints;
hints["x-deepin-action-reload"] = QString("dbus-send,--session,--dest=com.deepin.dde.Dock,--print-reply,/com/deepin/dde/Dock,com.deepin.dde.Dock.ReloadPlugins");
QTimer::singleShot(0, this, [=] {
DDBusSender()
.service("com.deepin.dde.Notification")
.path("/com/deepin/dde/Notification")
.interface("com.deepin.dde.Notification")
.method(QString("Notify"))
.arg(QCoreApplication::applicationName()) // appname
.arg(static_cast<uint>(0)) // id
.arg(QString("preferences-system")) // icon
.arg(QString(tr("Dock - Safe Mode"))) // summary
.arg(tr("The Dock is in safe mode, please exit to show it properly")) // content
.arg(actionButton) // actions
.arg(hints) // hints
.arg(15000) // timeout
.call();
});
}
#include "mainwindow.moc"

View File

@ -122,6 +122,7 @@ public:
void setEffectEnabled(const bool enabled);
void setComposite(const bool hasComposite);
void setGeometry(const QRect &rect);
void sendNotifications();
friend class MainPanel;
friend class MainPanelControl;
@ -131,6 +132,7 @@ public:
public slots:
void launch();
void callShow();
void relaodPlugins();
private:
using QWidget::show;