Tuesday, June 01, 2010

Android App Surgery: Simple GPS

This review is part of my series of Android App Surgeries, you can vote for which app I should review next, or nominate your own app for review on the Android App Surgery Moderator page.
I've spent the last couple of weeks preparing for, rehearsing, and presenting at Google I/O. As a result, I skipped last week's App Surgery.

I'm going to ease back into things this week by taking a look at a very simple app: Simple GPS Info. It's a simple app that displays some additional information from the GPS - including the relative position of the satellites being used to triangulate your position, and the latest GPS fix accuracy.

Once you've been found, the app then lets you share that location.

Next week I'd like to tackle something a little juicier, so be sure to nominate your own app, or vote for something substantive on the Moderator site.

User Experience

The primary user experience for Simple GPS requires no user interaction. You launch the app, wait for it to get a GPS fix, and then observe the results. With limited user interaction it's particularly important that you find effective ways to engage the user and keep their attention.

GPS Status starts off well by keeping things simple. The screen is (relatively) uncluttered with the data displayed clearly and intuitively without any unnecessary distraction.

Generally speaking, there's too much blank space. The text could be bigger, as could the compass dial - there's no reason a third of the screen should always be blank. With no user interaction the data is the only thing engaging the user, so it needs to really stand out.

On the plus side, the latitude, longitude, and accuracy return values are all of predictable fixed length, so it should be easy to optimize the UI to make the data as visible as possible.

There are some specific UI choices that I think detract from the apps usability:
  • The app has hidden the standard title bar, and replaced it with a custom version. Generally users prefer familiarity, so given that the replacement bar offers no additional functionality I would avoid replacing it. 
  • Getting a GPS position fix can often take longer than your screen timeout, and with no user interaction you risk the device going on standby before your location is found. It's worth considering asking the Window Manager to hold a WakeLock until the first GPS position is found. Thereafter it would be a useful menu option for people who want to monitor changes.
  • It would also be good to know how far along we are at getting a lock. Perhaps show an overall signal strength that gives and indication of how many more satellites are needed before a result will be available?
  • Scientifically speaking, precision and accuracy are different things, GPS result quality is usually related as a measure of accuracy. 
  • Landscape mode has been disabled. As an alternative, I'd consider creating a different layout optimized for landscape orientation.
It would also be great to color-code the satellites, green if they were used to calculate the last position, red otherwise.

The one area of interaction is around sharing your current position. It's a pretty good idea, but the implementation could do with some more polish:
  • The share button looks out of place. I'd consider moving it into an Activity menu rather than cluttering the screen.
  • If you try to share a position before a GPS lock has been found, the toast displayed has a number of spelling and grammatical errors that make the app look significantly less polished.
  • Using a URL shortener adds a dependence on an Internet connection that isn't strictly needed. Currently the app fails if no Internet connection is found - perhaps a better alternative would be to fallback to the full-length URL?
  • The shared position page is hosted on a private domain. This is great for allowing customization of the data being shared, but it might put some heavy load on your servers! I'd consider making the sharing data more generic. Using the Google Static Maps API you can create a pretty good custom map-based landing page.
    Android Features

    I briefly considered suggesting a Live Wallpaper or Widget, but the power implications of such a thing would quickly make it untenable.

    Instead, I'd like to suggest use of the Reverse Geocoding Maps API. Using this API you could find the street address of your current location, adding additional context (and engagement) to the app, as well as additional information to "share".

    Stability / Performance / Risk

    Stability-wise -- no crashes, no failures.

    I did notice one possible issue. If you launch the app with the GPS disabled, it prompts you to allow it to force it back on.

    1. It's bad form to modify settings like this directly. It would be better if it displayed a message (similar to Market with background data disabled) suggesting that you can't use the app without GPS and offering a link to the appropriate settings page.
    2. If you say yes, then exit the application and disable the GPS, reentering the app doesn't prompt you to re-enable the GPS.
    Get Your App Reviewed!

    If you'd like to see your app reviewed, you can self-nominate at the moderator site. You can also go there to vote for which app you'd like to see reviewed.


    1. Great review. :-)

      One comment I'd make about Android in general is that I'd like to he able to give applications control of certain services that might be considered a security threat. For example, I want CoPilot to be able to automatically enable GPS for me when I start it, and turn it off again when I exit. There are many other examples.

      Now, I know there's various security implications to that, but in my opinion no more so than sending emails, making phone calls, or accessing my contacts, etc. So surely GPS etc could be another security permission that apps can request on install?

      Luckily I can use an app like Setting Profiles which uses (presumably) undocumented APIs to enable GPS automatically. But is it ever likely that applications will be able to control these sorts of services in an 'officially supported' way?

    2. Thanks reto for your good work :) I did some modifications you suggestend on your surgery :)

      Already implemented :
      • landscape layout (with onConfigurationChanged )
      • speed support
      • window lock ( it releases the lock once the first fix comes )
      • fallback on full-long url when the app can't shorten the app
      • changed the "can't share" text with some real english ;) ( i changed precision with accuracy too )

      Plus i've considered:
      • to move the share button on the menu but i would like to implement some kind of tutorial which "invites" the user to click on the menu button in order to share the location. Suggestion on how to do it ?
      • to not use a private domain for sharing the location but i think i can do much more things on my domain than using google static maps api
      • use the reverse geocoding feature. I would ( probably in the near future ) use this feature but i'll let the "smart" user choose if he wants to enable it .. I want to keep my application internet independent as much as possible

      By the way thanks. It was really inspiring

    3. @vekexasia, I'd like to make one additional suggestion, if I may.

      There's no need to display 15+ decimal places of lat/lon data; it implies a sub-micron level of precision which (of course) isn't true. Realistically, 6 decimal places yields precision of a few centimetres, more than enough for GPS data. If you wanted to get fancy, you could calculate the number of digits to show based on the reported accuracy of the signal - but otherwise, I'd recommend just rounding it to 6.

      Nice little app, BTW!

    4. @String, Thanks a lot for your suggestion ;)

      I forgot to mention on my previous comment i did this modification too..

      But i did round to the 4th decimapl place. Maybe i'll follow your suggestion about calculating the number of digits to show based on the accuracy..

      Thanks a lot :)

    5. Anonymous12:22 am BST

      The Tricorder app does all of this, plus it shows your location based on cell towers if GPS is disabled, along with a host of other functions.

    6. As a developer who is just starting out writing apps for Android and I find these reviews extremely helpful. In particular the links through to relevant sections of the documentation are awesome - those documentation pages can be very daunting to a newbie.

    7. This artical is very useful for me. I am a developer and always looking to learn something new, thanks for sharing.