We all know the current situation with cloud providers such as Dropbox, Owncloud, Drive, etc. is less than ideal.
The problems are:
– Some of them use proprietary code for the client, so we can’t control the user experience on the desktop.
– They provide different experience based on its application, which may result in diferent workflow and poor integration.
– Integration is very poor. Probably most of this fault is the need for a common API to integrate with the desktop.
– Full support for it is difficult. It needs gvfs support for syncing etc, which is not yet available, and every provider does it own thing anyway.
– Uses of specific API depending on the desktop or file manager. i.e. Dropbox uses nautilus-dropbox package for it’s integration with only Nautilus. This is problematic for users of other desktops or file managers, and also the Nautilus extension API is very limited.
– Need to use tray icons for the menus.
So what should we do?
Design team of GNOME worked on it and mockuped this (the lowest one): https://raw.githubusercontent.com/gnome-design-team/gnome-mockups/master/nautilus/nautilus-next/other-locations.png
This allows cloud providers to add custom menu actions for them, which allow to avoid the use of tray icons and also shows the status of the cloud provider.
Now the technical problem, how do we integrate in the desktop without relying on extensions and allowing other file managers/toolkit/desktops use it, so cloud providers companies start using this integration for any desktop?
Luckely we have a powerful desktop-toolkit-app-agnostic tool. DBus. So I created a DBus API for it and added support for that API in gtk+. This is Nautilus with gtk+ cloud provider support in the sidebar:
Tada! We can see here a cloud provider in the sidebar, using the cloud provider icon, name, status and a custom menu provided by the cloud provider.
How does it works?
Cloud providers expose the DBus API and just listen to it’s calls, acting as a server. Also, the cloud providers implement the dbus method “CloudProviderUpdated”, which notifies to DBus that the cloud provider updated it’s status/icon/path or whatever it needs.
Currently available funcionalities are:
– GetIcon: which retrieves the cloud provider brand icon.
– GetPath: which retrieves the folder where the cloud provider stores its files.
– GetName: which retrieves the name of the cloud provider
– GetStatus: which retrieves the status (idle, syncing, error) of the cloud provider
And finally, it can expose a full GMenuModel through DBus for its use for any action.
The good thing about this is that we can extend the DBus API to whatever it’s needed, so if someone working in a cloud provider have some suggestion, say it and we will add it.
What can we do for cloud providers companies that are not interested on it? We can add support for it anyway (as far as it’s API/daemon allows), if we have access to the daemon or some APIs we can create a small shim/bridge which isolates the daemon/API calls and exposes the DBus methods, that “easy”!
Now, I guess you would like to see an example of a cloud provider implementation of this desktop integration. Here it is:
This example uses all capabilities, and it updates its status every two seconds.
And what toolkits/DE’s/apps need to use them? Here is an example:
So far it works better than expected. So future work is:
– Make sure it provides what all cloud providers need
– Convince cloud providers companies to use this instead of random extensions, specific DE code, or complex clients. And if not, implement a shim/bridge on our own for them.
– As you can see, it’s in a wip branch, so it’s needs more work.
Hope you like the progress we are doing to integrate some 3rd party services in our linux desktop.