One year ago I had an idea of a smartphone application that looked like very innovative: a geo-calendar or a geo-located calendar. But what would be that? Well, it is a calendar or to-do list where the user would be able to associate a task or appointment with a place and the smartphone would remind you of the task or appointment when you arrive (or leave) that specific place! If we think about the standard calendar model, they are kind of dumb or, at least, they could be a lot smarter, as they are only date/time based, but what if an appointment is related to a physical place?
The concept was of an application on which the user would be able to create tasks and assign places to them, so, as you remember of goods to buy at the grocery, you insert those items into a shop list on the app, if you just remembered of something to buy at the hardware store, you insert the item into a hardware store related task and so on. Later (it could be a few hours, days or even months), when you finally get to a hardware store, the app would detect that and remind you of the items in the hardware store’s task! Wouldn’t it be cool? The same thing would happen to a grocery, bakery, pharmacy or any other place the user might want, even home or work place! You could create a task related to you job and the app would remind you when you are there!
Unfortunately at that time the available technology did not allowed the app to become a reality: the smartphone OSs (such as Android 1.6 and 2.1) were too primitive and lacked some of the needed features, the geolocation devices (GPS) back then drew too much power, batteries were too small and of course, my knowledge of mobile programming wasn’t good enough!
The whole idea was put aside and ended up almost forgotten. Thankfully, it was not completely forgotten and was stored into some underground place in my brain for years…
So, in 04/20/2015, in a local Japanese restaurant, along with my wife Débora, my sister Cristiane and her life-mate (currently wife) Isabelli, after some hours of a good talk and lots of sushis, sashimis, rolls and vulcanos, the subject drifted to smartphone apps. We talked about several ideas, even my pretension of designing a game some day. And then, suddenly, that old idea came back to my mind: the geo-calendar! I figured out that now I could do it! The technology is here, we have very good OSs now (such as the Android 5.0 and 6.0), decent battery capacities and excellent location capabilities!
And more, thanks to the profusion of WiFi systems, the app would be able to recognize places by using their WiFi networks, enabled location even where the GPS does not work very well!
After that dinner, we came back home and I immediately started researching on how to build the app (ask Débora, she is a very comprehensive person, thanks my love!).
Initially (and thankfully as I will explain later) I opted out for developing for Android as that was the phone platform I used for years. Of course I planned to move to other platforms in the future and thinking like that I choose a development system that would enable that migration with minimum effort. I ended up choosing Xamarin, a C# IDE that enables writing very portable code (within some limits, of course) for major OSs: Android, iOS and Windows.
However, after some weeks researching and testing some Xamarin features, I realized my app would need a so called foreground service architecture and with Xamarin I was getting some memory leaks which I couldn’t understand or detect it’s origin (also because I am not a C# programmer neither an Android expert, in other words, I didn’t know what was happening).
So, in order to discard unknown factors (as Xamarin uses a C# interpreter and libraries and they could be the root of the memory leaks) I ended up completely abandoning the idea of using Xamarin and started to focus on using Google’s Android Studio.
And so it started and after some three months of designing and programming (starting from the original idea on 04/20/2015), the basic features of the app were fully operational: the WiFi detector could recognize WiFi networks, detect the presence or absence of a known network, etc. With the app coding going on, a need was becoming more and more urgent: it needed a name! The first ideas were of using acronyms (something engineers just love!), but after considering several acronyms, I realized that it would be too much technical and the app was not supposed to be technical.
I started to look for names and one of the first that came to my mind was Jarvis (yes, the robotic butler of the Iron Man). The name itself isn’t bad at all, but after a little research I found there are lots of apps with that name on Google Play and also, I didn’t want a possible copyright or trademark issue with Marvel. Besides, along with the name, I also had in mind I would need a good and simple logo.
After some days, I thought on James as a possible name, the name sounds very good and was very used in the movies and TV shows associated with butlers and personal assistants. Alfred (Bruce Wayne’s butler) would also be an option, but I thought it sounded too complex for Brazilians. So the choice was made: the app would be named James!
Thereafter the amount of work was huge and each step was celebrated as a victory. It is important to note that James uses several features that I’ve never used before. So, the first time I could save data onto Android’s internal SQLite database was celebrated (before that the places were hardcoded using Java lists). Also, when I first managed to create a working webservice (including JSON, PHP and MYSQL setup on the server side and JSON+HTTP services in the app), it was an amazing day!
The first closed alpha test began on 08/21/0215 followed by a beta test on 09/25/2015 and the public release on 10/07/2015 (which purposely coincided with my birthday and also with a local newspaper article about the app).
Today, almost three months after the public release, I can say that the app evolved a lot! The first user reviews were listened and implemented as possible, the user interface was reworked to make it easier and more interactive.
The location mode also evolved a lot and now James uses a hybrid system based on WiFi/GPS/Network which allows recognizing places both by their WiFi networks (using the SSID/BSSID) and by their geographical coordinates. One important feature of James’s location system is that it is completely offline, meaning that it does not need an internet connection in order to resolve the user position. In fact, the whole app was designed to work completely offline, without an internet connection! That feature will only be changed in the future, when task and location sharing is deployed, allowing sharing tasks in real-time.
The power consumption is also a big target because nobody wants a battery-killer app! The first releases of James, which used only WiFi location drained a little quantity of energy but as the hybrid mode were released, it brought new challenges as the GPS power consumption is far higher than the WiFi scanning. In order to reduce the power consumption in hybrid mode, the newer versions of James brought new power-saving modes which detected when the device is idle or standing still, enabling the GPS when strictly necessary.
The release of Android 6.0 Marshmallow brought more challenges as the new IDLE and DOZE modes directly interfere on the way the app works. In fact, the Android 5.0 Lollipop itself also brought its challenges, especially with the behavior change of the repetitive alarms (poorly documented at that time) of the setRepeating method on the AlarmManager class: until version 5.0 it was possible setting a repetitive alarm of a few seconds, but starting from Android 5.0, the minimum interval was changed to 60 seconds. Needless to say James uses intervals shorter than 60 seconds for the WiFi scanning. So, from one day to another (after OTA upgrade from Android 4.4), the app started to behave strangely. It took me some days until I realized that it all was caused by the behavior change on the setRepeating method…
James also has a portuguese Facebook fanpage which can be found here. If you still didn’t like James, please like its fanpage! And if you still didn’t tried out the last release of James, downloaded it on Google Play, it is completely free!
I end this post with a few pictures of James version 1.3.