The last time I talked about flatpak updates, I explained how flatpak apps can detect that a newer version has been installed, and restart themselves. That is great, and may almost be good enough when you have automatic updates. But that is not always the case.
Thankfully, we can do better. Since 1.5, Flatpak has a portal API that lets applications monitor for updates, and request updating themselves.
Here is how this looks when it is all put together:
In the terminal, I’m building a new version of the the portal test app, and update my (local) repository. The flatpak portal is noticing that the update appeared (I’m running it with a short poll timeout here, instead of the usual 30 minutes), and sends out a D-Bus signal to the application, which requests to be updated, and then restarts itself.
Using the portal API directly is not very convenient, since you have to listen to D-Bus signals and whatnot. Therefore, we now have a library called libportal, which is providing simple async wrappers for most portals. That is what the portal test app in the demo is using, and you should be using it too in your applications.
The first stable release of libportal will appear very soon, with Flatpak 1.6, and then it will find its way into runtimes.
Update: Since this is a portal, users are in control of what apps are allowed to do. If you don’t want an application to update itself, you can put an end to it with
flatpak permission-set flatpak updates $APPID no
Use ‘ask’ instead of ‘no’ to get a confirmation dialog. The permission-set command is new in flatpak 1.6.
What’s the use case for this feature? When would it be better to let individual apps demand that the user update them instead of just letting the flatpak UI be the one-stop-shop for updates?
Having each individual app badger me to update it is one of the things that bugs me about Windows and macOS. Having a one-stop-shop for updates (the package manager, in my case) is one of the reasons I use Linux, and it’s also one of the nice things about Android and iOS.
Great job!