Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • alcroito/qt-ui-viewer
  • design-studio/design-viewer/qt-ui-viewer
2 results
Show changes
Commits on Source (30)
Showing
with 260 additions and 71 deletions
Subproject commit 34b97d40d86d7c243cb6bf8245d717397ef25268
Subproject commit 04a5f670d3e7ae28e54bf194a3dd70e13d05ffc4
......@@ -20,6 +20,13 @@ if(QT_VERSION VERSION_LESS QT_MINIMUM_VERSION)
endif()
if(ANDROID)
# try to locate the OpenSSL for Android if not set
if(NOT DEFINED ANDROID_OPENSSL_PATH OR ANDROID_OPENSSL_PATH STREQUAL "")
if(EXISTS "${ANDROID_SDK_ROOT}/android_openssl/ssl_3/${ANDROID_ABI}")
set(ANDROID_OPENSSL_PATH ${ANDROID_SDK_ROOT}/android_openssl/ssl_3/${ANDROID_ABI})
endif()
endif()
if(NOT EXISTS ${ANDROID_OPENSSL_PATH})
message(WARNING "Cannot find OpenSSL for Android. Path: ${ANDROID_OPENSSL_PATH}")
message(FATAL_ERROR "Please set ANDROID_OPENSSL_PATH to the path of OpenSSL for Android.")
......@@ -40,11 +47,16 @@ execute_process(COMMAND git -C ${CMAKE_SOURCE_DIR}/3rdparty/zxing-cpp describe -
add_definitions( -DCMAKE_VAR_GIT_VERSION="${CMAKE_VAR_GIT_VERSION}" )
add_definitions( -DCMAKE_VAR_QT_QUICK_COMPONENTS_VERSION="${CMAKE_VAR_QT_QUICK_COMPONENTS_VERSION}" )
add_definitions( -DCMAKE_VAR_ZXING_VERSION="${CMAKE_VAR_ZXING_VERSION}" )
# this needs to be increased with every new release
if(NOT DEFINED GOOGLE_PLAY_APP_VERSION)
set(GOOGLE_PLAY_APP_VERSION 31)
endif()
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/zxing-cpp)
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/src)
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/tests)
message(STATUS "GOOGLE_PLAY_APP_VERSION: ${GOOGLE_PLAY_APP_VERSION}")
message(STATUS "PROJECT VERSION: ${CMAKE_VAR_GIT_VERSION}")
message(STATUS "QT_VERSION: ${QT_VERSION}")
message(STATUS "QT_QUICK_COMPONENTS_VERSION: ${CMAKE_VAR_QT_QUICK_COMPONENTS_VERSION}")
......
# Qt UI Viewer
![Qt UI Viewer](assets/PlayStoreFeatureImage.svg)
## About
Launch [Qt Design Studio](https://www.qt.io/ui-design-tools) projects in your Android device. The viewer that helps you do with [Qt for Android](https://doc.qt.io/qt-6/android.html).
Launch [Qt Design Studio](https://www.qt.io/ui-design-tools) projects in your Android device in seconds. Qt UI Viewer is a simple app that allows you to view your Qt Design Studio projects on your Android device. It's a great tool for designers and developers to preview their designs on a real device.
Qt UI Viewer works with minimum Android 11 (API level 30).
Qt UI Viewer is built with [Qt for Android](https://doc.qt.io/qt-6/android.html).
## Getting the App
......@@ -12,22 +14,22 @@ You can get the pre-built app from either [Google Play Store][google-play-link]
## Prerequisites
* Qt Design Studio 4.7 or newer
* CMake 3.16 or newer
* Qt6.5.0 or newer
* Qt 6.8.0 or newer
* OpenSSL (<https://github.com/KDAB/android_openssl>)
* Android SDK and NDK (<https://developer.android.com/studio>)
* Android (min API 34) SDK and NDK (<https://developer.android.com/studio>)
## Code Map
* cicd: GitLab pipeline files
* resources: UI related files
* android: Files needed for Android build system
* src: Backend source files
* ui: UI source files
* src: All source files
* 3rdparty: Required 3rd party libraries
* qtquickdesigner-components: QML components
* zxing-cpp: QR code decoding/encoding
* icons: App icons
* assets: Play Store Assets
* tests: Test files
## Building
......@@ -81,7 +83,24 @@ cmake --build build
## Usage
Upload the final APK file to your Android device and run. Then follow the instructions within the app.
Upload the final APK file to your Android device or emulator and run. Then follow the instructions within the app.
### Running on Android Emulator
For creating and running an Android emulator, follow the instructions on the [avdmanager][avd-manager] and [emulator][android-emulator] pages. Please also make sure that [telnet][telnet-wiki] is installed on your system for [emulator console][emulator console] commands.
Android emulators run behind a [virtual router](https://developer.android.com/studio/run/emulator-networking) and network address translation (NAT) so they can't be accessed directly from the host machine. There is one TCP port required to be forwarded in between that virtual router and the host machine so that Qt Design Studio can communicate with the application.
After creating and spinning up the emulator, you can forward the required ports to the emulator with the following command on terminal:
> Note: This unfortunately needs to be repeated every time the emulator is started.
```bash
telnet localhost 5554 --> ( that will show you the file to get the auth code )
auth <auth-code>
redir add tcp:40000:40000
```
Then in the Qt Design Studio add a new device with the IP of 127.0.0.1
## Testing
......@@ -91,14 +110,14 @@ Test results can be viewed with any JUnit compatible viewer. For example, you ca
```bash
npm i -g xunit-viewer
xunit-viewer -r output.junit.xml
xunit-viewer -r output.junitxml -s -w
```
It'll create a `report.html` file that can be opened in a web browser. For more information about `xunit-viewer` please visit the [GitHub repo](https://github.com/lukejpreston/xunit-viewer).
It'll create a `report.html` file that can be opened in a web browser. For more information about `xunit-viewer` please visit the [GitHub repo][xunit-viewer].
## Versioning
[android:versionCode](https://developer.android.com/guide/topics/manifest/manifest-element#vcode) is an integer value that should be incremented for each new release and it's required by Google Play Store. It's used to determine if the app should be updated or not.
[android:versionCode][manifest-vcode] is an integer value that should be incremented for each new release and it's required by Google Play Store. It's used to determine if the app should be updated or not.
During the development this value can be set to any arbitrary integer. But for the release it should be incremented. The value can be controlled by setting the CMake variable called `GOOGLE_PLAY_APP_VERSION` during the CMake configuration step.
......@@ -108,7 +127,7 @@ It's easy for an individual developer to forget to increment it before the relea
android:versionCode = <total_number_of_tags> + 11
```
The value `11` is coming from the times where `GOOGLE_PLAY_APP_VERSION` was increased without creating a tag, so we have an offset in between the tag count and the actual value. From now on the value should be incremented by creating a new tag.
The magic value `11` is coming from the times where `GOOGLE_PLAY_APP_VERSION` was increased without creating a tag, so we have an offset in between the tag count and the actual value. From now on the value should be incremented by creating a new tag.
There's no `AndroidManifest.xml` file in the repository. `AndroidManifest.xml.in` file is used to generate the `AndroidManifest.xml` file during the configuration step. The `versionCode` value is set to the `GOOGLE_PLAY_APP_VERSION` and the `versionName` value is set to the output of the `git describe --always --tags` command.
......@@ -126,3 +145,9 @@ Both values can be seen in the `AndroidManifest.xml` file after the CMake config
[google-play-link]: <https://play.google.com/store/apps/details?id=io.qt.qtdesignviewer>
[package-registry]: <https://git.qt.io/design-studio/design-viewer/qt-ui-viewer/-/packages>
[xunit-viewer]: <https://github.com/lukejpreston/xunit-viewer>
[manifest-vcode]: <https://developer.android.com/studio/publish/versioning>
[avd-manager]:<https://developer.android.com/tools/avdmanager>
[android-emulator]:<https://developer.android.com/studio/run/emulator-commandline>
[telnet-wiki]:<https://en.wikipedia.org/wiki/Telnet>
[emulator console]:<https://developer.android.com/studio/run/emulator-console>
This diff is collapsed.
<svg width="256" height="256" viewBox="0 0 256 256" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_674_15)">
<path d="M0 32V256H224L256 224V0H32L0 32Z" fill="url(#paint0_linear_674_15)"/>
<path d="M51.046 175.993C51.046 187.179 56.733 192.772 68.107 192.772C79.481 192.772 85.168 187.179 85.168 175.993V112.12H104.626V175.57C104.626 187.32 101.571 195.968 95.461 201.514C89.445 206.966 80.327 209.692 68.107 209.692C55.887 209.692 46.722 206.966 40.612 201.514C34.596 195.968 31.588 187.32 31.588 175.57V112.12H51.046V175.993ZM173.758 112.12H194.203L171.925 208H135.97L113.692 112.12H134.137L150.775 191.08H157.12L173.758 112.12Z" fill="#2CDE85"/>
</g>
<defs>
<linearGradient id="paint0_linear_674_15" x1="-2.26125e-06" y1="208.5" x2="256" y2="48.5" gradientUnits="userSpaceOnUse">
<stop stop-color="#0F7080"/>
<stop offset="1" stop-color="#01525F"/>
</linearGradient>
<clipPath id="clip0_674_15">
<rect width="256" height="256" fill="white"/>
</clipPath>
</defs>
</svg>
File deleted
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: "false"
DEBIAN_FRONTEND: non-interactive
GIT_SUBMODULE_STRATEGY: recursive
......
......@@ -3,23 +3,27 @@
.build-components: &build-components
- pushd 3rdparty/qtquickdesigner-components
- |
cmake \
-S . \
-G Ninja \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_TOOLCHAIN_FILE=${QDS_CI_JOB_QT_ANDROID_PATH}/lib/cmake/Qt6/qt.toolchain.cmake \
-DANDROID_SDK_ROOT=${DOCKER_ENV_ANDROID_SDK_ROOT} \
-DANDROID_NDK_ROOT=${DOCKER_ENV_ANDROID_NDK_ROOT} \
-DQT_HOST_PATH=${DOCKER_ENV_QT_PATH_LINUX_GCC_64} \
-DFLOWVIEW_AUTO_QMLDIR=ON \
-DCMAKE_INSTALL_PREFIX=${QDS_CI_JOB_QT_ANDROID_PATH}
- cmake --build .
- cmake --install .
for arch in ${QDS_CI_JOB_ARCHS}; do
QT_DIR_WITH_ARCH=${DOCKER_ENV_QT_PATH_WITH_VERSION}/${arch}
BUILD_PATH=${QDS_CI_JOB_BUILD_PATH}/components/${arch}
cmake \
-S . \
-G Ninja \
-B ${BUILD_PATH} \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_TOOLCHAIN_FILE=${QT_DIR_WITH_ARCH}/lib/cmake/Qt6/qt.toolchain.cmake \
-DANDROID_SDK_ROOT=${DOCKER_ENV_ANDROID_SDK_ROOT} \
-DANDROID_NDK_ROOT=${DOCKER_ENV_ANDROID_NDK_ROOT} \
-DQT_HOST_PATH=${DOCKER_ENV_QT_PATH_LINUX_GCC_64} \
-DFLOWVIEW_AUTO_QMLDIR=ON \
-DCMAKE_INSTALL_PREFIX=${QT_DIR_WITH_ARCH}
cmake --build ${BUILD_PATH} --target install
rm -rf ${BUILD_PATH}
done
- popd
.build-android-apps: &build-android-apps
.build-app: &build-app
- export GOOGLE_PLAY_APP_VERSION=$(( $(git tag --list | wc -l) +11 ))
# where is this magic "$(git tag --list | wc -l) +11" coming from?
# "git tag --list | wc -l" counts the number of tags in the repository.
# The "+11" is a magic number which is the last GOOGLE_PLAY_APP_VERSION
# that was released before starting to add tags to the repository. After
......@@ -32,62 +36,81 @@
-B ${QDS_CI_JOB_BUILD_PATH} \
-G Ninja \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_TOOLCHAIN_FILE=${QDS_CI_JOB_QT_ANDROID_PATH}/lib/cmake/Qt6/qt.toolchain.cmake \
-DCMAKE_TOOLCHAIN_FILE=${QDS_CI_JOB_QT_PATH}/lib/cmake/Qt6/qt.toolchain.cmake \
-DANDROID_SDK_ROOT=${DOCKER_ENV_ANDROID_SDK_ROOT} \
-DANDROID_NDK_ROOT=${DOCKER_ENV_ANDROID_NDK_ROOT} \
-DQT_HOST_PATH=${DOCKER_ENV_QT_PATH_LINUX_GCC_64} \
-DCMAKE_INSTALL_PREFIX=${QDS_CI_JOB_QT_ANDROID_PATH} \
-DCMAKE_INSTALL_PREFIX=${QDS_CI_JOB_QT_PATH} \
-DANDROID_OPENSSL_PATH=${QDS_CI_JOB_OPENSSL_PATH} \
-DGOOGLE_PLAY_APP_VERSION=${GOOGLE_PLAY_APP_VERSION} \
-DQT_ANDROID_BUILD_ALL_ABIS=ON \
-DQT_ANDROID_MULTI_ABI_FORWARD_VARS="GOOGLE_PLAY_APP_VERSION;ANDROID_OPENSSL_PATH" \
-DBUILD_EXAMPLES=OFF
- cmake --build ${QDS_CI_JOB_BUILD_PATH} --target aab
- cat ${QDS_CI_JOB_BUILD_PATH}/src/dynamic_imports.qml
- cmake --build ${QDS_CI_JOB_BUILD_PATH} --target ${QDS_CI_JOB_CMAKE_BUILD_TARGET}
.copy-and-sign-apks: &copy-and-sign-apks
- QDS_CI_KEYSTORE_PATH=$(pwd)/android_release.keystore
- QDS_CI_APK_SIGNER_PATH=${DOCKER_ENV_ANDROID_SDK_ROOT}/build-tools/${QDS_CI_ANDROID_SDK_VERSION}/apksigner
- echo ${QDS_VAR_KEYSTORE} | base64 -d > ${QDS_CI_KEYSTORE_PATH}
- 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} | ${QDS_CI_APK_SIGNER_PATH} sign -verbose -ks ${QDS_CI_KEYSTORE_PATH} -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} | ${QDS_CI_APK_SIGNER_PATH} sign -verbose -ks ${QDS_CI_KEYSTORE_PATH} -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: &copy-and-sign-aab
- |
if [[ -n ${CI_COMMIT_TAG} ]];
then
QDS_CI_KEYSTORE_PATH=$(pwd)/android_release.keystore
echo ${QDS_VAR_KEYSTORE} | base64 -d > ${QDS_CI_KEYSTORE_PATH}
cp -r ${QDS_CI_JOB_BUILD_PATH}/src/android-build/build/outputs/bundle/release/* ${QDS_CI_JOB_ARTIFACTS_PATH_APP}
/usr/bin/jarsigner -keystore ${CI_PROJECT_DIR}/cicd/android/android_release.keystore ${QDS_CI_JOB_ARTIFACTS_PATH_APP}/android-build-release.aab designviewer -storepass ${QDS_VAR_PASS}
/usr/bin/jarsigner -keystore ${QDS_CI_KEYSTORE_PATH} ${QDS_CI_JOB_ARTIFACTS_PATH_APP}/android-build-release.aab ${QDS_VAR_KEYSTORE_ALIAS} -storepass ${QDS_VAR_PASS}
fi
build-android:
.build-common:
extends: .pipeline_common
stage: build
# rules:
# - if: $CI_PIPELINE_SOURCE == "push" || $CI_PIPELINE_SOURCE == "web"
parallel:
matrix:
- QDS_CI_JOB_TARGET_ARCH: "arm64_v8a"
QDS_CI_JOB_OPENSSL_PATH: "/opt/openssl/ssl_3/arm64-v8a"
- QDS_CI_JOB_TARGET_ARCH: "armv7"
QDS_CI_JOB_OPENSSL_PATH: "/opt/openssl/ssl_3/armeabi-v7a"
- QDS_CI_JOB_TARGET_ARCH: "x86"
QDS_CI_JOB_OPENSSL_PATH: "/opt/openssl/ssl_3/x86"
- QDS_CI_JOB_TARGET_ARCH: "x86_64"
QDS_CI_JOB_OPENSSL_PATH: "/opt/openssl/ssl_3/x86_64"
variables:
QDS_CI_JOB_BUILD_PATH: "${QDS_CI_CACHE_PATH}/${QDS_CI_JOB_TARGET_ARCH}/build"
QDS_CI_JOB_TARGET_PLATFORM: "android"
QDS_CI_JOB_ARTIFACTS_PATH: ${QDS_CI_ARTIFACTS_PATH}/${QDS_CI_JOB_TARGET_ARCH}
QDS_CI_JOB_ARTIFACTS_PATH_APP: ${QDS_CI_JOB_ARTIFACTS_PATH}/app
QDS_CI_JOB_ARTIFACTS_PATH_TEST: ${QDS_CI_JOB_ARTIFACTS_PATH}/test
artifacts:
name: qt_ui_viewer-${CI_JOB_ID}-qt${QDS_CI_QT_VERSION}-${QDS_CI_JOB_TARGET_ARCH}
name: qt_ui_viewer-${CI_JOB_ID}-qt${QDS_CI_QT_VERSION}-${QDS_CI_JOB_TARGET_PLATFORM}
expose_as: "build-artifacts"
paths:
- ${QDS_CI_ARTIFACTS_PATH}
expire_in: 1 week
build-android:
extends: .build-common
variables:
QDS_CI_JOB_TARGET_PLATFORM: "android"
QDS_CI_JOB_ARCHS: android_arm64_v8a android_armv7 android_x86 android_x86_64
QDS_CI_JOB_OPENSSL_PATH: "/opt/openssl/ssl_3/arm64-v8a"
QDS_CI_JOB_BUILD_PATH: "${CI_PROJECT_DIR}/${QDS_CI_JOB_TARGET_PLATFORM}/build"
QDS_CI_JOB_ARTIFACTS_PATH: ${QDS_CI_ARTIFACTS_PATH}/${QDS_CI_JOB_TARGET_PLATFORM}
QDS_CI_JOB_ARTIFACTS_PATH_APP: ${QDS_CI_JOB_ARTIFACTS_PATH}/app
QDS_CI_JOB_ARTIFACTS_PATH_TEST: ${QDS_CI_JOB_ARTIFACTS_PATH}/test
QDS_CI_JOB_CMAKE_BUILD_TARGET: "aab"
script:
- mkdir -p ${QDS_CI_JOB_ARTIFACTS_PATH_APP} ${QDS_CI_JOB_ARTIFACTS_PATH_TEST}
- export QDS_CI_JOB_QT_ANDROID_PATH="${DOCKER_ENV_QT_PATH_WITH_VERSION}/android_${QDS_CI_JOB_TARGET_ARCH}"
- export QDS_CI_JOB_QT_PATH="${DOCKER_ENV_QT_PATH_WITH_VERSION}/android_arm64_v8a"
- *build-components
- *build-android-apps
- *build-app
- *copy-and-sign-apks
- *copy-and-sign-aab
build-desktop:
extends: .build-common
variables:
QDS_CI_JOB_TARGET_PLATFORM: "desktop"
QDS_CI_JOB_ARCHS: gcc_64
QDS_CI_JOB_BUILD_PATH: "${CI_PROJECT_DIR}/${QDS_CI_JOB_TARGET_PLATFORM}/build"
QDS_CI_JOB_ARTIFACTS_PATH: ${QDS_CI_ARTIFACTS_PATH}/${QDS_CI_JOB_TARGET_PLATFORM}
QDS_CI_JOB_CMAKE_BUILD_TARGET: "all"
script:
- mkdir -p ${QDS_CI_JOB_ARTIFACTS_PATH}
- export QDS_CI_JOB_QT_PATH="${DOCKER_ENV_QT_PATH_LINUX_GCC_64}"
- apt-get update
- apt-get install -y libpulse-dev
- *build-components
- *build-app
- cp -r ${QDS_CI_JOB_BUILD_PATH}/src//qtuiviewer ${QDS_CI_JOB_ARTIFACTS_PATH}
......@@ -5,7 +5,7 @@ create-packages:
rules:
- if: $CI_COMMIT_TAG
needs:
- job: test-x86_64
- job: test-android
optional: false
artifacts: true
- job: build-android
......@@ -29,7 +29,7 @@ create-packages:
cd "${arch}/app"
tar -czf "${arch}.tar.gz" *
echo "Uploading ${arch}.tar.gz to GitLab Package Registry"
curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file "${arch}.tar.gz" ${QDS_PACKAGE_URL}/qt-ui-viewer-${CI_COMMIT_TAG}-qt${QDS_CI_QT_VERSION}-${arch}.tar.gz
curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file "${arch}.tar.gz" ${QDS_PACKAGE_URL}/qt-ui-viewer-${CI_COMMIT_TAG}-qt${QDS_CI_QT_VERSION}-multiarch.tar.gz
cd ${current_dir}
done
artifacts:
......@@ -59,7 +59,10 @@ create-release:
tag_name: ${CI_COMMIT_TAG}
assets:
links:
- name: "Binary Packages"
- name: "Google Play Store"
url: "https://play.google.com/store/apps/details?id=io.qt.qtdesignviewer"
link_type: "other"
- name: "Prebuilt APK Files"
url: "https://git.qt.io/design-studio/design-viewer/qt-ui-viewer/-/packages"
link_type: "package"
- name: "Docker Images Used in CI/CD Pipeline"
......
# todo: run the tests for all architectures
test-x86_64:
.test-common:
stage: test
extends: .pipeline_common
variables:
GIT_SUBMODULE_STRATEGY: none
QDS_CI_JOB_TEST_RESULTS_PATH: ${CI_PROJECT_DIR}/test
artifacts:
paths:
- ${QDS_CI_JOB_TEST_RESULTS_PATH}/
reports:
junit: ${QDS_CI_JOB_TEST_RESULTS_PATH}/test.junit.xml
expire_in: 1 week
test-android:
extends: .test-common
tags:
- qds-blade-server-shell
needs:
- job: build-android
optional: false
artifacts: true
variables:
GIT_SUBMODULE_STRATEGY: none
QDS_CI_JOB_TEST_RESULTS_PATH: ${CI_PROJECT_DIR}/test
- job: build-desktop
optional: false
artifacts: true
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/
export PATH=$PATH:${ANDROID_SDK_ROOT}/emulator
export PATH=$PATH:${ANDROID_SDK_ROOT}/platform-tools
- cd ${QDS_CI_ARTIFACTS_PATH}/x86_64/test || exit 1
- |
if [[ $(adb devices | grep emulator) ]]; then
echo "Emulator is running";
else
echo "Starting emulator";
/opt/android/emulator/emulator -avd test -no-boot-anim -no-window -no-audio -no-snapshot -accel on & 2>&1 > /dev/null
sleep 30
fi
- cd ${QDS_CI_ARTIFACTS_PATH}/android/test || exit 1
- mkdir -p ${QDS_CI_JOB_TEST_RESULTS_PATH}
- adb install -r -g android-build-release.apk
- adb shell pm clear io.qt.qtdesignviewer.test
- 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'" -n io.qt.qtdesignviewer.test/org.qtproject.qt.android.bindings.QtActivity
- |
......@@ -52,9 +79,27 @@ test-x86_64:
- mv output.junit.xml ${QDS_CI_JOB_TEST_RESULTS_PATH}/test.junit.xml
- chmod +x ${CI_PROJECT_DIR}/tests/scripts/get_test_result.sh
- ${CI_PROJECT_DIR}/tests/scripts/get_test_result.sh ${QDS_CI_JOB_TEST_RESULTS_PATH}/test.junit.xml
artifacts:
paths:
- ${QDS_CI_JOB_TEST_RESULTS_PATH}/
reports:
junit: ${QDS_CI_JOB_TEST_RESULTS_PATH}/test.junit.xml
expire_in: 1 week
# it's not working as of because of the headless mode
# possible bugs:
# - https://bugreports.qt.io/browse/QTBUG-124467
# - https://bugreports.qt.io/browse/QTBUG-126508
.test-desktop:
extends: .test-common
needs:
- job: build-desktop
optional: false
artifacts: true
script:
- |
if [[ ${QDS_CI_SKIP_TESTS} == "false" ]]; then
echo "Running tests";
else
echo "Skipping tests";
exit 0;
fi
- cd ${QDS_CI_ARTIFACTS_PATH}/gcc_64 || exit 1
- apt update; apt install -y libxcb-cursor0
- ./qtuiviewer_test
- cp output.junitxml ${QDS_CI_JOB_TEST_RESULTS_PATH}/test.junit.xml
icons/Windows/uv.ico

121 KiB

icons/generic/uv-1024.png

72.1 KiB

icons/generic/uv-128.png

6.22 KiB

icons/generic/uv-16.png

535 B

icons/generic/uv-20.png

563 B

icons/generic/uv-22.png

588 B

icons/generic/uv-24.png

612 B

icons/generic/uv-256.png

13 KiB

icons/generic/uv-32.png

798 B

icons/generic/uv-40.png

1.4 KiB