#include "EnergySaver.h" #include #include #include #include EnergySaver::~EnergySaver() { #ifdef ANDROID releaseAndroidLock(); #endif } void EnergySaver::init() { auto saver = instance(); saver->mIsAutoShutDownEnabled = false; #ifdef ANDROID saver->initAdroidLocks(); #endif } void EnergySaver::init(int interval, const QString &shutdownScript) { auto saver = instance(); saver->mIsAutoShutDownEnabled = true; QFileInfo script(shutdownScript); if(script.exists()){ saver->setShutdownScript(shutdownScript); saver->initTimer(interval*1000); saver->restartTimer(); } #ifdef ANDROID saver->initAdroidLocks(); #endif } EnergySaver *EnergySaver::instance() { static EnergySaver* inst; if (!inst) { inst = new EnergySaver(); } return inst; } void EnergySaver::deactivate() { mIsActive = false; mTimer.stop(); setAndroidLock(); } void EnergySaver::activate() { mIsActive = true; restartTimer(); releaseAndroidLock(); } void EnergySaver::restartTimer() { // Energy saver is currently deactivated -> Do NOT start timer if(!mIsActive) return; if(mTimer.isActive()){ mTimer.stop(); } mTimer.start(); } void EnergySaver::initTimer(int interval) { connect(&mTimer, &QTimer::timeout, this, &EnergySaver::onTimeout); mTimer.setInterval(interval); mTimer.setSingleShot(true); } void EnergySaver::setShutdownScript(const QString &shutdownScript) { mShutdownScript = shutdownScript; } void EnergySaver::initAdroidLocks() { #ifdef ANDROID QAndroidJniObject activity = QAndroidJniObject::callStaticObjectMethod("org/qtproject/qt5/android/QtNative", "activity", "()Landroid/app/Activity;"); if ( activity.isValid() ) { QAndroidJniObject serviceName = QAndroidJniObject::getStaticObjectField("android/content/Context","POWER_SERVICE"); if ( serviceName.isValid() ) { QAndroidJniObject powerMgr = activity.callObjectMethod("getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;",serviceName.object()); if ( powerMgr.isValid() ) { jint levelAndFlags = QAndroidJniObject::getStaticField("android/os/PowerManager","SCREEN_DIM_WAKE_LOCK"); QAndroidJniObject tag = QAndroidJniObject::fromString( "My Tag" ); m_wakeLock = powerMgr.callObjectMethod("newWakeLock", "(ILjava/lang/String;)Landroid/os/PowerManager$WakeLock;", levelAndFlags,tag.object()); } } } #endif } void EnergySaver::setAndroidLock() { #ifdef ANDROID if ( m_wakeLock.isValid() ) { m_wakeLock.callMethod("acquire", "()V"); qDebug() << "Locked device, can't go to standby anymore"; } else { assert( false ); } #endif } void EnergySaver::releaseAndroidLock() { #ifdef ANDROID if ( m_wakeLock.isValid() ) { m_wakeLock.callMethod("release", "()V"); qDebug() << "Unlocked device, can now go to standby"; } #endif } void EnergySaver::onTimeout() { if(!mIsAutoShutDownEnabled) return; std::cout << "Shutting down."; #ifndef _DEBUG QProcess p; p.start(mShutdownScript); p.waitForFinished(); #endif }