From 1ed0391590fb670596523e2ce1df224c1f105769 Mon Sep 17 00:00:00 2001
From: tanyulong <tanyulong@kylinos.cn>
Date: Mon, 12 Jul 2021 13:59:08 +0800
Subject: [PATCH]  power add sleep function

---
 commonComponent/ComboxFrame/comboxframe.cpp | 21 ++++++
 commonComponent/ComboxFrame/comboxframe.h   | 29 ++++++++
 commonComponent/comboxframe.pri             |  7 ++
 plugins/system/power/power.cpp              | 78 ++++++++++++++++++++-
 plugins/system/power/power.h                | 16 +++++
 plugins/system/power/power.pro              |  3 +-
 plugins/system/power/power.ui               | 15 +---
 plugins/system/power/powermacrodata.h       |  1 +
 registeredQDbus/sysdbusregister.cpp         | 44 ++++++++----
 registeredQDbus/sysdbusregister.h           | 13 ++--
 10 files changed, 193 insertions(+), 34 deletions(-)
 create mode 100644 commonComponent/ComboxFrame/comboxframe.cpp
 create mode 100644 commonComponent/ComboxFrame/comboxframe.h
 create mode 100644 commonComponent/comboxframe.pri

diff --git a/commonComponent/ComboxFrame/comboxframe.cpp b/commonComponent/ComboxFrame/comboxframe.cpp
new file mode 100644
index 0000000..aba3553
--- /dev/null
+++ b/commonComponent/ComboxFrame/comboxframe.cpp
@@ -0,0 +1,21 @@
+#include "comboxframe.h"
+
+ComboxFrame::ComboxFrame(QString labelStr, QWidget *parent) : mTitleName(labelStr), QFrame(parent) {
+
+    this->setMinimumSize(550, 50);
+    this->setMaximumSize(960, 50);
+    this->setFrameShape(QFrame::Shape::Box);
+
+    mTitleLabel = new QLabel(mTitleName, this);
+    mCombox = new QComboBox(this);
+
+    mHLayout = new QHBoxLayout(this);
+    mHLayout->addWidget(mTitleLabel);
+    mHLayout->addWidget(mCombox);
+
+    this->setLayout(mHLayout);
+}
+
+ComboxFrame::~ComboxFrame() {
+
+}
diff --git a/commonComponent/ComboxFrame/comboxframe.h b/commonComponent/ComboxFrame/comboxframe.h
new file mode 100644
index 0000000..d6f2679
--- /dev/null
+++ b/commonComponent/ComboxFrame/comboxframe.h
@@ -0,0 +1,29 @@
+#ifndef COMBOXFRAME_H
+#define COMBOXFRAME_H
+
+#include <QWidget>
+#include <QObject>
+#include <QLabel>
+#include <QComboBox>
+#include <QFrame>
+#include <QHBoxLayout>
+
+class ComboxFrame : public QFrame
+{
+    Q_OBJECT
+public:
+    ComboxFrame(QString labelStr, QWidget *parent = nullptr);
+    ~ComboxFrame();
+
+public:
+    QComboBox *mCombox;
+
+private:
+    QLabel      *mTitleLabel;
+    QHBoxLayout *mHLayout;
+    QString     mTitleName;
+
+signals:
+};
+
+#endif // COMBOXFRAME_H
diff --git a/commonComponent/comboxframe.pri b/commonComponent/comboxframe.pri
new file mode 100644
index 0000000..e1399d5
--- /dev/null
+++ b/commonComponent/comboxframe.pri
@@ -0,0 +1,7 @@
+#LIBINTERFACE_NAME = $$qtLibraryTarget(comboxframe)
+
+SOURCES += \
+        $$PWD/ComboxFrame/comboxframe.cpp \
+
+HEADERS += \
+        $$PWD/ComboxFrame/comboxframe.h \
diff --git a/plugins/system/power/power.cpp b/plugins/system/power/power.cpp
index ac35f93..52d1168 100755
--- a/plugins/system/power/power.cpp
+++ b/plugins/system/power/power.cpp
@@ -22,6 +22,10 @@
 #include "powermacrodata.h"
 
 #include <QDebug>
+#include <QDBusInterface>
+#include <QDBusReply>
+#include <QDBusConnection>
+#include <QSettings>
 
 typedef enum {
     BALANCE,
@@ -45,6 +49,9 @@ const int COMPUTER_BALANCE  = 30 * 60;
 const int DISPLAY_SAVING    = 20 * 60;
 const int COMPUTER_SAVING   = 2 * 60 * 60;
 
+const QStringList kHibernate { QObject::tr("Never"),QObject::tr("10min"), QObject::tr("20min"),
+                               QObject::tr("40min"), QObject::tr("80min")};
+
 Power::Power() {
     ui = new Ui::Power;
     pluginWidget = new QWidget;
@@ -59,11 +66,17 @@ Power::Power() {
 
     const QByteArray id(POWERMANAGER_SCHEMA);
 
+    initDbus();
     setupComponent();
     isPowerSupply();
     if (QGSettings::isSchemaInstalled(id)) {
         settings = new QGSettings(id, QByteArray(), this);
-        initModeStatus();
+        
+	mPowerKeys = settings->keys();
+        
+	initGeneralSet();        
+	
+	initModeStatus();
         setupConnect();
         initPowerOtherStatus();
     } else {
@@ -126,6 +139,7 @@ void Power::isPowerSupply() {
         ui->closeLidFrame->setVisible(false);
         ui->title2Label->setVisible(false);
         ui->iconFrame->setVisible(false);
+        ui->verticalSpacer_2->changeSize(0, 0);
     } else {
         qDebug() << "brightness info is valid";
         isExitsPower = true ;
@@ -134,6 +148,10 @@ void Power::isPowerSupply() {
     }
 }
 
+void Power::setHibernateTime(QString hibernate) {
+    mUkccInterface->call("setSuspendThenHibernate", hibernate);
+}
+
 void Power::setupComponent() {
     //
     ui->powerModeBtnGroup->setId(ui->balanceRadioBtn, BALANCE);
@@ -453,3 +471,61 @@ void Power::refreshUI() {
 //        ui->customWidget->setStyleSheet("QWidget{background: #F4F4F4; border-top-left-radius: 6px; border-top-right-radius: 6px;}");
     }
 }
+
+void Power::initGeneralSet() {
+    if (getHibernateStatus() && mPowerKeys.contains("afterIdleAction")) {
+        mHibernate = new ComboxFrame(tr("After suspending this time, the system will go to sleep:"), pluginWidget);
+
+        ui->powerLayout->addWidget(new QLabel(tr("General Settings")));
+        ui->powerLayout->addWidget(mHibernate);
+
+        ui->powerLayout->addStretch();
+
+        for(int i = 0; i < kHibernate.length(); i++) {
+            mHibernate->mCombox->addItem(kHibernate.at(i));
+        }
+
+        if (getHibernateTime().isEmpty()) {
+            mHibernate->mCombox->setCurrentIndex(0);
+        } else {
+            mHibernate->mCombox->setCurrentText(getHibernateTime());
+        }
+
+        connect(mHibernate->mCombox, QOverload<int>::of(&QComboBox::currentIndexChanged), this, [=](int index) {
+            setHibernateTime(mHibernate->mCombox->currentText());
+            if (index) {
+                settings->set(HIBERNATE_KEY, "suspend-then-hibernate");
+            } else {
+                settings->set(HIBERNATE_KEY, "suspend");
+            }
+        });
+    }
+}
+
+bool Power::getHibernateStatus() {
+
+    QDBusInterface loginInterface("org.freedesktop.login1",
+                                  "/org/freedesktop/login1",
+                                  "org.freedesktop.login1.Manager",
+                                  QDBusConnection::systemBus());
+
+    if (loginInterface.isValid()) {
+        QDBusReply<QString> reply = loginInterface.call("CanSuspendThenHibernate");
+        return reply.value() == "yes" ? true : false;
+    }
+}
+
+QString Power::getHibernateTime() {
+    QDBusReply<QString> hibernateTime = mUkccInterface->call("getSuspendThenHibernate");
+    if (hibernateTime.isValid()) {
+        return hibernateTime.value();
+    }
+    return "";
+}
+
+void Power::initDbus() {
+    mUkccInterface = new QDBusInterface("com.control.center.qt.systemdbus",
+                                        "/",
+                                        "com.control.center.interface",
+                                        QDBusConnection::systemBus());
+}
diff --git a/plugins/system/power/power.h b/plugins/system/power/power.h
index d6d5d1d..b4da6e4 100755
--- a/plugins/system/power/power.h
+++ b/plugins/system/power/power.h
@@ -29,6 +29,8 @@
 
 #include "shell/interface.h"
 
+#include "commonComponent/ComboxFrame/comboxframe.h"
+
 namespace Ui {
 class Power;
 }
@@ -78,9 +80,23 @@ private:
     QStringList lidStringList;
     QStringList buttonStringList;
     QStringList iconShowList;
+   
+    QStringList mPowerKeys;
 
     bool settingsCreate;
     bool isExitsPower;
+
+    ComboxFrame *mHibernate;
+    QDBusInterface *mUkccInterface;
+
+private:
+    void initGeneralSet();
+    bool getHibernateStatus();
+    QString  getHibernateTime();
+    void initDbus();
+
+private slots:
+    void setHibernateTime(QString hibernate);
 };
 
 #endif // POWER_H
diff --git a/plugins/system/power/power.pro b/plugins/system/power/power.pro
index f417bc4..795ac94 100755
--- a/plugins/system/power/power.pro
+++ b/plugins/system/power/power.pro
@@ -1,8 +1,9 @@
+include(../../../env.pri)
 QT       += widgets dbus
 TEMPLATE = lib
 CONFIG   += plugin
 
-include(../../../env.pri)
+include($$PROJECT_COMPONENTSOURCE/comboxframe.pri)
 
 TARGET = $$qtLibraryTarget(power)
 DESTDIR = ../..
diff --git a/plugins/system/power/power.ui b/plugins/system/power/power.ui
index aea2b2a..e8be31d 100755
--- a/plugins/system/power/power.ui
+++ b/plugins/system/power/power.ui
@@ -72,7 +72,7 @@
        <number>0</number>
       </property>
       <item>
-       <layout class="QVBoxLayout" name="verticalLayout">
+       <layout class="QVBoxLayout" name="powerLayout">		      
         <property name="spacing">
          <number>8</number>
         </property>
@@ -1127,19 +1127,6 @@
           </layout>
          </widget>
         </item>
-        <item>
-         <spacer name="verticalSpacer_3">
-          <property name="orientation">
-           <enum>Qt::Vertical</enum>
-          </property>
-          <property name="sizeHint" stdset="0">
-           <size>
-            <width>20</width>
-            <height>40</height>
-           </size>
-          </property>
-         </spacer>
-        </item>
        </layout>
       </item>
      </layout>
diff --git a/plugins/system/power/powermacrodata.h b/plugins/system/power/powermacrodata.h
index 65fc099..208d8c7 100755
--- a/plugins/system/power/powermacrodata.h
+++ b/plugins/system/power/powermacrodata.h
@@ -32,6 +32,7 @@
 #define BUTTON_SUSPEND_KEY "button-suspend"
 #define BUTTON_POWER_KEY "button-power"
 #define IDLE_DIM_TIME_KEY "idle-dim-time"
+#define HIBERNATE_KEY           "after-idle-action"
 
 #define PRESENT_VALUE "present"
 #define ALWAYS_VALUE "always"
diff --git a/registeredQDbus/sysdbusregister.cpp b/registeredQDbus/sysdbusregister.cpp
index 58d31db..54c2509 100755
--- a/registeredQDbus/sysdbusregister.cpp
+++ b/registeredQDbus/sysdbusregister.cpp
@@ -20,30 +20,26 @@
 #include "sysdbusregister.h"
 
 #include <QDebug>
-#include <QSettings>
 #include <QSharedPointer>
+#include <QRegExp>
+#include <stdlib.h>
 
 SysdbusRegister::SysdbusRegister()
 {
+    mHibernateFile = "/etc/systemd/sleep.conf";
+    mHibernateSet = new QSettings(mHibernateFile, QSettings::IniFormat, this);
+    mHibernateSet->setIniCodec("UTF-8");
 }
 
 SysdbusRegister::~SysdbusRegister()
 {
 }
 
-//QString SysdbusRegister::name () const{
-//    return m_name;
-//}
-
-//void SysdbusRegister::SetName(QString name){
-//    m_name = name;
-//}
-
-void SysdbusRegister::exitService(){
+void SysdbusRegister::exitService() {
     qApp->exit(0);
 }
 
-QString SysdbusRegister::GetComputerInfo(){
+QString SysdbusRegister::GetComputerInfo() {
     QByteArray ba;
     FILE * fp = NULL;
     char cmd[128];
@@ -86,7 +82,7 @@ QString SysdbusRegister::getNoPwdLoginStatus(){
 }
 
 //设置免密登录状态
-void SysdbusRegister::setNoPwdLoginStatus(bool status,QString username){
+void SysdbusRegister::setNoPwdLoginStatus(bool status,QString username) {
     QString filename = "/etc/lightdm/lightdm.conf";
     QSettings  Settings(filename, QSettings::IniFormat);
 
@@ -105,8 +101,7 @@ void SysdbusRegister::setNoPwdLoginStatus(bool status,QString username){
 }
 
 // 设置自动登录状态
-void SysdbusRegister::setAutoLoginStatus(QString username)
-{
+void SysdbusRegister::setAutoLoginStatus(QString username) {
     QString filename = "/etc/lightdm/lightdm.conf";
     QSettings  Settings(filename, QSettings::IniFormat);
 
@@ -118,3 +113,24 @@ void SysdbusRegister::setAutoLoginStatus(QString username)
     systemRun("sudo groupadd -r autologin");
     systemRun(QString("sudo gpasswd -a %1 autologin").arg(username));
 }
+
+
+QString SysdbusRegister::getSuspendThenHibernate() {
+    mHibernateSet->beginGroup("Sleep");
+
+    QString time = mHibernateSet->value("HibernateDelaySec").toString();
+
+    mHibernateSet->endGroup();
+    mHibernateSet->sync();
+
+    return time;
+}
+
+void SysdbusRegister::setSuspendThenHibernate(QString time) {
+    mHibernateSet->beginGroup("Sleep");
+
+    mHibernateSet->setValue("HibernateDelaySec", time);
+
+    mHibernateSet->endGroup();
+    mHibernateSet->sync();
+}
diff --git a/registeredQDbus/sysdbusregister.h b/registeredQDbus/sysdbusregister.h
index 8bfc94f..df75d2d 100755
--- a/registeredQDbus/sysdbusregister.h
+++ b/registeredQDbus/sysdbusregister.h
@@ -23,8 +23,8 @@
 #include <QObject>
 #include <QCoreApplication>
 #include <QProcess>
-
 #include <QFile>
+#include <QSettings>
 
 class SysdbusRegister : public QObject
 {
@@ -37,15 +37,15 @@ public:
     ~SysdbusRegister();
 
 private:
-//    QString m_name;
+    QString mHibernateFile;
+
+    QSettings *mHibernateSet;
 
 signals:
     Q_SCRIPTABLE void nameChanged(QString);
     Q_SCRIPTABLE void computerinfo(QString);
 
 public slots:
-//    Q_SCRIPTABLE QString name() const;
-//    Q_SCRIPTABLE void SetName(QString name);
 
     Q_SCRIPTABLE void exitService();
     Q_SCRIPTABLE QString GetComputerInfo();
@@ -59,7 +59,12 @@ public slots:
 
     //设置自动登录状态
     Q_SCRIPTABLE void setAutoLoginStatus(QString username);
+   
+    // 获取挂起到休眠时间
+    Q_SCRIPTABLE QString getSuspendThenHibernate();
 
+    // 设置挂起到休眠时间
+    Q_SCRIPTABLE void setSuspendThenHibernate(QString time);
 };
 
 #endif // SYSDBUSREGISTER_H
-- 
2.23.0

