Summer time is for hacking! I booked some time in the last weeks to carry on with the work on the Android port we started earlier this year at Igalia, merging the pending bits in master, completing features and adding some polish. Now that everything is upstream, let me share it with you!
Merge ownCloud document provider
I had used the ownCloud Android library to speed up the implementation of the ownCloud document provider. Unfortunately, it included some libraries as dependencies in binary form and that was not acceptable to integrate the library in LibreOffice.
My solution was creating a Github fork of the library and replace the binary dependencies with the corresponding sources. Now a tarball containing the sources in that repository is downloaded and compiled by LibreOffice build system when asked for the Android target.
Implement save to cloud
While I was working on the Document Providers infrastructure, Miklos and Tomaž were implementing document edition on the LibreOffice port. Now there is some basic support to edit and save documents, I must enable the save operation in the Document Providers framework and in particular in the ownCloud test implementation.
The ownCloud save operation itself was easy, but knowing whether the local save operation had finished or not proved to be a bit more challenging. LibreOfficeKit API does not yet provide a way to set a callback on the save operation so we can check its status and do something after it has finished. As a workaround, I periodically check the modification date field in the file to know if LibreOffice core is already done with it.
This is meant to be a temporary solution, but at least, we can provide some feedback on the save operation now.
A hamburger in my LibreOffice
Without any indication, the drawer containing the list of document providers was completely hidden from users; only a handful of people I showed the app to, besides myself, were aware of it. For that reason, I enabled the application home button, the one on the left of the action bar, to become a drawer indicator, the famous “hamburger” icon found in many Android apps.
It took me some time to figure out the way to put everything together so the button changes its icon and behavior according to the context. When the user is on the root folder, the “hamburger” will indicate the presence of a drawer menu with the additional locations implemented by the available document providers. When browsing some directory, it will become a back arrow to browse the parent directory. Finally, when the drawer is open it will also become an arrow to close the drawer.
Smart behavior for system back key
Tapping the system back key when browsing some directory and see the app close was a bit frustrating, because most users expect it to go back to the previous location, the parent directory. I’ve overridden the default behavior to make it smarter and context-aware. When browsing some directory, it will open the parent directory; when the drawer is open, it will close it; when browsing the root directory, it will ask for an additional tap for confirmation to exit the application.
All these patches are in master branch and will be part of the next major release. Impatient people will also find them in the daily builds from tomorrow onward.
Cool. Your next step will be to remove the hamburger 🙂
https://lmjabreu.com/post/why-and-how-to-avoid-hamburger-menus
http://www.lukew.com/ff/entry.asp?1945
Hehe, I knew about that, but the harm was already done because the drawer menu was there and lacked an icon to announce it, which was even worse.
In general, the Android UI needs design work, with a global vision and guidelines for developers. Hopefully those will come at some point in the future.
Please don’t ask for confirmation when pressing back on the homescreen — it’s highly non-standard behavior. It also doesn’t serve any purpose, as closing the app is non-destructive and opening it again is as simple as tapping a thumbnail in Recents.
As I said before, we’ll need design work in LibreOffice for Android. At the present moment, that’s not the only non-standard behavior 😀