Skip to content

KDE Android News (October 2024)

Saturday, 12 October 2024 | Volker Krause

Here’s an overview of recent work around Android platform support for KDE Frameworks and KDE applications, most of which is a direct result of discussions and work at Akademy and the Matrix conference.

Notification permission fixes

Porting Itinerary and NeoChat to use the KNotification permission API identified two issues around permission checks and callbacks on permission changes that resulted in the application seeing the wrong permission state. That’s fixed now.

Retirement of the Qt 5 CI

With the 24.08 KDE Gear release all our Android apps are based on Qt 6, including their stable release branches. We have therefore started with retiring the Android Qt 5 CI/CD infrastructure, which should save us both maintenance and computing resources.

As Qt 5 is meanwhile lagging behind several Android SDK versions it’s no longer a viable platform for producing APKs that work on up-to-date devices anymore anyway.

Android CI has meanwhile been removed from the KDE Frameworks 5 maintenance branches as well as from a few other libraries that still used it. The removal of Gitlab CI templates, Craft caches and container images will follow.

In particular this means the invent-registry.kde.org/sysadmin/ci-images/android-qt515 container image is deprecated and will be removed eventually. Please get in touch if you are still using this externally. Poppler’s CI was such a case for example.

QML file installation

The QML module macros in ECM used to install QML files to disk, besides bundling those via the Qt resource system as well. While that is still needed on most platforms due to some specific code in Kirigami, it’s unnecessary on Android where we rely solely on the bundled data.

This resulted in unnecessary content in the APKs, which has been fixed and makes all our APKs a bit smaller now.

Translation lookup order

The probably most visible change is a fix for a long standing bug in KI18n’s multi-language fallback lookup order, which would result in applications showing a wild mix of languages under certain conditions.

This happened when the primary device language was set to English but the country to anything but the US or the UK and one or more secondary languages were also selected. While not strictly limited to Android, there’s two factors that made it particularly prone to happen there:

  • Newer Android versions allow language and country to be set fully independently, while on many other systems only certain predefined combinations are available.
  • The language setting doesn’t just impact application translations but also text input, so many more users have multiple languages configured.

KI18n first looks for a translation for the specific language/country pair and then just the language, before falling back to the next configured language/country pair. If no translation is found it’ll eventually use the English/US source text.

Conceptually this is not wrong, but the implementation missed the fact that there is no “country-less” English translation but only the English/US source text. A configuration of English/Canada and French/Canada therefore previously resulted in a French translation rather than an English one, as it does now.

This has been backported and should be available in all our APKs with 24.08.2 latest.

Runtime language change

Thanks to input from Fabian during Akademy there’s also significant progress on having applications react to system language changes at runtime.

This basically consists of three parts:

  • Propagate the native Android system configuration change to Qt, done in Qt CR 596175.
  • Reset cached values inside KI18n on system language changes, done in KI18n MR 124.
  • Trigger QML binding re-evaluation for i18n() calls on language changes, implemented in KI18n MR 127.

With those three changes applied and a few lines adjusted in the application code to make use of this large parts of the UI already follow system language changes automatically.

It’s far not perfect yet, as there’s more things that need to update in this case than just translated strings. Date/time formatting for example, as discussed in QTBUG-129727. But overall this is already much better than what I had expected and assumed to be feasible with realistic effort.

Dark mode support

As reported previously we have working support for dark mode since 24.08.1, thanks to Julius’ work on icon recoloring.

So far this required minimal changes to applications to enable it though. That has also been fixed, dark mode support is now automatically enabled for all applications using the Breeze style.

Outlook

There’s still more to do regarding Android platform integration. I’d say the two probably most pressing issues are the following:

  • On some devices the font size is unusably small, caused by the display scale factor being wrong. Based on some investigation during Akademy the current working theory is that this is a race condition in Qt’s code reading that information. I have no device/setup that reproduces this problem unfortunately.
  • Selecting files in the platform file dialog that are located on a cloud storage such as Nextcloud silently fails. That is, to the application selecting such a file looks as if the user had canceled the dialog. Here we know exactly why this happens (it’s explicit code in Qt doing this, for valid reasons), the challenge is rather to find a proper solution.

If you are interested in Android integration for KDE applications, feel free to join us in the #kde-android Matrix channel!