Second generation

This is the second part of a series of articles about the development of Advention. If you haven’t read the first part, you can find it here.

Where thumbs can reach

The design of the first generation provided quick access to everything, but there was one usability problem. You had to stretch your thumb to switch tabs because the tabs were at the top of the screen. Luckily Google just introduced a new navigation element, the bottom navigation, which was barely used by anyone at the time.

First version improvements screenshot 9 Second version screenshot 01
Tabs (left) replaced with bottom navigation (right)

During this period, the Signal collector and Signal processor were renamed to Signals-Android and Signals-Server.

Debugging

The first debugging tool added to the app was for activity recognition. I had trouble finding out the cause of the problem, and the emulator could not simulate activity. I also didn’t know that I could’ve wrapped the activity recognition with an interface and create my own mock activity recognition for testing.

I also realized that there was no way for users to report issues, so I created an in-app reporting tool. This tool allowed users to report issues and suggest improvements.

At the time, there wasn’t a suitable method for getting data from a device other than upload. If the upload didn’t work or the server was down, the data would just accumulate and take up valuable space. I decided to add an export or, more accurately, share option to solve this problem. I decided to implement share instead of export to a file because I didn’t have to deal with external storage permission.

Second version screenshot 05 Second version screenshot 04 Second version screenshot 03
Debug, Report, Export.

Personal statistics

After implementing debugging tools, I looked at other things to improve and finally implemented personal statistics. Personal statistics were server-side, and the server calculated them during import. Users could see how much they tracked in total and in the last 30 days. They could also earn wireless points, which were planned as a virtual currency.

Second version screenshot 06
Statistics improved

Challenges

Unfortunately, it became apparent that personal statistics were still not enough to keep users engaged. I spent a few days exploring various ideas and finally settled on adding challenges. Challenges were implemented to keep users motivated to track data regularly and earn wireless points.

Unfortunately, calculating challenges was very demanding on the server. Even after several optimizations, it still more than doubled the processing time of each upload. At one point, they were even disabled for a while until improvements could be made.

Second version screenshot 07 Second version screenshot 08
New feature: challenges

Automatic uploads

Around the same time, I was working on challenges, I also added a new feature called automatic uploads. This feature allowed users to choose when to upload data (by a size in megabytes) and on what network (Wi-Fi or cellular). This was a much-needed feature and it also came with a new page called recent uploads to give users an idea of when the uploads happened. The recent uploads also gave users statistics provided by the server with a push notification.

Second version screenshot 09 Second version screenshot 10
Recent uploads enter the scene

I see only whiteness

As apps started to move from Holo to Material, white designs became more popular. I also decided to implement a white design version. Advention became one of the first apps in the store to allow users to choose between light and dark themes. This option was introduced before Google added automatic theme switching to the base theme.

Second version screenshot 11
Now with a white theme, wait, isn't that backwards?

Kotlin

Before the third generation, I rewrote the whole app in Kotlin, which just became a second officially supported language for Android. The rewrite took several months but it was worth the effort. It helped significantly improve the codebase and helped solve some issues. The biggest improvement was the replacement of Android async with Kotlin coroutines.

The third generation

Read on about the third generation. During the third generation the user interface was completely revamped.