TTD is dead…

I’m a developer. I hate TDD.

There, I’ve said it, and it might jeopardise my future should I find myself looking for new developer positions, but it just sucks IMHO.

I see loads of developer posts being advertised, most with TDD as an essential requirement. I disagree – it’s one way to achieve good code, but has always seemed to me to be a big, fat waste of time. I guess it might be relevant for developers coming to a project cold, who don’t understand the data or the processes. My development (and I might have been extremely lucky here) has always been in a team where I’ve been able to visualise the product, the data, the use and the user (e.g. eBird, Bird Atlas 2007-11, BirdTrack).

I don’t think I’m alone in this view either:

  • What seems to be cited most often: TDD is dead. Long live testing.
  • A good closing statement: TTD or not to TTD – “If you have been writing tests and code in a language for a long time, it’s possible that you can start skipping TDD’s baby steps, and start trying to code the final solution from the start. Be aware! Sometimes to advance, we have to return to the basics!”

Of course, TTD is NOT DEAD, but I just choose to not implement it…

URL > Android app deep linkage test

Test links for deep links to/from eBird

Basic link:

Scheme deep link:

HTTP host links:

TEST HTTP host links:

New App – Bird Atlas Mapstore

I’ve long wanted to have the Bird Atlas 2007-11 maps available on my phone, when out in the field – and now I can (thanks to the BTO for letting me develop and deploy this through their channels, published 18/01/2016). It’s all offline, optimised to 100Mb space and contains maps not published in the book too. See details here

It uses an ExpandableListView and ListAdapter to open up available maps for each species, which then leads to an ExtendedViewPager and TouchImageView combination from Mike Ortiz, which makes the maps pinch zoomable with sensible constraints and actions. The ViewPager loads up to the max four maps at a time per species.

The user can also switch between BOU and Alphabetic species orders, and between the maps published in the book or all available species.

Sniffing HTTP requests from Android Apps

I’ve recently had a requirement to rebuild a clunky and inefficient Android App with only partial access to the codebase (layouts and assets, but no Java/Android code). One of the issues was the App was talking to an online database via HTTP POST and GET. I had details of the HTTP root URLs used, but not the specifics on the parameters or how it was formatted.

So after a bit of digging, I found Drony (Google Play link), a kind of log watcher that can show you the exact nature of the HTTP requests, and from this tool I was able to see the exact format of the keys and values for the parameters to upload and download the right information. Great tool, really saved me a lot of effort (and stopped me having to chase original developers etc.)!

Great Android code snippets

I’ve been developing a new Android App over the last month, and found/learnt several new ways to do things, mostly from hacking other peoples ideas and code (but isn’t that what everyone does? why reinvent the wheel!) In no particular order…

Loading up PLIST files into Android from assets folder

Using xmlwise, which has a specific ‘plist’ class amongst other useful stuff, loading plist dicts and arrays into a Java map is simple.

public TreeMap getData(Context context) throws XmlParseException, IOException {
    TreeMap<String, Object> tMap = null;
    try {
        //To access files stored in Asset folder you need AssetManager
        AssetManager assetManager = context.getResources().getAssets();
        InputStream inputStream = null;
        BufferedReader br = null;
        try {
           inputStream ="myfile.plist");
           br = new BufferedReader(new InputStreamReader(inputStream));
           StringBuilder sb = new StringBuilder();
           String line;
           while ((line = br.readLine()) != null) {
           tMap = new TreeMap(Plist.fromXml(sb.toString()));
        } catch (IOException e) {
        } finally {
    } catch (Exception ex) {
    return tMap;

Enabling touch and pinch zoom on images in ViewPager

Using TouchImageView from Mike Ortiz, I can overload a standard ImageView and set it as a Drawable to add to the ViewPager adapter. It’s really cool, and by a simple hack of Mike’s code it’s easy to tweak the zoom levels. Double-tap and pinch-control are both implemented and it seems fast and robust. Kudos to Mike.

Adding an Android splash screen, easily…

OK, so not everyone wants one, nor every app need them, but the simplicity of the app I’ve been working on needed some branding to remind the users who brought them this (free) app. First I created an XML resource for the layout (useful if you want a complex splash screen).

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android=""

        android:src="@drawable/my_logo" />


Then I created a simple class to start on launch, which included a runnable to redirect after short period of time to the main activity.

public class Splash extends Activity {

    //Duration of wait - 1000ms = 1second
    private final int SPLASH_DISPLAY_LENGTH = 1200;

    public void onCreate(Bundle icicle) {
        //This line is useful if using action bar etc. 
        new Handler().postDelayed(new Runnable() {
            public void run() {
                Intent mainIntent = new Intent(Splash.this, MainActivity.class);

Finally, adding


to the android manifest gets rid of the title bar. Haven’t worked out if this AND


(in the Splash class above) are necessary together or if one will override the other.

Android: Remembering users previous tab selection

This is something I built into v2.0 of Pace Calculator, since often users would be only runners, cyclists or swimmers, and once they select a particular tab, they want the app to start-up in that tab every time. It uses the basic SharedPreferences object, all within the main activity that controls the ActionBarActivity tabs.

First, in MainActivity, set up the following variables

Integer tabPref;
SharedPreferences prefs;

In the onCreate method instantiate the variables, defaulting to 0 if the app has never been used before

prefs = getPreferences(Context.MODE_PRIVATE);
tabPref = prefs.getInt("tabPref", 0);

You need to make sure that when each tab is selected, the preference is also set, and editor.apply() called

		.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
			public void onPageSelected(int position) {
				SharedPreferences.Editor editor = prefs.edit().putInt(
						"tabPref", position);

Finally, at the end of OnCreate, you need to make sure that the tab determined in the preferences is selected with

mViewPager.setCurrentItem(tabPref, false);

That’s it!

Pace Calculator updated

Today I updated the first Android App I ever built (released December 2010!) Pace Calculator has been updated to include speed calculations for cyclists and pace per 100m for swimmers. Both run and bike tabs include metric (km) or imperial (mile) options. It’s been a useful exercise using action-bars, styles and swipe tabs, all new standards since I built the original app. APPS >>>