From f5626b7b1020288b8542f05f954288ac00033083 Mon Sep 17 00:00:00 2001 From: Matej Bagar Date: Fri, 16 Jan 2026 11:17:49 +0100 Subject: [PATCH 01/16] Add squish support for Android --- CMakeLists.txt | 8 ++++++++ INSTALL.md | 26 ++++++++++++++++++++++++++ app/CMakeLists.txt | 21 +++++++++++++++++++++ 3 files changed, 55 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 878820f33..dac366442 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -162,6 +162,10 @@ message(STATUS "Mergin Maps Mobile ${version_desc} - ${platform_desc}") # FIND PACKAGES # ######################################################################################## +if(SquishQtBuiltinHook_ROOT) + list(APPEND CMAKE_FIND_ROOT_PATH ${SquishQtBuiltinHook_ROOT}) +endif() + find_package( Qt6 COMPONENTS Quick @@ -266,6 +270,10 @@ if (ENABLE_TESTS) ) endif () +if (SquishQtBuiltinHook_ROOT) + find_package(SquishQtBuiltinHook) +endif () + # ######################################################################################## # GLOBAL SETUP # ######################################################################################## diff --git a/INSTALL.md b/INSTALL.md index 370cd3427..c2ed85d56 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -630,6 +630,7 @@ Once the project is opened, build it from Xcode. # 9. Auto Testing +## Mergin API tests You need to add cmake define `-DENABLE_TESTING=TRUE` on your cmake configure line. Also, you need to open Passbolt and check for password for user `test_mobileapp` on `app.dev.merginmaps.com`, or you need some user with unlimited projects limit. First workspace from list is taken. @@ -645,3 +646,28 @@ TEST_API_PASSWORD= Build binary, and you can run tests either with `ctest` or you can run individual tests by adding `--test` e.g. ` ./MerginMaps --testMerginApi` + +## Squish tests +### Prerequisites + - Squish for Qt for Android (ARMv8/ARMv7 depending on architecture you build for) + - Squish for Qt (Windows/Mac/Linux), this should also include the Squish IDE +### Android +After you unpack both and install Squish IDE, add another cmake argument `-DSquishQtBuiltinHook_ROOT=/////`. +This will build the apk with squish hook inside. You can verify that squish is working by finding these lines in log after startup: +```shell +I/Squish (26459): Setting SQUISH_PREFIX to '/data/data/uk.co.lutraconsulting' +I/Squish (26459): libMerginMaps_arm64-v8a.so[26459]: Loading Qt Wrapper configuration from ":/squish/etc/qtwrapper.ini" +I/Squish (26459): libMerginMaps_arm64-v8a.so[26459]: QObject lifetime tracking is disabled +I/Squish (26459): libMerginMaps_arm64-v8a.so[26459]: Listening on port 7757 for incoming connections +``` + +In the squish IDE it's necessary to follow these steps to set it up completely and start testing the application. +1. In Squish IDE choose File, New Test Suite to create a new Test Suite and follow the wizard. When asked for the GUI Toolkit choose Qt. When asked for the Application Under Test choose \. +2. [Register attachable AUT](https://doc.qt.io/squish/attaching-to-running-applications.html#register-the-attachable-aut) + 1. As _Name_ set `MerginMaps`, _Host_ is the IP address of your phone (has to be on the same Wifi) and set _Port_ to `7757` + 2. You can also use USB cable to connect both devices. However, there is some further setup to do, first you need to forward the device port to your PC with: + ```shell + $ adb forward tcp:portnumber tcp:portnumber + ``` + After that the setup is the same as in point 1, just _Host_ will become `localhost`. +3. The test script should start with `attachToApplication("MerginMaps")` \ No newline at end of file diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index b75d1b8e1..ed8bc1c46 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -659,3 +659,24 @@ qt_add_qml_module( QML_FILES ${MM_QML_SRCS} RESOURCE_PREFIX /com.merginmaps/imports ) + +# ######################################################################################## +# Other +# ######################################################################################## + +if(ANDROID AND SquishQtBuiltinHook_FOUND) + squish_qt_add_builtin_hook(MerginMaps ATTACH_PORT 7757) + # copy squish hook libs + list(APPEND SquishLibs + "${SquishQtBuiltinHook_ROOT}/lib/libsquishhook.so" + "${SquishQtBuiltinHook_ROOT}/lib/libsquishqtquickcommon.so" + "${SquishQtBuiltinHook_ROOT}/lib/libsquishqtwrapper.so" + "${SquishQtBuiltinHook_ROOT}/lib/extensions/qt/libsquishqgraphicsview.so" + "${SquishQtBuiltinHook_ROOT}/lib/extensions/qt/libsquishqtabwidget.so" + "${SquishQtBuiltinHook_ROOT}/lib/extensions/qt/libsquishqtquick.so" + "${SquishQtBuiltinHook_ROOT}/lib/extensions/qt/libsquishqtquicktypes.so" + ) + set_target_properties(MerginMaps PROPERTIES + QT_ANDROID_EXTRA_LIBS "${SquishLibs}" + ) +endif() \ No newline at end of file From 4f9169b8221471aaa2276162438637f16c8ab8a4 Mon Sep 17 00:00:00 2001 From: Matej Bagar Date: Fri, 16 Jan 2026 11:24:01 +0100 Subject: [PATCH 02/16] Fix formatting --- CMakeLists.txt | 4 ++-- app/CMakeLists.txt | 26 +++++++++++++------------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index dac366442..309abbe7c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -162,9 +162,9 @@ message(STATUS "Mergin Maps Mobile ${version_desc} - ${platform_desc}") # FIND PACKAGES # ######################################################################################## -if(SquishQtBuiltinHook_ROOT) +if (SquishQtBuiltinHook_ROOT) list(APPEND CMAKE_FIND_ROOT_PATH ${SquishQtBuiltinHook_ROOT}) -endif() +endif () find_package( Qt6 diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index ed8bc1c46..b5327e742 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -664,19 +664,19 @@ qt_add_qml_module( # Other # ######################################################################################## -if(ANDROID AND SquishQtBuiltinHook_FOUND) +if (ANDROID AND SquishQtBuiltinHook_FOUND) squish_qt_add_builtin_hook(MerginMaps ATTACH_PORT 7757) # copy squish hook libs - list(APPEND SquishLibs - "${SquishQtBuiltinHook_ROOT}/lib/libsquishhook.so" - "${SquishQtBuiltinHook_ROOT}/lib/libsquishqtquickcommon.so" - "${SquishQtBuiltinHook_ROOT}/lib/libsquishqtwrapper.so" - "${SquishQtBuiltinHook_ROOT}/lib/extensions/qt/libsquishqgraphicsview.so" - "${SquishQtBuiltinHook_ROOT}/lib/extensions/qt/libsquishqtabwidget.so" - "${SquishQtBuiltinHook_ROOT}/lib/extensions/qt/libsquishqtquick.so" - "${SquishQtBuiltinHook_ROOT}/lib/extensions/qt/libsquishqtquicktypes.so" - ) - set_target_properties(MerginMaps PROPERTIES - QT_ANDROID_EXTRA_LIBS "${SquishLibs}" + list( + APPEND + SquishLibs + "${SquishQtBuiltinHook_ROOT}/lib/libsquishhook.so" + "${SquishQtBuiltinHook_ROOT}/lib/libsquishqtquickcommon.so" + "${SquishQtBuiltinHook_ROOT}/lib/libsquishqtwrapper.so" + "${SquishQtBuiltinHook_ROOT}/lib/extensions/qt/libsquishqgraphicsview.so" + "${SquishQtBuiltinHook_ROOT}/lib/extensions/qt/libsquishqtabwidget.so" + "${SquishQtBuiltinHook_ROOT}/lib/extensions/qt/libsquishqtquick.so" + "${SquishQtBuiltinHook_ROOT}/lib/extensions/qt/libsquishqtquicktypes.so" ) -endif() \ No newline at end of file + set_target_properties(MerginMaps PROPERTIES QT_ANDROID_EXTRA_LIBS "${SquishLibs}") +endif () From 61edddaae8adce6fdaec6b708bc5cdb017ab1b13 Mon Sep 17 00:00:00 2001 From: Matej Bagar Date: Thu, 29 Jan 2026 18:40:55 +0100 Subject: [PATCH 03/16] Improve StackView support for Squish --- app/qml/CMakeLists.txt | 1 + app/qml/components/MMStackView.qml | 27 +++++++++++++++++++++++ app/qml/form/MMFormStackController.qml | 4 +++- app/qml/layers/MMLayersController.qml | 3 ++- app/qml/main.qml | 2 +- app/qml/project/MMProjectController.qml | 3 ++- app/qml/settings/MMSettingsController.qml | 2 +- gallery/qml/pages/OnboardingPage.qml | 4 +++- gallery/qml/pages/PagesPage.qml | 4 +++- 9 files changed, 43 insertions(+), 7 deletions(-) create mode 100644 app/qml/components/MMStackView.qml diff --git a/app/qml/CMakeLists.txt b/app/qml/CMakeLists.txt index 2413d008d..15c10bd25 100644 --- a/app/qml/CMakeLists.txt +++ b/app/qml/CMakeLists.txt @@ -58,6 +58,7 @@ set(MM_QML components/MMToolbarButton.qml components/MMSingleClickMouseArea.qml components/MMSegmentControl.qml + components/MMStackView.qml components/private/MMBaseInput.qml components/private/MMBaseSingleLineInput.qml components/private/MMToolbarLongButton.qml diff --git a/app/qml/components/MMStackView.qml b/app/qml/components/MMStackView.qml new file mode 100644 index 000000000..b3eab081b --- /dev/null +++ b/app/qml/components/MMStackView.qml @@ -0,0 +1,27 @@ +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +import QtQuick +import QtQuick.Controls + +// StackView wrapper, which improves Squish support. Should be used instead of pure QML StackView. + +StackView { + id: root + + onEmptyChanged: function() { + visible = !empty + } + + Component.onCompleted: { + if (empty) { + visible = false + } + } +} diff --git a/app/qml/form/MMFormStackController.qml b/app/qml/form/MMFormStackController.qml index 9d8c4d1f3..a270a0009 100644 --- a/app/qml/form/MMFormStackController.qml +++ b/app/qml/form/MMFormStackController.qml @@ -10,6 +10,8 @@ import QtQuick import QtQuick.Controls +import MMInput + Item { id: root @@ -252,7 +254,7 @@ Item { form.controllerToApply = null } - StackView { + MMStackView { id: formsStack property bool syncWhenFormCloses: false diff --git a/app/qml/layers/MMLayersController.qml b/app/qml/layers/MMLayersController.qml index 8b7d5487c..e9b46b1ac 100644 --- a/app/qml/layers/MMLayersController.qml +++ b/app/qml/layers/MMLayersController.qml @@ -11,6 +11,7 @@ import QtQuick import QtQuick.Controls import mm 1.0 as MM +import MMInput import "../components" import "../inputs" @@ -41,7 +42,7 @@ Item { } } - StackView { + MMStackView { id: pagesStackView anchors.fill: parent diff --git a/app/qml/main.qml b/app/qml/main.qml index cfeedeb51..f1f75837a 100644 --- a/app/qml/main.qml +++ b/app/qml/main.qml @@ -442,7 +442,7 @@ ApplicationWindow { onClosed: stateManager.state = "map" } - StackView { + MMStackView { id: mapPanelsStackView // diff --git a/app/qml/project/MMProjectController.qml b/app/qml/project/MMProjectController.qml index 9563972d4..2b2b2faa2 100644 --- a/app/qml/project/MMProjectController.qml +++ b/app/qml/project/MMProjectController.qml @@ -13,6 +13,7 @@ import QtQuick.Layouts import QtQuick.Dialogs import mm 1.0 as MM +import MMInput import "../components" import "../inputs" @@ -87,7 +88,7 @@ Item { stackView.focus = true } - StackView { + MMStackView { id: stackView initialItem: workspaceProjectsPanelComp diff --git a/app/qml/settings/MMSettingsController.qml b/app/qml/settings/MMSettingsController.qml index 938ca22e0..4b57758af 100644 --- a/app/qml/settings/MMSettingsController.qml +++ b/app/qml/settings/MMSettingsController.qml @@ -56,7 +56,7 @@ Item { } - StackView { + MMStackView { id: stackview width: ApplicationWindow.window?.width ?? 0 diff --git a/gallery/qml/pages/OnboardingPage.qml b/gallery/qml/pages/OnboardingPage.qml index e3c09b76d..c61793128 100644 --- a/gallery/qml/pages/OnboardingPage.qml +++ b/gallery/qml/pages/OnboardingPage.qml @@ -11,13 +11,15 @@ import QtQuick import QtQuick.Controls import QtQuick.Layouts +import MMInput + import "../../app/qml/components" import "../../app/qml/account" Page { id: root - StackView { + MMStackView { id: stackview anchors.fill: parent diff --git a/gallery/qml/pages/PagesPage.qml b/gallery/qml/pages/PagesPage.qml index 0effaf990..3eff2cc27 100644 --- a/gallery/qml/pages/PagesPage.qml +++ b/gallery/qml/pages/PagesPage.qml @@ -11,6 +11,8 @@ import QtQuick import QtQuick.Controls import QtQuick.Controls.Basic +import MMInput + import "../../app/qml/components" import "../../app/qml" import "../../app/qml/project" @@ -21,7 +23,7 @@ import "../../app/qml/account" Page { id: root - StackView { + MMStackView { id: stackview anchors.fill: parent From 2d274762b8478ceddb57ce9b69bde916c6b27249 Mon Sep 17 00:00:00 2001 From: Matej Bagar Date: Thu, 29 Jan 2026 20:18:33 +0100 Subject: [PATCH 04/16] Tidy cmake --- CMakeLists.txt | 8 ++++---- app/CMakeLists.txt | 35 ++++++++++++++--------------------- 2 files changed, 18 insertions(+), 25 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 309abbe7c..e66c6e309 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -162,10 +162,6 @@ message(STATUS "Mergin Maps Mobile ${version_desc} - ${platform_desc}") # FIND PACKAGES # ######################################################################################## -if (SquishQtBuiltinHook_ROOT) - list(APPEND CMAKE_FIND_ROOT_PATH ${SquishQtBuiltinHook_ROOT}) -endif () - find_package( Qt6 COMPONENTS Quick @@ -378,6 +374,10 @@ if (ANDROID) # Make sure the generator for android_deployment_settings.json can figure out the # architecture list(APPEND CMAKE_FIND_ROOT_PATH /) + # Make sure the generator for android_deployment_settings.json can find Squish libs + if (SquishQtBuiltinHook_ROOT) + list(APPEND CMAKE_FIND_ROOT_PATH ${SquishQtBuiltinHook_ROOT}) + endif () endif () # ######################################################################################## diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index b5327e742..ae94831df 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -353,6 +353,19 @@ if (ANDROID) ${CMAKE_CURRENT_SOURCE_DIR}/android/build.gradle @ONLY ) + if (SquishQtBuiltinHook_FOUND) + squish_qt_add_builtin_hook(MerginMaps ATTACH_PORT 7757) + list(APPEND SquishLibs + "${SquishQtBuiltinHook_ROOT}/lib/libsquishhook.so" + "${SquishQtBuiltinHook_ROOT}/lib/libsquishqtquickcommon.so" + "${SquishQtBuiltinHook_ROOT}/lib/libsquishqtwrapper.so" + "${SquishQtBuiltinHook_ROOT}/lib/extensions/qt/libsquishqgraphicsview.so" + "${SquishQtBuiltinHook_ROOT}/lib/extensions/qt/libsquishqtabwidget.so" + "${SquishQtBuiltinHook_ROOT}/lib/extensions/qt/libsquishqtquick.so" + "${SquishQtBuiltinHook_ROOT}/lib/extensions/qt/libsquishqtquicktypes.so" + ) + endif () + set_target_properties( MerginMaps PROPERTIES QT_ANDROID_PACKAGE_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/android @@ -360,6 +373,7 @@ if (ANDROID) QT_ANDROID_MIN_SDK_VERSION ${MM_ANDROID_MIN_SDK_VERSION} QT_ANDROID_VERSION_CODE ${MM_VERSION_CODE} QT_ANDROID_VERSION_NAME ${MM_VERSION} + QT_ANDROID_EXTRA_LIBS "${SquishLibs}" ) endif () @@ -659,24 +673,3 @@ qt_add_qml_module( QML_FILES ${MM_QML_SRCS} RESOURCE_PREFIX /com.merginmaps/imports ) - -# ######################################################################################## -# Other -# ######################################################################################## - -if (ANDROID AND SquishQtBuiltinHook_FOUND) - squish_qt_add_builtin_hook(MerginMaps ATTACH_PORT 7757) - # copy squish hook libs - list( - APPEND - SquishLibs - "${SquishQtBuiltinHook_ROOT}/lib/libsquishhook.so" - "${SquishQtBuiltinHook_ROOT}/lib/libsquishqtquickcommon.so" - "${SquishQtBuiltinHook_ROOT}/lib/libsquishqtwrapper.so" - "${SquishQtBuiltinHook_ROOT}/lib/extensions/qt/libsquishqgraphicsview.so" - "${SquishQtBuiltinHook_ROOT}/lib/extensions/qt/libsquishqtabwidget.so" - "${SquishQtBuiltinHook_ROOT}/lib/extensions/qt/libsquishqtquick.so" - "${SquishQtBuiltinHook_ROOT}/lib/extensions/qt/libsquishqtquicktypes.so" - ) - set_target_properties(MerginMaps PROPERTIES QT_ANDROID_EXTRA_LIBS "${SquishLibs}") -endif () From 6cdb2bcabcc40c0662dbeb4f016af22815e10f6c Mon Sep 17 00:00:00 2001 From: Matej Bagar Date: Thu, 29 Jan 2026 21:03:27 +0100 Subject: [PATCH 05/16] Add iOS support WIP --- app/CMakeLists.txt | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index ae94831df..6e70a6ab3 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -467,6 +467,15 @@ if (IOS) ) message(STATUS "Using automatic code sign") endif () + + #squish + if (SquishQtBuiltinHook_FOUND) + squish_qt_add_builtin_hook(MerginMaps ATTACH_PORT 7757) + target_include_directories( + MerginMaps + PRIVATE "${SquishQtBuiltinHook_ROOT}/include" + ) + endif () endif () # ######################################################################################## @@ -621,6 +630,9 @@ if (IOS) ) # TODO is this needed? this change requires cmake 3.28+ # qt_add_ios_ffmpeg_libraries(MerginMaps) # Qt Multimedia + if (SquishQtBuiltinHook_FOUND) + target_link_libraries(MerginMaps PRIVATE SquishQtBuiltinHook) + endif () endif () if (WIN) From 4f9c3ccbe4e7a8972429155031e4822be13cfe4d Mon Sep 17 00:00:00 2001 From: Matej Bagar Date: Tue, 10 Feb 2026 17:14:02 +0100 Subject: [PATCH 06/16] Fix build for iOS --- app/CMakeLists.txt | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index 6e70a6ab3..56e0af14f 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -467,15 +467,6 @@ if (IOS) ) message(STATUS "Using automatic code sign") endif () - - #squish - if (SquishQtBuiltinHook_FOUND) - squish_qt_add_builtin_hook(MerginMaps ATTACH_PORT 7757) - target_include_directories( - MerginMaps - PRIVATE "${SquishQtBuiltinHook_ROOT}/include" - ) - endif () endif () # ######################################################################################## @@ -631,7 +622,7 @@ if (IOS) # TODO is this needed? this change requires cmake 3.28+ # qt_add_ios_ffmpeg_libraries(MerginMaps) # Qt Multimedia if (SquishQtBuiltinHook_FOUND) - target_link_libraries(MerginMaps PRIVATE SquishQtBuiltinHook) + squish_qt_add_builtin_hook(MerginMaps ATTACH_PORT 7757 EXTENSIONS QGraphicsView QTabWidget QtQuickTypes QtQuick) endif () endif () From 73acf7487fd843d3042c96b4689ea5c911e1f670 Mon Sep 17 00:00:00 2001 From: Matej Bagar Date: Wed, 11 Feb 2026 11:19:20 +0100 Subject: [PATCH 07/16] Add ios squish info --- INSTALL.md | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/INSTALL.md b/INSTALL.md index c2ed85d56..81bba6aa2 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -650,9 +650,11 @@ e.g. ` ./MerginMaps --testMerginApi` ## Squish tests ### Prerequisites - Squish for Qt for Android (ARMv8/ARMv7 depending on architecture you build for) + - Squish for Qt for iOS - Squish for Qt (Windows/Mac/Linux), this should also include the Squish IDE + ### Android -After you unpack both and install Squish IDE, add another cmake argument `-DSquishQtBuiltinHook_ROOT=/////`. +After you unpack both (Qt & Qt for Android) and install Squish IDE, add another cmake argument `-DSquishQtBuiltinHook_ROOT=/////`. This will build the apk with squish hook inside. You can verify that squish is working by finding these lines in log after startup: ```shell I/Squish (26459): Setting SQUISH_PREFIX to '/data/data/uk.co.lutraconsulting' @@ -661,13 +663,28 @@ I/Squish (26459): libMerginMaps_arm64-v8a.so[26459]: QObject lifetime tracking I/Squish (26459): libMerginMaps_arm64-v8a.so[26459]: Listening on port 7757 for incoming connections ``` -In the squish IDE it's necessary to follow these steps to set it up completely and start testing the application. +### iOS +After you unpack both (Qt & Qt for iOS) and install Squish IDE, add these cmake arguments +```cmake +-DSquishQtBuiltinHook_ROOT=///// +-DCMAKE_FIND_ROOT_PATH=///// +-DCMAKE_FIND_ROOT_PATH_MODE_PACKAGE=BOTH +``` +This will build the app with squish hook inside. You can verify that squish is working by finding these lines in log after startup: +```shell +MerginMaps[834]: Loading Qt Wrapper configuration from ":/squish/etc/qtwrapper.ini" +MerginMaps[834]: QObject lifetime tracking is disabled +MerginMaps[834]: Listening on port 7757 for incoming connections +``` + +### Squish +In the squish IDE it's necessary to follow these steps to finish setting it up and start testing the application. 1. In Squish IDE choose File, New Test Suite to create a new Test Suite and follow the wizard. When asked for the GUI Toolkit choose Qt. When asked for the Application Under Test choose \. 2. [Register attachable AUT](https://doc.qt.io/squish/attaching-to-running-applications.html#register-the-attachable-aut) - 1. As _Name_ set `MerginMaps`, _Host_ is the IP address of your phone (has to be on the same Wifi) and set _Port_ to `7757` - 2. You can also use USB cable to connect both devices. However, there is some further setup to do, first you need to forward the device port to your PC with: + 1. As _Name_ set `MerginMaps`, _Host_ is the IP address of your phone (has to be on the same Wifi) and set _Port_ to `7757` + 2. You can also use USB cable to connect both devices. However, there is some further setup to do, first you need to forward the device port to your PC with: ```shell $ adb forward tcp:portnumber tcp:portnumber ``` After that the setup is the same as in point 1, just _Host_ will become `localhost`. -3. The test script should start with `attachToApplication("MerginMaps")` \ No newline at end of file +3. The test script should start with `attachToApplication("MerginMaps")` From 2354047e5898e4a573c66c8431e927282c1dd9ed Mon Sep 17 00:00:00 2001 From: Matej Bagar Date: Mon, 16 Feb 2026 13:23:19 +0100 Subject: [PATCH 08/16] Fix cmake formatting --- app/CMakeLists.txt | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index 56e0af14f..c14620aa4 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -355,14 +355,16 @@ if (ANDROID) if (SquishQtBuiltinHook_FOUND) squish_qt_add_builtin_hook(MerginMaps ATTACH_PORT 7757) - list(APPEND SquishLibs - "${SquishQtBuiltinHook_ROOT}/lib/libsquishhook.so" - "${SquishQtBuiltinHook_ROOT}/lib/libsquishqtquickcommon.so" - "${SquishQtBuiltinHook_ROOT}/lib/libsquishqtwrapper.so" - "${SquishQtBuiltinHook_ROOT}/lib/extensions/qt/libsquishqgraphicsview.so" - "${SquishQtBuiltinHook_ROOT}/lib/extensions/qt/libsquishqtabwidget.so" - "${SquishQtBuiltinHook_ROOT}/lib/extensions/qt/libsquishqtquick.so" - "${SquishQtBuiltinHook_ROOT}/lib/extensions/qt/libsquishqtquicktypes.so" + list( + APPEND + SquishLibs + "${SquishQtBuiltinHook_ROOT}/lib/libsquishhook.so" + "${SquishQtBuiltinHook_ROOT}/lib/libsquishqtquickcommon.so" + "${SquishQtBuiltinHook_ROOT}/lib/libsquishqtwrapper.so" + "${SquishQtBuiltinHook_ROOT}/lib/extensions/qt/libsquishqgraphicsview.so" + "${SquishQtBuiltinHook_ROOT}/lib/extensions/qt/libsquishqtabwidget.so" + "${SquishQtBuiltinHook_ROOT}/lib/extensions/qt/libsquishqtquick.so" + "${SquishQtBuiltinHook_ROOT}/lib/extensions/qt/libsquishqtquicktypes.so" ) endif () @@ -622,7 +624,16 @@ if (IOS) # TODO is this needed? this change requires cmake 3.28+ # qt_add_ios_ffmpeg_libraries(MerginMaps) # Qt Multimedia if (SquishQtBuiltinHook_FOUND) - squish_qt_add_builtin_hook(MerginMaps ATTACH_PORT 7757 EXTENSIONS QGraphicsView QTabWidget QtQuickTypes QtQuick) + squish_qt_add_builtin_hook( + MerginMaps + ATTACH_PORT + 7757 + EXTENSIONS + QGraphicsView + QTabWidget + QtQuickTypes + QtQuick + ) endif () endif () From 4b93cc57e33453abefbfe6b9d6253f5a4386b2b9 Mon Sep 17 00:00:00 2001 From: Matej Bagar Date: Wed, 1 Apr 2026 18:32:55 +0200 Subject: [PATCH 09/16] Fix builds for android --- app/CMakeLists.txt | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index c14620aa4..5741c4153 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -354,7 +354,6 @@ if (ANDROID) ) if (SquishQtBuiltinHook_FOUND) - squish_qt_add_builtin_hook(MerginMaps ATTACH_PORT 7757) list( APPEND SquishLibs @@ -603,8 +602,12 @@ if (IOS) endif () if (ANDROID) + if (SquishQtBuiltinHook_FOUND) + squish_qt_add_builtin_hook(MerginMaps ATTACH_PORT 7757) + endif () + set_property( - TARGET MerginMaps PROPERTY QT_ANDROID_EXTRA_LIBS ${OpenSSL_SSL_LIBRARY} + TARGET MerginMaps APPEND PROPERTY QT_ANDROID_EXTRA_LIBS ${OpenSSL_SSL_LIBRARY} ${OpenSSL_CRYPTO_LIBRARY} ) endif () From bf27c184b7b4b216b5a1afa19125b8d3044e89db Mon Sep 17 00:00:00 2001 From: Matej Bagar Date: Tue, 2 Jun 2026 09:49:01 +0200 Subject: [PATCH 10/16] Fix cmake formatting --- app/CMakeLists.txt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index 5741c4153..326147ed5 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -607,8 +607,9 @@ if (ANDROID) endif () set_property( - TARGET MerginMaps APPEND PROPERTY QT_ANDROID_EXTRA_LIBS ${OpenSSL_SSL_LIBRARY} - ${OpenSSL_CRYPTO_LIBRARY} + TARGET MerginMaps + APPEND + PROPERTY QT_ANDROID_EXTRA_LIBS ${OpenSSL_SSL_LIBRARY} ${OpenSSL_CRYPTO_LIBRARY} ) endif () From 844946ef102731add605032a318843d50a2119d8 Mon Sep 17 00:00:00 2001 From: Matej Bagar Date: Tue, 2 Jun 2026 09:57:17 +0200 Subject: [PATCH 11/16] Create CI check for forbidden StackView --- .github/workflows/code_style.yml | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/.github/workflows/code_style.yml b/.github/workflows/code_style.yml index 355591cc2..bc98b37b4 100644 --- a/.github/workflows/code_style.yml +++ b/.github/workflows/code_style.yml @@ -73,3 +73,30 @@ jobs: - name: Run cppcheck test run: ./scripts/cppcheck.bash + + no_stackview: + name: No direct StackView usage in QML + if: ( github.repository == 'MerginMaps/mobile' ) && (!contains(github.event.head_commit.message, 'Translate ')) + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v6 + + - name: Check for direct StackView instantiation in QML files + run: | + # MMStackView.qml is the approved wrapper — exclude it from the search. + # Any other QML file with a bare "StackView" is using the raw Qt component + # instead of the wrapper, which breaks Squish test support. + matches=$(grep -rn --include="*.qml" \ + --exclude="MMStackView.qml" \ + 'StackView[[:space:]]*{' \ + app/qml/ || true) + + if [ -n "$matches" ]; then + echo "ERROR: Direct StackView usage found. Use MMStackView instead:" + echo "" + echo "$matches" + exit 1 + fi + + echo "OK: No direct StackView usage found." From 7aa8421e8e7828d7bd731e2058233d809ac4de0c Mon Sep 17 00:00:00 2001 From: Matej Bagar Date: Tue, 2 Jun 2026 12:09:14 +0200 Subject: [PATCH 12/16] Fix regex in code_style check --- .github/workflows/code_style.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/code_style.yml b/.github/workflows/code_style.yml index bc98b37b4..2ecfe2db1 100644 --- a/.github/workflows/code_style.yml +++ b/.github/workflows/code_style.yml @@ -89,7 +89,7 @@ jobs: # instead of the wrapper, which breaks Squish test support. matches=$(grep -rn --include="*.qml" \ --exclude="MMStackView.qml" \ - 'StackView[[:space:]]*{' \ + '\ Date: Tue, 2 Jun 2026 13:57:22 +0200 Subject: [PATCH 13/16] Refactor squish cmake variable --- CMakeLists.txt | 6 ++++++ INSTALL.md | 22 +++++++++++----------- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e66c6e309..70cae295f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -155,6 +155,12 @@ set(MM_VERSION_CODE CACHE STRING "Build version (for stores)" ) +if (DEFINED SQUISH_PATH) + set(SquishQtBuiltinHook_ROOT + ${SQUISH_PATH} + CACHE PATH "Path to directory with Squish hook and libraries") +endif () + mm_detect_version() message(STATUS "Mergin Maps Mobile ${version_desc} - ${platform_desc}") diff --git a/INSTALL.md b/INSTALL.md index 81bba6aa2..610febd25 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -653,9 +653,16 @@ e.g. ` ./MerginMaps --testMerginApi` - Squish for Qt for iOS - Squish for Qt (Windows/Mac/Linux), this should also include the Squish IDE -### Android -After you unpack both (Qt & Qt for Android) and install Squish IDE, add another cmake argument `-DSquishQtBuiltinHook_ROOT=/////`. -This will build the apk with squish hook inside. You can verify that squish is working by finding these lines in log after startup: +### Android & iOS +After you unpack both (Qt & Qt for Android / iOS) and install Squish IDE, add these cmake arguments +```cmake +-DSQUISH_PATH=///// +-DCMAKE_FIND_ROOT_PATH=///// +-DCMAKE_FIND_ROOT_PATH_MODE_PACKAGE=BOTH +``` +This will build the app with squish hook inside. You can verify that squish is working by finding these lines in log after startup: + +##### Android log ```shell I/Squish (26459): Setting SQUISH_PREFIX to '/data/data/uk.co.lutraconsulting' I/Squish (26459): libMerginMaps_arm64-v8a.so[26459]: Loading Qt Wrapper configuration from ":/squish/etc/qtwrapper.ini" @@ -663,14 +670,7 @@ I/Squish (26459): libMerginMaps_arm64-v8a.so[26459]: QObject lifetime tracking I/Squish (26459): libMerginMaps_arm64-v8a.so[26459]: Listening on port 7757 for incoming connections ``` -### iOS -After you unpack both (Qt & Qt for iOS) and install Squish IDE, add these cmake arguments -```cmake --DSquishQtBuiltinHook_ROOT=///// --DCMAKE_FIND_ROOT_PATH=///// --DCMAKE_FIND_ROOT_PATH_MODE_PACKAGE=BOTH -``` -This will build the app with squish hook inside. You can verify that squish is working by finding these lines in log after startup: +##### iOS log ```shell MerginMaps[834]: Loading Qt Wrapper configuration from ":/squish/etc/qtwrapper.ini" MerginMaps[834]: QObject lifetime tracking is disabled From 36f40becb92d5789e09a3a7143de26f5967d5f6c Mon Sep 17 00:00:00 2001 From: Matej Bagar Date: Tue, 2 Jun 2026 14:31:48 +0200 Subject: [PATCH 14/16] Remove unnecessary imports --- app/qml/components/MMStackView.qml | 10 +--------- app/qml/form/MMFormStackController.qml | 2 +- app/qml/layers/MMLayersController.qml | 1 - app/qml/project/MMProjectController.qml | 1 - gallery/qml/pages/OnboardingPage.qml | 2 -- gallery/qml/pages/PagesPage.qml | 2 -- 6 files changed, 2 insertions(+), 16 deletions(-) diff --git a/app/qml/components/MMStackView.qml b/app/qml/components/MMStackView.qml index b3eab081b..14e50556c 100644 --- a/app/qml/components/MMStackView.qml +++ b/app/qml/components/MMStackView.qml @@ -15,13 +15,5 @@ import QtQuick.Controls StackView { id: root - onEmptyChanged: function() { - visible = !empty - } - - Component.onCompleted: { - if (empty) { - visible = false - } - } + visible: !empty } diff --git a/app/qml/form/MMFormStackController.qml b/app/qml/form/MMFormStackController.qml index a270a0009..b88533793 100644 --- a/app/qml/form/MMFormStackController.qml +++ b/app/qml/form/MMFormStackController.qml @@ -10,7 +10,7 @@ import QtQuick import QtQuick.Controls -import MMInput +import "../components" Item { id: root diff --git a/app/qml/layers/MMLayersController.qml b/app/qml/layers/MMLayersController.qml index e9b46b1ac..14fa79ff6 100644 --- a/app/qml/layers/MMLayersController.qml +++ b/app/qml/layers/MMLayersController.qml @@ -11,7 +11,6 @@ import QtQuick import QtQuick.Controls import mm 1.0 as MM -import MMInput import "../components" import "../inputs" diff --git a/app/qml/project/MMProjectController.qml b/app/qml/project/MMProjectController.qml index 2b2b2faa2..51a978a3a 100644 --- a/app/qml/project/MMProjectController.qml +++ b/app/qml/project/MMProjectController.qml @@ -13,7 +13,6 @@ import QtQuick.Layouts import QtQuick.Dialogs import mm 1.0 as MM -import MMInput import "../components" import "../inputs" diff --git a/gallery/qml/pages/OnboardingPage.qml b/gallery/qml/pages/OnboardingPage.qml index c61793128..d8748d9a5 100644 --- a/gallery/qml/pages/OnboardingPage.qml +++ b/gallery/qml/pages/OnboardingPage.qml @@ -11,8 +11,6 @@ import QtQuick import QtQuick.Controls import QtQuick.Layouts -import MMInput - import "../../app/qml/components" import "../../app/qml/account" diff --git a/gallery/qml/pages/PagesPage.qml b/gallery/qml/pages/PagesPage.qml index 3eff2cc27..f06d94b0f 100644 --- a/gallery/qml/pages/PagesPage.qml +++ b/gallery/qml/pages/PagesPage.qml @@ -11,8 +11,6 @@ import QtQuick import QtQuick.Controls import QtQuick.Controls.Basic -import MMInput - import "../../app/qml/components" import "../../app/qml" import "../../app/qml/project" From 45cac608d77fc81c360d9832c1b08366d6b0ed16 Mon Sep 17 00:00:00 2001 From: Matej Bagar Date: Tue, 2 Jun 2026 14:33:16 +0200 Subject: [PATCH 15/16] Format cmake --- CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 70cae295f..3ed49552a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -158,7 +158,8 @@ set(MM_VERSION_CODE if (DEFINED SQUISH_PATH) set(SquishQtBuiltinHook_ROOT ${SQUISH_PATH} - CACHE PATH "Path to directory with Squish hook and libraries") + CACHE PATH "Path to directory with Squish hook and libraries" + ) endif () mm_detect_version() From 02ce9989da6a5186bd5781f3d63d463600027538 Mon Sep 17 00:00:00 2001 From: Matej Bagar Date: Mon, 8 Jun 2026 09:08:45 +0200 Subject: [PATCH 16/16] Update INSTALL.md --- INSTALL.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INSTALL.md b/INSTALL.md index 610febd25..2d6064d5f 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -630,7 +630,7 @@ Once the project is opened, build it from Xcode. # 9. Auto Testing -## Mergin API tests +## Unit tests You need to add cmake define `-DENABLE_TESTING=TRUE` on your cmake configure line. Also, you need to open Passbolt and check for password for user `test_mobileapp` on `app.dev.merginmaps.com`, or you need some user with unlimited projects limit. First workspace from list is taken.