Wednesday, April 3, 2013

The new (or unnecessary) feature: Download

So after integrating with Zing Mp3 Api, my app is now capable of streaming most updated songs from Zing. As of today, there are approx. 27 hundreds downloads with an increase of about 1 hundred downloads a day. Ratings went up to 3.8, a .2 increase. Quite encouraging.

I think I have been going too fast with the development by releasing features after features yet not spending time to listen to my users feedback. So in the last couple of days I spent most of the time to go through each feedback and reply them all. It was a fun and entertaining process. Fun to know what others think about your work. Entertaining to read some humorous feedback.

I think if a user spends some time to rate and review, I should spend a at least a double amount of that time to process and reply. Most of the feedback are feature requests,  some are very encouraging and most of the requests are for the Download feature.

I've never wanted to support a "Download" feature in an streaming radio app for several reasons:
- This is an online radio app, so you have to be online. The nature of listening to online music is, simple, online. If you're not connected, you can't listen to Zing Radio anyway, whether on web or on phone.
- It goes against the trend: the cloud. Well, we've been talking about it a lot. As the speed of the internet is getting faster, listening a 3 to 4 minute song shouldn't be that hard, even on 3G.
- It has potential legal issue (but the Zing Mp3 official site allows users to download too).
- After the users download the songs, they will play those songs using another app and not Zing Radio. This is what I fear the most as I don't want to lose my very few precious users.

The dilemma bothered me for a few days and finally I thought if I don't want to lose them, I have to to please them (well, after all, they make the app alive).

Then I faced another issue: I wanted to use DownloadManager, a service only available since Android 2.3 (Gingerbread). Since my app has supported 2.2 (Froyo) since the beginning, implementing this class means cutting off those 2.2 users. Not a pleasing feeling to know that the app you love no longer supports your device.

Actually there are other ways to implement Download, but I'd have to use AsyncTask, a class that supports asynchronous tasks. Then I would have to handle all kinds of dirty work such as sdcard is full, the internet is cut off when downloading, resume/cancel the download etc. More importantly, I'd have to manually manage multiple, concurrent downloads if the user wishes to. The DownloadManager service handles it all for me. After researching, I thought the return of implementing with AsyncTask is not worth the effort. For the engineers out there, you know what I mean.

Google Developer Console is a great tool. It provides the developers with data so they can make decisions. I looked at the statistic and found out that only 2.5% of the downloads are from 2.2 devices  (thankfully). So in order to please the other 97.5% of the users, cutting of those 2.5% sounds logical. Plus, I don't have to worry about fixing bugs that are from the 2.2 native library anymore. I decided to go with the DownloadManager service, a hard decision and I hope it's worth it.

I knew I must find a way to solve the aforementioned concerns when putting this Download feature in. After talking to a friend, it became so simple. I can just download the songs when users add them into their "My Songs" list, a kind of favorite play list. The next time they go back and click on that songs, the app will automatically check if there is a version of the song on the sdcard. If there is one, the app will play it from there. If not, stream from the internet. Users can turn this auto-download feature off in the Settings screen.

The solution mitigates many concerns yet still preserves the "online" characteristic of Zing Radio:
- The app is still able to play songs, whether it's from the internet or from the sdcard. And it's faster to play a song from the sdcard.
- To play the downloaded songs, the users need to go to My Songs screen.
- My Songs screen will serve as an entry point to look for downloaded songs. And this is good for my upcoming features.
- If the users want to play from another music player, they can still do so. Unlike iOs, it's nearly impossible to stop the users to do things they want, i.e. look for a file, on their device. So if I can't stop them, I'd rather give them a way to do it and hope that they like my app enough to play their saved songs with it.

I will watch and fix bugs in the next couple of days for sure for this new feature. Hopefully my own testing was robust enough. The "cool feature" will have to wait.

Till then, stay tune!