- Add app icon - prevend android device from shutting down cpu while playing music - fix scaling bug - fix energy saver for RasPi by reconnecting to music player - minor refactorings and renaming
147 lines
3.3 KiB
C++
147 lines
3.3 KiB
C++
#include "EnergySaver.h"
|
|
|
|
#include <QDebug>
|
|
#include <QFileInfo>
|
|
#include <QProcess>
|
|
#include <iostream>
|
|
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<jstring>("android/content/Context","POWER_SERVICE");
|
|
if ( serviceName.isValid() )
|
|
{
|
|
QAndroidJniObject powerMgr = activity.callObjectMethod("getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;",serviceName.object<jobject>());
|
|
if ( powerMgr.isValid() )
|
|
{
|
|
jint levelAndFlags = QAndroidJniObject::getStaticField<jint>("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<jstring>());
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
|
|
void EnergySaver::setAndroidLock()
|
|
{
|
|
#ifdef ANDROID
|
|
if ( m_wakeLock.isValid() )
|
|
{
|
|
m_wakeLock.callMethod<void>("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<void>("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
|
|
}
|