Make LenaPi usable on Android devices

- 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
This commit is contained in:
Jan-Martin Raemer 2022-07-16 12:19:57 +02:00
parent 851b83a53a
commit 1f12d93300
19 changed files with 499 additions and 48 deletions

View file

@ -4,16 +4,35 @@
#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()){
auto saver = instance();
saver->setShutdownScript(shutdownScript);
saver->initTimer(interval*1000);
saver->restartTimer();
}
#ifdef ANDROID
saver->initAdroidLocks();
#endif
}
@ -21,15 +40,32 @@ void EnergySaver::init(int interval, const QString &shutdownScript)
EnergySaver *EnergySaver::instance()
{
static EnergySaver* inst;
if (inst == nullptr)
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();
}
@ -49,9 +85,59 @@ 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;