From 0847485345d3d5031e45ce8ab4ef1e209d45e4df Mon Sep 17 00:00:00 2001 From: Laserlicht <13953785+Laserlicht@users.noreply.github.com> Date: Mon, 1 Sep 2025 19:37:54 +0200 Subject: [PATCH] screensaver - ios support / android refactor --- .../java/eu/vcmi/vcmi/ActivityLauncher.java | 10 ++++++++ ios/CMakeLists.txt | 1 + ios/iOS_utils.h | 1 + ios/iOS_utils.mm | 6 +++++ launcher/helper.cpp | 23 ++++--------------- launcher/modManager/cmodlistview_moc.cpp | 2 +- 6 files changed, 23 insertions(+), 20 deletions(-) diff --git a/android/vcmi-app/src/main/java/eu/vcmi/vcmi/ActivityLauncher.java b/android/vcmi-app/src/main/java/eu/vcmi/vcmi/ActivityLauncher.java index 858da49b4..25ed0026f 100644 --- a/android/vcmi-app/src/main/java/eu/vcmi/vcmi/ActivityLauncher.java +++ b/android/vcmi-app/src/main/java/eu/vcmi/vcmi/ActivityLauncher.java @@ -6,6 +6,8 @@ import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.provider.DocumentsContract; +import android.view.Window; +import android.view.WindowManager; import androidx.annotation.Nullable; @@ -55,6 +57,14 @@ public class ActivityLauncher extends org.qtproject.qt5.android.bindings.QtActiv startActivityForResult(intent, PICK_EXTERNAL_VCMI_DATA_TO_COPY); } + public void setScreensaverEnabled(boolean on) + { + if(on) + getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + else + getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + } + public void onLaunchGameBtnPressed() { startActivity(new Intent(ActivityLauncher.this, VcmiSDLActivity.class)); diff --git a/ios/CMakeLists.txt b/ios/CMakeLists.txt index c4e4ded93..905f6daa2 100644 --- a/ios/CMakeLists.txt +++ b/ios/CMakeLists.txt @@ -4,6 +4,7 @@ add_library(iOS_utils SHARED ) target_link_libraries(iOS_utils PRIVATE "-framework Foundation" + "-framework UIKit" ) target_include_directories(iOS_utils PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) diff --git a/ios/iOS_utils.h b/ios/iOS_utils.h index a50bf18f1..66a9ac28c 100644 --- a/ios/iOS_utils.h +++ b/ios/iOS_utils.h @@ -27,5 +27,6 @@ const char *frameworksPath(); const char *bundleIdentifier(); bool isOsVersionAtLeast(unsigned int osMajorVersion); +void setScreensaverEnabled(bool isEnabled); } #pragma GCC visibility pop diff --git a/ios/iOS_utils.mm b/ios/iOS_utils.mm index 7f25a9fdc..f85363b15 100644 --- a/ios/iOS_utils.mm +++ b/ios/iOS_utils.mm @@ -11,6 +11,7 @@ #include "iOS_utils.h" #import +#import namespace { @@ -51,4 +52,9 @@ bool isOsVersionAtLeast(unsigned int osMajorVersion) { return NSProcessInfo.processInfo.operatingSystemVersion.majorVersion >= osMajorVersion; } + +void setScreensaverEnabled(bool isEnabled) +{ + UIApplication.sharedApplication.idleTimerDisabled = isEnabled ? NO : YES; +} } diff --git a/launcher/helper.cpp b/launcher/helper.cpp index 8d02c0989..c64a389ff 100644 --- a/launcher/helper.cpp +++ b/launcher/helper.cpp @@ -22,11 +22,11 @@ #ifdef VCMI_ANDROID #include #include -#include #endif #ifdef VCMI_IOS #include "ios/revealdirectoryinfiles.h" +#include "iOS_utils.h" #endif #ifdef VCMI_MOBILE @@ -120,27 +120,12 @@ MainWindow * getMainWindow() void keepScreenOn(bool on) { #if defined(VCMI_ANDROID) - // based on https://stackoverflow.com/a/38846485 QtAndroid::runOnAndroidThread([on] { - QAndroidJniObject activity = QtAndroid::androidActivity(); - if(activity.isValid()) - { - QAndroidJniObject window = activity.callObjectMethod("getWindow", "()Landroid/view/Window;"); - - if(window.isValid()) - { - const int FLAG_KEEP_SCREEN_ON = 128; - if(on) - window.callMethod("addFlags", "(I)V", FLAG_KEEP_SCREEN_ON); - else - window.callMethod("clearFlags", "(I)V", FLAG_KEEP_SCREEN_ON); - } - } - QAndroidJniEnvironment env; - if (env->ExceptionCheck()) - env->ExceptionClear(); + QtAndroid::androidActivity().callMethod("setScreensaverEnabled", "(Z)V", !on); }); +#elif defined(VCMI_IOS) + iOS_utils::setScreensaverEnabled(!on); #endif } } diff --git a/launcher/modManager/cmodlistview_moc.cpp b/launcher/modManager/cmodlistview_moc.cpp index be27e60e8..75c9becce 100644 --- a/launcher/modManager/cmodlistview_moc.cpp +++ b/launcher/modManager/cmodlistview_moc.cpp @@ -793,12 +793,12 @@ void CModListView::downloadFile(QString file, QUrl url, QString description, qin ui->progressBar->setFormat(progressBarFormat); } + Helper::keepScreenOn(true); dlManager->downloadFile(url, file, sizeBytes); } void CModListView::downloadProgress(qint64 current, qint64 max) { - Helper::keepScreenOn(true); // display progress, in megabytes ui->progressBar->setVisible(true); ui->progressBar->setMaximum(max / (1024 * 1024));