Commit Graph
100 Commits
Author SHA1 Message Date
Alex Jbanca 7632172512 build: move StatusQ QML and assets from libStatusQ into the mobile app
New STATUSQ_BUNDLE_QML option (default ON, desktop/storybook unchanged);
mobile passes OFF and bundles statusq.qrc + asset qrcs via Status.pro so
the Qt Quick Compiler processes StatusQ's QML (57% of its bindings
AOT-compile, tree 46% -> 48%). Resource paths are unchanged.

First-launch cold start on device: 5.65s -> 4.83s; runtime QML
compilation is now fully eliminated (warm == cold).
2026-08-13 16:41:46 +03:00
Alex Jbanca f7a4519ff8 build: wire QML ahead-of-time compilation into the mobile build
- enable qtquickcompiler and split browser web scripts into their own
  qrc excluded from compilation (browser-engine JS, not QML-engine)
- pass the runtime import paths to qmlcachegen; qtquickcompiler.prf only
  passes --resource, leaving all in-repo modules unresolvable
  (11% -> 32% of bindings AOT-compiled)
- shim the Universal style in as QtQuick.Controls for the compiler;
  qmlcachegen cannot follow the selector module's optional imports
  (32% -> 46%)
- emit per-binding .aotstats next to each generated .cpp for coverage
  tracking
2026-08-13 16:41:46 +03:00
Andrey Bocharnikov 85383de2ae feat(browser): platform download plumbing and the web view download seam
Extend the cross-platform web view seam with the download vocabulary the
Downloads feature builds on (ADR 0006):

- AbstractWebView: DownloadState gains DownloadPaused (WebEngine-shaped
  numbering, Paused = 5 matches MobileWebViewDownload), a host-side
  downloadUrl() re-issue used for Retry, a linkLongPressed(link, image,
  position) signal for mobile Backends, supportsPdfViewer, and a
  'retained' flag for Web Views kept alive after their tab closes.
  The downloadsStore / isDownloadView coupling is gone: adapters map
  Backend downloads into the seam and the UI never branches on Backend.
- WebViewAdapter / MobileWebViewAdapter / LazyWebViewAdapter implement
  the seam; the desktop path gains an injectable isBrowsableLocalUrlFn
  local-URL guard exception, and LazyWebViewAdapter forwards Retry
  through ensureLoaded().
- ProfileManager survives a WebEngine profile data-path collision.
- StatusQ C++: BrowserProfileUtils (QWebEnginePage::download re-issue,
  profile plumbing) and SystemUtilsInternal additions, iOS share-sheet
  support via NSItemProvider in ios_utils.mm, Android accept path in
  StatusQtActivity, mobilewebview pin bump, and Common.mk tracks
  CMakeLists.txt so the pin invalidates mobile builds.
2026-08-13 09:42:17 +04:00
Alex Jbanca 20c41f73d9 fix(ios): paste without triggering the system paste permission prompt (#21799)
* fix(ios): paste without triggering the system paste permission prompt

On iOS any programmatic read of UIPasteboard shows the "Allow Paste?"
alert. Our Paste buttons read the clipboard directly, so they prompted
every time. Replace them with UIPasteControl, where the system performs
the read and hands over the contents, making the tap itself the consent.

- add NativePasteButtonItem, hosting a native UIPasteControl, and the
  StatusPasteButton wrapper (native on iOS, StatusButton elsewhere)
- use it for every Paste button: sync code, WalletConnect URI,
  watch-only address, private key, chat key and both send recipient
  inputs
- disable AppMain's passive clipboard watcher on iOS: it read the
  clipboard with no user action at all, which is what prompted on launch
- drop the now-dead iOS guards left over from #21365

A native view composites above the whole Qt scene, so the control is
clipped to its visible viewport and hidden whenever something is stacked
above it - a popup over the page, or another popup over the one holding
it. That state is recomputed per frame from afterAnimating and pushed to
UIKit only when it changes; it must not call polish(), which requests a
new frame and would keep the window rendering forever.

The paste completion captures the target view rather than a raw C++
pointer, so a control destroyed while the item provider loads - closing
the modal it lives in - cannot deliver into freed memory.

Desktop keeps its existing Paste button styling: the wrapper forwards
size, border, font weight and focus policy, and each site passes what it
used before. Desktop buttons are now disabled rather than always enabled
when the clipboard has no text.

Also track *.mm in STATUS_Q_FILES: the mobile build only watched .cpp
and .h, so no Objective-C++ change in StatusQ ever triggered a rebuild
and stale binaries were shipped to the simulator.

Text editors are unaffected: StatusTextArea is a Controls TextArea, so
long-press gives the OS edit menu, whose Paste the system authorises.

Closes #21438

* fix(StatusPasteButton): apply review feedback

- base the wrapper on Control and forward the font group, so a site can
  set the label's family, weight or pixelSize. They are forwarded one by
  one on purpose: StatusBaseButton binds each of them itself, and a
  whole-group `font:` assignment is silently ignored - verified by
  checking that a bigger pixelSize actually widens the button.
- keep the wrapper out of the tab chain. Control brings its own
  focusPolicy, so the button's is `buttonFocusPolicy`; otherwise the
  composite would add a tab stop in front of the button.
- derive the Qt -> UIKit scale from the window's devicePixelRatio over
  the view's contentScaleFactor rather than parsing QT_SCALE_FACTOR. The
  ratio is exactly the extra Qt scaling, whatever asked for it.
- mark foregroundColor/backgroundColor REQUIRED: UIKit picks each tint's
  default on its own, so setting only one can leave the glyph unreadable
  against the fill.

* fix(NativePasteButtonItem): make the zero-scale guard obvious

contentScaleFactor was already checked before the division, but far
enough above it to read like an unguarded divide. Bail out on the null
view and window first, then guard the divisor right where it is used.
2026-08-12 17:29:55 +03:00
Siddarth Kumar 6eb13174d0 android: bump SDK to 36 2026-08-12 14:49:15 +05:30
Sale Djenic 99c95234d9 fix: turning off lto (Link-Time Optimization) flag for iOS builds
On iOS, Nim builds --app:staticlib, so the .a ships bitcode, and the actual LTO + codegen happens at Xcode's final link.
ThinLTO is aggressive about cross-module optimization, and it occasionally miscompiles code with subtle semantics.
The exact pattern that's failing — Nim's ORC move/destructor handling around std/json's ref-based JsonNode built
via %* (a newJObject() followed by a run of OrderedTable inserts) — is a classic place for an over-eager optimizer to
wrongly drop the populated temporary or elide the inserts, yielding an empty {}.
2026-07-22 08:45:27 +02:00
Alex Jbanca 4be5bf6af6 chore: Fix monitoring and profiling targets 2026-07-07 10:44:53 +03:00
Alex Jbanca d3b8917a04 chore: Drop DOtherSide
+ Move monitoring to statusq
2026-07-07 10:44:53 +03:00
Andrey Bocharnikov 3287aee57e chore(mobile): enable LTO for nim status client build 2026-07-03 15:33:46 +04:00
Alex Jbanca af309cddcd fix: clean-up 2026-06-29 21:41:48 +03:00
Alex Jbanca 466236f948 fix: prl-to-pc via nimble 2026-06-29 21:41:48 +03:00
Alex Jbanca 736f2de125 feat(seaqt): Enable mobile builds and hopefully windows 2026-06-29 21:41:48 +03:00
Sale Djenic 3bd3c4b7a1 refactor(new-keycard-approach): remove status-keycard-go submodule and update references to reference to status-keycard-qt library
- Deleted the status-keycard-go submodule from .gitmodules and Makefile.
- Updated config.nims to reference STATUSKEYCARD_QT_LIBDIR instead of STATUSKEYCARDGO_LIBDIR.
- Adjusted build scripts and feature flags to remove dependencies on status-keycard-go.
- The code aligned.
2026-06-22 13:48:45 +02:00
Alex Jbanca 9f06b8d243 fix: Align min ios version with Qt6.11 2026-06-16 14:22:16 -04:00
Igor SirotinandClaude Opus 4.8 fc2da31b90 chore: remove Node Management page (#21177)
* chore: remove Node Management page

Remove the experimental Node Management section end-to-end: the QML page
and section loader, sidebar/section wiring, the node_section backend
module, the now-dead status-go shim procs, the page-only Stats and
ChroniclesLogs signal plumbing, and the Profile > Advanced toggle.

Network-connectivity detection is preserved by relocating the peer ->
connected bridge from the deleted node section into node_service.init.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* chore: update-translations

* test: drop Node Management refs from storybook

Remove the now-dangling nodeEnabled property usage and the node section
fixtures left behind in storybook after the PrimaryNavSidebarAdaptor lost
its nodeEnabled property: the tst_PrimaryNavSidebar test/page bindings and
the Node entry in the mock SectionsModel.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 11:35:13 +01:00
Siddarth Kumar 6e232c10d0 ios: upgrade to SDK 26 2026-05-06 08:53:30 +05:30
Alex Jbanca beb8fefc2d feat(Mobile Profiling): add mobile profiling support and related scripts 2026-05-04 16:21:48 +03:00
Alex Jbanca 7c80103d36 fix: android deadlock when spawning app foreground/background cycles (#20519) 2026-04-23 13:31:18 +02:00
Sale Djenic 74c9a24e39 fix: ci ios build failing
The issue only manifests when:

The mobile Makefile exports CC=clangWrap.sh (via EnvVariables.mk)
clangWrap.sh has the echo to stdout
Go's linker discovers ar via CombinedOutput() which captures both stdout and stderr
When invoked through the mobile Makefile, CC=clangWrap.sh leaks into the Go build's environment (despite the shell-level CC="$(xcrun ...)" override in the status-go recipe). Go's linker then runs clangWrap.sh --print-prog-name ar, and the echo output to stdout gets combined with clang's actual output, corrupting the ar path.

Removing the echo fixed the issue.
2026-04-20 07:58:59 +02:00
Siddarth Kumar 33cf795c11 scripts: version.sh should be referred in case of mobile 2026-04-13 20:37:02 +05:30
Alex Jbanca db4b5c5a46 feat(ios): wire-up push notifications (#20344)
* feat(ios): wire-up push notifications

- wire push notifications endpoints with qml access
- split NotificationsView.qml into 2 different components. The general component preserving the current behavior and a reduced functionality for centralized push notifications (similar to the Status legacy)
- wire bundle id from EnvVariables.mk to the push notifications status-go calls. We need the bundle id as topic.
- Tweak the Push permissions request flow to account for platform specifics

* fix: mobile-run doesn't work for all targets
2026-04-06 14:19:22 +03:00
Alex Jbanca 8b57fabf01 chore(android): Compile 16kb page size against qt 6.11
- update linker flags
- update imports for mobile WebViewAdapter
- explicit cmake find for qt code private
2026-03-26 09:08:57 +02:00
Alex Jbanca 0006524e51 fix: Small updates on status-go as a service flows
- remove `androidMinimizeToBackground` as it's not used anymore
- status-go client and server use configurable compilation flags based on `DEBUG` flag
- remove verbose logging in StatusGoService.java
2026-03-20 09:22:26 +02:00
Alex Jbanca 4fdcf9ec1d feat(android): status-go as a service
Add an option to run status-go as a service on android using Androdi Binder as a transport.

See ADR for more details docs/adr/0001-android-status-go-as-a-service.md
2026-03-20 09:22:26 +02:00
Andrey Bocharnikov 8950aaf02a feat(browser): mobile webview (#20178)
* fix(browser): fix pr comments

* fix(browser): fix offset between navigation and webview

* fix(browser): split logic into contexts

* dialogs
* favorites
* webview

* fix(browser): crash when webview tries to render and destroy at the same time

* fix(browser): opened dialogs counter

* fix(browser):  load platform-specific webview

* fix(wc): unused wc files

* fix(browser): separate dapps and websocket logic

* fix(browser): fix pr comments

* fix(browser): fix popup tracker

* fix(browser): fix pr

* fix(browser): fix PR

* fix(browser): fix PR
2026-03-17 22:32:58 +04:00
Andrey Bocharnikov 33fe931c4d feat(browser): integrate mobilewebview repo (#20179)
* feat(Browser): AbstractWebView + webengine component

* Added capabilities

fixes #19420

* feat(mobile-browser): profile manager

* feat(mobile-browser): make a single overlay for Downloads/EmptyPage views

* fix(browser): integrate mobilewebview repo

* fix(browser): fix pr comments

* fix(browser): fix pr comments

* chore: bump status go

* chore: disable mobile browser
2026-03-17 15:27:19 +04:00
Siddarth Kumar 7afb60d1b9 init: fdroid setup
- `mobile/Makefile` -> Added `apk-fdroid` build target, used by
`fdroid/build-app.sh`. F-Droid requires an unsigned APK without Google
Play services.

  - `mobile/android/qt6/build.gradle` -> Added F-Droid gradle build
flavor, used during `apk-fdroid` target. Separates F-Droid builds from
Play Store builds and no signing configuration since it's supposed to be
unsigned.

  - `mobile/scripts/buildApp.sh` -> Updated to copy F-Droid APK instead
of usual locations from Jenkins build.

  - `mobile/scripts/buildOpenSSL.sh` -> Moved from iOS dir, shared
between iOS and F-Droid builds. Reusing the OpenSSL build logic that was
previously iOS-only but is now needed for F-Droid's from-source
requirement.

  - `mobile/scripts/Common.mk` -> Updated path to `buildOpenSSL.sh`
which is no longer inside iOS dir.

  - `mobile/scripts/openssl-patch.diff` -> Moved from iOS dir, applied
by `buildOpenSSL.sh`, so that the patch is co-located with the script
that uses it.

  - `ci/Jenkinsfile.fdroid` -> Had to make a new pipeline script because
integrating this into `ci/Jenkinsfile.android` was causing issues with
the generated `AppImage` and steps had to be fully sequential, so I
figured it's good to separate them out.

  - `fdroid/entrypoint-fdroid.sh` -> Docker entrypoint, used by
`fdroid/Dockerfile`. Sets up the container user/permissions before the
F-Droid build starts.

  - `fdroid/Dockerfile` -> A minimalistic Docker image for the F-Droid
Jenkins build environment, used by `ci/Jenkinsfile.fdroid`. I didn't add
to existing Qt Android `Dockerfile` because this one only needs a
minimal environment with Docker-in-Docker to run the `fdroidserver` VM.

  - `fdroid/build-app.sh` -> Called by `fdroiddata` metadata build step.
Sets up Qt and Android NDK environment, detects `JAVA_HOME`, configures
`Go`/`Nim` env vars, and runs the `make` targets for the F-Droid APK.

  - `fdroid/build-openssl.sh` -> F-Droid requires OpenSSL to be built
from source rather than using prebuilt binaries.

  - `fdroid/build-qt-android.sh` -> F-Droid requires Qt to be built from
source; this handles the Android cross-compilation.

  - `fdroid/build-qt-host.sh` -> Qt's cross-compilation requires host
tools (`moc`, `rcc`, etc.) to be built first.

  - `fdroid/cleanup-binaries.sh` -> Removes binaries flagged by `fdroid`
scanner, called by `fdroiddata` metadata `prebuild` step. F-Droid's
scanner rejects repos containing prebuilt binaries in test/vendor
directories.

  - `fdroid/cleanup-fdroiddata.sh` -> Removes stale `fdroiddata` clones,
called by `ci/Jenkinsfile.fdroid`. Prevents disk space issues from
accumulating `fdroiddata` clones across builds.

  - `fdroid/fdroid-container-build.sh` -> Runs `fdroid build` inside
Docker container, called by `scripts/fdroid-local-build.sh`. Isolates
the build in a container to match F-Droid's official build environment.

  - `scripts/fdroid-local-build.sh` -> A handy script to build F-Droid
locally, also called by `ci/Jenkinsfile.fdroid`. Manages the full
lifecycle of cloning `fdroiddata`, launching the `fdroidserver`, and
extracting the output APK.

  - `fdroid/generate-keystore.sh` -> Generates a single-use keystore for
signing the F-Droid APK. Sourced by `buildApp.sh` to export signing
credentials into the build environment.

fixes: https://github.com/status-im/status-app/issues/19741
2026-03-14 20:54:15 +05:30
Siddarth Kumar a980ae767c ios: enable automatic signing for local builds
fixes: https://github.com/status-im/status-app/issues/19725
2026-03-06 20:23:59 +05:30
Alex Jbanca 64aa578908 fix: Disable swap, buy and bridge on ios release 2026-02-26 11:33:23 -05:00
Alex Jbanca 7fc5283251 fix: MacOS build - missing libZXing
Compile zxing and scodes as static libs
2026-02-20 12:52:10 +02:00
Alex Jbanca 298ae9842b fix: Keycard login on desktop 2026-02-20 12:52:10 +02:00
Siddarth Kumar 613c45e5d7 ci: fix android release builds
Otherwise they would fail like this :
```
[2026-02-17T01:17:53.201Z] * What went wrong:
[2026-02-17T01:17:53.201Z] Task 'assembleRelease bundleRelease' not
found in root project 'android-build'.
```
2026-02-17 19:04:59 +05:30
Jonathan Rainville ebb9c2f9c6 chore(qzxing): remove old QR code library 2026-02-13 13:05:32 -05:00
Sale Djenic d7e78bdefc feat(deep-links): deep links support on iOS
Closes #19563
2026-02-13 13:05:20 -05:00
Jonathan Rainville cec140de2b feat(qr): add new QR library SCodes to scan qr codes (#19811) 2026-02-13 09:21:18 -05:00
Siddarth Kumar 82f8881851 reapply docker file simplification for android QT
fixes :

```
0m=[94mqrc:/app/AppLayouts/Profile/views/EnsView.qml:4
[0m [33mtext[0m=[94m"module \"QtQml.StateMachine\" is not installed"[0m
```

and

```
E  FATAL EXCEPTION: qtMainLoopThread
Process: app.status.mobile.debug, PID: 18150
java.lang.UnsatisfiedLinkError: dlopen failed: library "libStatus
Debug_arm64-v8a.so" not found
at java.lang.Runtime.loadLibrary0(Runtime.java:1097)
at java.lang.Runtime.loadLibrary0(Runtime.java:1019)
at java.lang.System.loadLibrary(System.java:1765)
at
org.qtproject.qt.android.QtLoader.loadLibraryHelper(QtLoader.java:486)
at
org.qtproject.qt.android.QtLoader.lambda$loadMainLibrary$0$org-qtproject-qt-android-QtLoader(QtLoader.java:535)
at
org.qtproject.qt.android.QtLoader$$ExternalSyntheticLambda1.run(D8$$SyntheticClass:0)
at org.qtproject.qt.android.QtThread.lambda$run$0(QtThread.java:57)
at
org.qtproject.qt.android.QtThread$$ExternalSyntheticLambda0.run(D8$$SyntheticClass:0)
at org.qtproject.qt.android.QtThread$1.run(QtThread.java:25)
at java.lang.Thread.run(Thread.java:1563)
```

- re applies this commit :
https://github.com/status-im/status-app/commit/9381d0d06c2bee8e902be3bcf49e9680fe055b0d

- I also adjust the qml lint job to catch this kind of import failure in
CI :
```
[2026-02-03T07:06:17.215Z] Running: QML Lint (Mobile)
[2026-02-03T07:06:17.215Z] qmllint: /opt/qt/6.9.2/gcc_64/bin/qmllint
[2026-02-03T07:06:17.215Z] Qt modules:
/opt/qt/6.9.2/android_arm64_v8a/qml
[2026-02-03T07:06:17.215Z]
[2026-02-03T07:06:17.215Z] Checking 1200 files...
[2026-02-03T07:06:33.882Z]
[2026-02-03T07:06:33.882Z] ERRORS:
[2026-02-03T07:06:33.882Z]
/home/jenkins/workspace/status-app-android/13/ui/app/AppLayouts/Profile/views/EnsView.qml:4:1:
Failed to import QtQml.StateMachine. Are your import paths set up
properly?
```
2026-02-06 13:59:20 -05:00
jakub 06089e893c Revert "ci: simplify android qt docker setup"
This reverts commit 9381d0d06c.
2026-02-02 13:43:19 -05:00
Siddarth Kumar 9381d0d06c ci: simplify android qt docker setup
- Add debug android variant for local builds.
- Fix container builds makefile target for running locally.
- Switch from compiling QT ourselves to relying on `aqtinstall`
- uses fewer qt modules
- adds cleanup stage to save space
- fix make translation target for macos
2026-02-01 10:59:22 +05:30
Alex Jbanca f3b5c4e05e fix: Disable lto for nim_status_client 2026-01-21 09:34:30 +02:00
Alex Jbanca 9412e58829 chore(openssl): Include legacy providers for GlobalPlatform crypto
GlobalPlatform crypto needs the legacy providers. While it will potentially work OOTB with android since we're using dynamic linking, for IOS we need to compile with `no-module`. This will bundle the providers in the lib.
2026-01-14 14:37:35 +02:00
Alex Jbanca 87a5f3f909 fix: Remove hardcoded paths from the build script 2026-01-14 14:37:35 +02:00
Alex Jbanca bb9d6f5d4e fix: Remove buildKeycardQt.sh as it's not needed 2026-01-14 14:37:35 +02:00
Alex Jbanca e95901281c feat: Add status-keycard-qt lib
This commit adds the status-keycard-qt submodule and updates the build configuration to support it.

In this initial version the `status-keycard-qt` option can be enabled by using the `USE_STATUS_KEYCARD_QT` flag.
- desktop: `USE_STATUS_KEYCARD_QT` will enable/disable the qt implementation. By default the go version is used
- ios: `USE_STATUS_KEYCARD_QT` will enable/disable the qt implementation
- android: the qt implementation is enabled by default

to squash - first commit
2026-01-14 14:37:35 +02:00
Siddarth Kumar 0fdd9fda2d ci: fix android signing
- brings in status-jenkins-lib@v1.9.36
- use gradle build types for PR and Release.
- signing config moved to gradle
- simplify build App script
2026-01-12 19:27:43 +04:00
Siddarth Kumar 1a9708fe01 ios: create and sign separate bundle ID for PRs
- points to `fix-ios-signing-with-fastlane` branch of
`status-jenkins-lib` which provides development certs for PR builds and
distribution certs for release builds.
- adds nix flake to provide ruby dependencies for `fastlane`
- adds config for new build identifier for PRs: `app.status.mobile.pr`
- swaps testflight script with fastlane action
- adds job to build iOS in release
- updates status-go to use nim-sds from
https://github.com/logos-messaging/nim-sds/pull/41
2025-12-24 16:33:32 +04:00
Lukáš Tinkl c4bd2dc4dc chore: setup automatic versioning for mobile builds
- use the same `DESKTOP_VERSION` as the user visible version, but also
set the internal build version string on both Android/iOS

Fixes #19309
2025-11-20 16:24:32 +01:00
Mag. d3246c8b0d ci: align STATUSQ_TESTMODE as the env var for test hooks (#19114)
Aligns workflow and build script with Jenkins to use STATUSQ_TESTMODE as the var to enable test hooks.
2025-11-10 10:24:31 +00:00
Siddarth Kumar 473adec29e fix: find command to select release aab 2025-10-31 12:57:19 -04:00
Siddarth Kumar a1dd245159 ios: produce signed build
- update status-jenkins-lib to v1.9.30 which provides iOS provisioning
profile and appstore certs.
- builds signed iOS app and pushes to testflight.
- updates testflight metadata with PR link and commit sha it was built
from
- adds `scripts/testflight-changelog.mjs` script used by CI to update PR
metadata.
- set `ITSAppUsesNonExemptEncryption` to `false`
2025-10-31 14:31:30 +04:00
Siddarth Kumar b949a1c902 fix: copy libcrypto from correct directory 2025-10-29 15:24:55 +04:00