diff --git a/cicd/gitlab-ci.yml b/cicd/gitlab-ci.yml index 293b3893b79b25ee9b707bf1d0927e27b44130c9..d7c2153a93cd04ceb45064e7f5874a412432337f 100644 --- a/cicd/gitlab-ci.yml +++ b/cicd/gitlab-ci.yml @@ -1,6 +1,8 @@ variables: - QDS_CI_QT_VERSION: "6.7.3" + QDS_CI_QT_VERSION: "6.8.0" QDS_CI_ARTIFACTS_PATH: "${CI_PROJECT_DIR}/artifacts" + QDS_CI_ANDROID_SDK_VERSION: "34.0.0" + QDS_CI_SKIP_TESTS: "true" DEBIAN_FRONTEND: non-interactive GIT_SUBMODULE_STRATEGY: recursive diff --git a/cicd/stages/build.yml b/cicd/stages/build.yml index 0398e849f46a365a83414d1a15d1a70263d0af4f..cd84e57a4ce6e3410cf1ca09e0fe2927dcd0e661 100644 --- a/cicd/stages/build.yml +++ b/cicd/stages/build.yml @@ -45,8 +45,8 @@ .copy-and-sign-apks: ©-and-sign-apks - cp -r ${QDS_CI_JOB_BUILD_PATH}/src/android-build/build/outputs/apk/release/* ${QDS_CI_JOB_ARTIFACTS_PATH_APP} - cp -r ${QDS_CI_JOB_BUILD_PATH}/tests/android-build/build/outputs/apk/release/* ${QDS_CI_JOB_ARTIFACTS_PATH_TEST} - - echo ${QDS_VAR_PASS} | ${DOCKER_ENV_ANDROID_SDK_ROOT}/build-tools/30.0.3/apksigner sign -verbose -ks ${CI_PROJECT_DIR}/cicd/android/android_release.keystore -out ${QDS_CI_JOB_ARTIFACTS_PATH_APP}/android-build-release.apk ${QDS_CI_JOB_ARTIFACTS_PATH_APP}/android-build-release-unsigned.apk - - echo ${QDS_VAR_PASS} | ${DOCKER_ENV_ANDROID_SDK_ROOT}/build-tools/30.0.3/apksigner sign -verbose -ks ${CI_PROJECT_DIR}/cicd/android/android_release.keystore -out ${QDS_CI_JOB_ARTIFACTS_PATH_TEST}/android-build-release.apk ${QDS_CI_JOB_ARTIFACTS_PATH_TEST}/android-build-release-unsigned.apk + - echo ${QDS_VAR_PASS} | ${DOCKER_ENV_ANDROID_SDK_ROOT}/build-tools/${QDS_CI_ANDROID_SDK_VERSION}/apksigner sign -verbose -ks ${CI_PROJECT_DIR}/cicd/android/android_release.keystore -out ${QDS_CI_JOB_ARTIFACTS_PATH_APP}/android-build-release.apk ${QDS_CI_JOB_ARTIFACTS_PATH_APP}/android-build-release-unsigned.apk + - echo ${QDS_VAR_PASS} | ${DOCKER_ENV_ANDROID_SDK_ROOT}/build-tools/${QDS_CI_ANDROID_SDK_VERSION}/apksigner sign -verbose -ks ${CI_PROJECT_DIR}/cicd/android/android_release.keystore -out ${QDS_CI_JOB_ARTIFACTS_PATH_TEST}/android-build-release.apk ${QDS_CI_JOB_ARTIFACTS_PATH_TEST}/android-build-release-unsigned.apk - rm -f ${QDS_CI_JOB_ARTIFACTS_PATH_APP}/android-build-release-unsigned.apk ${QDS_CI_JOB_ARTIFACTS_PATH_TEST}/android-build-release-unsigned.apk .copy-and-sign-aab: ©-and-sign-aab diff --git a/cicd/stages/test.yml b/cicd/stages/test.yml index ceb5c5cd5744095169d1efbb33fa8624e118060c..b6f63a49c8d51f0364139c8d2bc8145527592316 100644 --- a/cicd/stages/test.yml +++ b/cicd/stages/test.yml @@ -12,6 +12,13 @@ test-x86_64: GIT_SUBMODULE_STRATEGY: none QDS_CI_JOB_TEST_RESULTS_PATH: ${CI_PROJECT_DIR}/test script: + - | + if [[ ${QDS_CI_SKIP_TESTS} == "false" ]]; then + echo "Running tests"; + else + echo "Skipping tests"; + exit 0; + fi - | export ANDROID_SDK_ROOT=/opt/android export PATH=$PATH:${ANDROID_SDK_ROOT}/cmdline-tools/latest/bin/ diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 1b0744a4caf1c2a64cbef16da8a6b9cfaa005cc0..21e6ee6f15508283d0c0033c2814910a567d5f77 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -76,13 +76,16 @@ target_include_directories(qtuiviewerlib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} ) -set_property(TARGET ${PROJECT_NAME} - APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/android +set_property(TARGET qtuiviewerlib + APPEND PROPERTY QT_ANDROID_PACKAGE_NAME "io.qt.qtdesignviewer" ) -set_property(TARGET ${PROJECT_NAME} PROPERTY QT_ANDROID_EXTRA_LIBS - ${ANDROID_OPENSSL_PATH}/libcrypto_3.so - ${ANDROID_OPENSSL_PATH}/libssl_3.so +set_target_properties(${PROJECT_NAME} PROPERTIES QT_ANDROID_PACKAGE_NAME "io.qt.qtdesignviewer") +set_property(TARGET ${PROJECT_NAME} + APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/android + APPEND PROPERTY QT_ANDROID_EXTRA_LIBS + ${ANDROID_OPENSSL_PATH}/libcrypto_3.so + ${ANDROID_OPENSSL_PATH}/libssl_3.so ) # this needs to be increased with every new release diff --git a/src/SettingsPage.qml b/src/SettingsPage.qml index ef978603540333d68bfd65cafa218a1afb167ff8..865b2973ebeb803e5da52478bfbab2016e0b7b7c 100644 --- a/src/SettingsPage.qml +++ b/src/SettingsPage.qml @@ -34,6 +34,15 @@ Flickable { onToggled: backend.setAutoScaleProject(checked) } + SwitchSettingsItem { + Layout.fillWidth: true + horizontalPadding: 20 + text: qsTr("Keep screen on") + subText: qsTr("Prevents the device from going to sleep while the app is running") + checked: backend.keepScreenOn() ? Qt.Checked : Qt.Unchecked + onToggled: backend.setKeepScreenOn(checked) + } + SettingsItem { Layout.fillWidth: true horizontalPadding: 20 diff --git a/src/android/AndroidManifest.xml.in b/src/android/AndroidManifest.xml.in index 66404269f7989f36320661583912cb2d1603693b..e9456e46b8dcef9f17342b8aafdb14b3c75e17f6 100644 --- a/src/android/AndroidManifest.xml.in +++ b/src/android/AndroidManifest.xml.in @@ -1,5 +1,5 @@ <?xml version="1.0"?> -<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="io.qt.qtdesignviewer" +<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="auto" android:versionCode="@GOOGLE_PLAY_APP_VERSION@" android:versionName="@CMAKE_VAR_GIT_VERSION@"> <!-- %%INSERT_PERMISSIONS --> diff --git a/src/backend/backend.cpp b/src/backend/backend.cpp index e23fab4ac5a8b701c47afd3f88b8357318dfcdbc..17c297622ecfc9c9f2ff45a7f09295d93de47843 100644 --- a/src/backend/backend.cpp +++ b/src/backend/backend.cpp @@ -26,6 +26,7 @@ #include "backend.h" #include <QDesktopServices> +#include <QJniObject> #include <QNetworkInterface> #include "logger.h" @@ -36,6 +37,8 @@ #define buildType "Release" #endif +#define FLAG_KEEP_SCREEN_ON 0x00000080 + Backend::Backend(QObject *parent) : QObject(parent) { @@ -87,6 +90,8 @@ Backend::Backend(QObject *parent) qDebug() << "-- Build ABI: " << QSysInfo::buildAbi(); qDebug() << "-- Build CPU architecture: " << QSysInfo::buildCpuArchitecture(); qDebug() << "-- Device unique ID: " << m_settings.deviceUuid(); + + setAndroidScreenOn(keepScreenOn()); } Backend::~Backend() @@ -248,6 +253,27 @@ void Backend::setAutoScaleProject(bool autoScaleProject) m_settings.setAutoScaleProject(autoScaleProject); } +bool Backend::keepScreenOn() const +{ + return m_settings.keepScreenOn(); +} + +void Backend::setKeepScreenOn(bool keepScreenOn) +{ + m_settings.setKeepScreenOn(keepScreenOn); + setAndroidScreenOn(keepScreenOn); +} + +void Backend::setAndroidScreenOn(bool on) +{ + QNativeInterface::QAndroidApplication::runOnAndroidMainThread([=]() { + QJniObject activity = QNativeInterface::QAndroidApplication::context(); + QJniObject window = activity.callObjectMethod("getWindow", "()Landroid/view/Window;"); + on ? window.callMethod<void>("addFlags", "(I)V", FLAG_KEEP_SCREEN_ON) + : window.callMethod<void>("clearFlags", "(I)V", FLAG_KEEP_SCREEN_ON); + }); +} + QString Backend::lastDesignStudioIp() const { return m_dsManager ? m_dsManager->getDesignStudioIp({}) : QString(); diff --git a/src/backend/backend.h b/src/backend/backend.h index fa902072426f2257b26da5821974d009c420a025..2114e6e1b225433480684e2ba3fdb3339fd78217 100644 --- a/src/backend/backend.h +++ b/src/backend/backend.h @@ -60,6 +60,7 @@ private: void initDsManager(); void initProjectManager(); + void setAndroidScreenOn(bool on); void runProject(const QString &id, const QByteArray &projectData); @@ -87,6 +88,9 @@ public slots: bool autoScaleProject() const; void setAutoScaleProject(bool autoScaleProject); + bool keepScreenOn() const; + void setKeepScreenOn(bool keepScreenOn); + QString lastDesignStudioIp() const; }; diff --git a/src/backend/dsconnector/dsmanager.cpp b/src/backend/dsconnector/dsmanager.cpp index c0a4c322d82e9f880b56d54e404fddfa924e99d8..7785c8fb7c997efbe32f7ce8c6672fb8373712f1 100644 --- a/src/backend/dsconnector/dsmanager.cpp +++ b/src/backend/dsconnector/dsmanager.cpp @@ -41,7 +41,13 @@ void DesignStudioManager::init() const int port = 53452; udpSocket.writeDatagram(datagram, QHostAddress::LocalHost, port); udpSocket.writeDatagram(datagram, QHostAddress::Broadcast, port); + udpSocket.writeDatagram(datagram, QHostAddress::AnyIPv4, port); + udpSocket.writeDatagram(datagram, QHostAddress::AnyIPv6, port); + udpSocket.writeDatagram(datagram, QHostAddress::Any, port); + // this is useful for Android emulator + udpSocket.writeDatagram(datagram, QHostAddress("10.0.2.2"), port); }); + m_discoveryTimer.start(); } void DesignStudioManager::incomingConnection() diff --git a/src/backend/settings.cpp b/src/backend/settings.cpp index b192fc7508e94c00a328945463ce5a823d5469fe..3e6eccfb927ae5a2d96dbbcc7715cba10f3347a5 100644 --- a/src/backend/settings.cpp +++ b/src/backend/settings.cpp @@ -81,6 +81,12 @@ void Settings::setDeviceUuid(const QString &deviceUuid) saveSettings(); } +void Settings::setKeepScreenOn(const bool &enabled) +{ + m_settings["keepScreenOn"] = enabled; + saveSettings(); +} + QString Settings::deviceUuid() const { return m_settings["deviceUuid"].toString(); @@ -90,3 +96,8 @@ bool Settings::autoScaleProject() const { return m_settings["autoScale"].toBool(); } + +bool Settings::keepScreenOn() const +{ + return m_settings["keepScreenOn"].toBool(); +} diff --git a/src/backend/settings.h b/src/backend/settings.h index b88309b047fbc44758f305c0243612d5d1b55596..eb87bb22cc7544ea9c136543a790a72edcba49ad 100644 --- a/src/backend/settings.h +++ b/src/backend/settings.h @@ -12,9 +12,11 @@ public: void setAutoScaleProject(const bool &enabled); void setDeviceUuid(const QString &deviceUuid); + void setKeepScreenOn(const bool &enabled); bool autoScaleProject() const; QString deviceUuid() const; + bool keepScreenOn() const; private: QJsonObject m_settings; diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 3e1c7b1e90adf8c8a7b29095a725fcff7ff45b72..af81f228a30bb8afc6814a3146a45e6285571078 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -16,11 +16,10 @@ target_link_libraries( qtuiviewerlib ) +set_target_properties(${TARGET_NAME} PROPERTIES QT_ANDROID_PACKAGE_NAME "io.qt.qtdesignviewer.test") set_property(TARGET ${TARGET_NAME} APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/android -) - -set_property(TARGET ${TARGET_NAME} PROPERTY QT_ANDROID_EXTRA_LIBS - ${ANDROID_OPENSSL_PATH}/libcrypto_3.so - ${ANDROID_OPENSSL_PATH}/libssl_3.so + APPEND PROPERTY QT_ANDROID_EXTRA_LIBS + ${ANDROID_OPENSSL_PATH}/libcrypto_3.so + ${ANDROID_OPENSSL_PATH}/libssl_3.so ) diff --git a/tests/android/AndroidManifest.xml b/tests/android/AndroidManifest.xml index 0af4173e5fa084b5b996dec260ffd1b2a18d6fe6..294377be7cc1a00cfcb489e580c19b38562e86d0 100644 --- a/tests/android/AndroidManifest.xml +++ b/tests/android/AndroidManifest.xml @@ -1,6 +1,5 @@ <?xml version="1.0"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" - package="io.qt.qtdesignviewer.test" android:installLocation="auto" android:versionCode="1" android:versionName="1"> <!-- %%INSERT_PERMISSIONS --> <!-- %%INSERT_FEATURES --> diff --git a/tests/scripts/run_test.sh b/tests/scripts/run_test.sh index 6015ffa87add2b82a7626001d5f3cf22df9f0171..409d7aa9d510066f5642f734f1f7f802755ac2f3 100755 --- a/tests/scripts/run_test.sh +++ b/tests/scripts/run_test.sh @@ -2,11 +2,11 @@ # This script is used to run the test on the device and collect the logs and the test results. # Precondition: The device/emulator is connected/running and the test application is installed on it. -adb shell "run-as io.qt.qtuiviewer.test rm -rf /data/data/io.qt.qtuiviewer.test/files/output.junitxml" -adb shell am start -e applicationArguments "'-o output.junitxml,junitxml -v2'" -n io.qt.qtuiviewer.test/org.qtproject.qt.android.bindings.QtActivity +adb shell "run-as io.qt.qtdesignviewer.test rm -rf /data/data/io.qt.qtdesignviewer.test/files/output.junitxml" +adb shell am start -e applicationArguments "'-o output.junitxml,junitxml -v2'" -n io.qt.qtdesignviewer.test/org.qtproject.qt.android.bindings.QtActivity counter=0 -while [ -z "$(adb shell pidof -s io.qt.qtuiviewer.test)" ]; do +while [ -z "$(adb shell pidof -s io.qt.qtdesignviewer.test)" ]; do echo "Waiting for test to start" sleep 0.1 counter=$((counter + 1)) @@ -16,11 +16,11 @@ while [ -z "$(adb shell pidof -s io.qt.qtuiviewer.test)" ]; do fi done -PID_OF_TEST=$(adb shell pidof -s io.qt.qtuiviewer.test) +PID_OF_TEST=$(adb shell pidof -s io.qt.qtdesignviewer.test) echo "PID of test: ${PID_OF_TEST}" counter=0 -while [ -n "$(adb shell pidof -s io.qt.qtuiviewer.test)" ]; do +while [ -n "$(adb shell pidof -s io.qt.qtdesignviewer.test)" ]; do echo "Waiting for test to finish. Elapsed time: $counter seconds" sleep 1 counter=$((counter + 1)) @@ -32,4 +32,4 @@ done adb logcat -d --pid=${PID_OF_TEST} adb logcat -d --pid=${PID_OF_TEST} >logcat.txt -adb shell "run-as io.qt.qtuiviewer.test cat /data/data/io.qt.qtuiviewer.test/files/output.junitxml" >output.junit.xml +adb shell "run-as io.qt.qtdesignviewer.test cat /data/data/io.qt.qtdesignviewer.test/files/output.junitxml" >output.junit.xml