Archive for Mobile

Fixing Eclipse Update Issues

// March 2nd, 2010 // No Comments » // Dev, Mobile

After a bit of a break, I’m about to start a stint of Blackberry development and really wanted to try out the new Blackberry JDE integration with Eclipse – something that promises to reduce the immense tedium of running Blackberry simulators somewhat. Anyone who has ever tried to do that will understand how valuable this could be, both financially (time is money after all) and to your sanity.

The plugin requires at least Eclipse 3.4, though, and I was stuck way back on 3.3. Eclipse was reluctant to update itself to any new version from any of the obvious “update” menu items, so I went for the simple brute force method:

  1. Zipping the old Eclipse app folder, then delete it
  2. Download the latest Eclipse, and add the latest version of whatever plugins are needed
  3. Reattach to the old workspace folder.

This initially appeared to work, but didn’t.

Ant Integration

The most visible problem was that Ant builds would no longer run. They’d start, and the red ’stop’ button on the console would light up (indicating I could stop the running Ant process, not that it was stopped) but no logging at all reached the console. No dialogues appeared explaining the problem.

The clue lay in the workspace’s .metadata/.log file – there were two exceptions, at least one of which was being thrown every time I tried to run Ant:

!ENTRY org.eclipse.core.resources 4 75 2010-03-01 21:17:55.921
!MESSAGE Errors occurred during the build.
!SUBENTRY 1 org.eclipse.mtj.core 2 75 2010-03-01 21:17:55.921
!MESSAGE Errors running builder 'Preverification Builder' on project 'Framework'.
!STACK 1
org.eclipse.core.runtime.CoreException: Build state machine has not been initialized.

or

!ENTRY org.eclipse.ant.ui 4 120 2010-03-01 21:21:16.468
!MESSAGE Error logged from Ant UI:
!STACK 0
java.net.SocketTimeoutException: Accept timed out

Not, admittedly, much of a clue but enough to eventually track down the problem. Ant’s configuration – in particular, the locations of its jars – are stored in your workspace, despite it being a plugin integrated into Eclipse. If the location of Ant’s plugin folder changes, Ant stops working with this workspace.

To fix the problem, go to Preferences > Ant > Runtime. Remove all jars under Ant Home Entries, and then find the new versions in the Eclipse plugin folder (as an External Jar Location). Apply the changes, and your builds shoudl run again.

JavaME Emulation

The JavaME plugin is notoriously bad at introducing breaking changes whenever it updates. This time was no exception – my JavaME projects appeared fine in the IDE, but produced the following exception (to the console, at least) whenever a WTK emulator was run:

Running with storage root C:\Documents and Settings\Tom\j2mewtk\2.5.2\appdb\rms
Running with locale: English_United Kingdom.1252
Running in the identified_third_party security domain
java.lang.ClassNotFoundException: framework/midp/Application
	at com.sun.midp.midlet.MIDletState.createMIDlet(+29)
	at com.sun.midp.midlet.Scheduler.schedule(+52)
	at com.sun.midp.main.Main.runLocalClass(+28)
	at com.sun.midp.main.Main.main(+80)
Execution completed.

The fix turned out to be simple – delete the project, and check it out again. The new version will start with fresh metadata that works with the new plugin. Not very nice, but hardly fatal (if you’re using version control).

Incompatible Plugins

At the end of this, I discovered that the Blackberry JDE plugin does not support the very latest Galileo, so it was all a bit of a pointless exercise. Such is life in mobile development…

Portfolio: Masabi Rebrand

// December 10th, 2009 // No Comments » // Mobile, Web

My company has gone through a complete transition over the second half of 2009, moving from a general mobile application consultancy to a product-based transport ticketing vendor. This new focus merited a total branding overhaul as our old look, with its black background, was more appropriate for our legacy marketing and gaming background.

The new font and colour scheme were designed to evoke the feel of the old British Rail branding, whilst the logo resembles the front of an Intercity train:

Masabi's new logo - The Ticket Machine In Your Pocket

The new tagline – “The Ticket Machine In Your Pocket” – came out of a brainstorming session during the excellent g2i (Gateway to Investment) course we took part in, which I would highly recommend to anyone interested in grooming their company for funding, or just understanding when a startup needs funds and what to expect from investors. It’s sponsored by the London Development Authority but run by industry professionals, offering top quality advice and opportunities where all participant’s interests are aligned – far better than the fee-based ‘advice’ and ‘connections’ that are so easy to come by.

The front page embeds a video of the product in action which really explains the underlying concept nicely – the photos I took during the video shoot now form a great resource of imagery for company documents and presentations:

The site structure is intentionally simple: it features simple product tours aimed at Passengers and Train Operating Companies:

The news section manages press releases and external coverage, alongside a social media feed integrating the company’s Flickr, Twitter, YouTube and SlideShare channels:

There is also a live feed showing the next event Masabi will be presenting at driven by our Google-based events calendar, with an integrated view on the site:

The company blog was migrated over from the Blogger account of the old site; a redirect plugin was set up to ensure legacy URLs continued to work:

The site also has all the obvious bells and whistles like Google Maps integration to find the office, and directions from the nearest tube stations etc:

Masabists: NFC Roundup 2009

// October 25th, 2009 // Comments Off // Mobile

This post was originally featured on the Masabists blog.

After many trials, NFC has been on the cusp of launching in Europe for some time now. It is regularly brought up in conjunction with mobile ticketing, which has been one of the key use cases always quoted for the Felica NFC system available in Japan for some years now.

The potential is huge, and at Masabi we greatly look forward to the day we can start using it for transport ticketing – but where do we stand, in late October 2009?

UK Operator Support

O2 last did an NFC trial in 2008, and almost exactly a year ago they stated at a Mobile Monday NFC event that it had gone so well they were looking to run another trial at some point in the future. We haven’t had that trial yet.

A mobile phone feature requires operator subsidy to gain traction, because no manufacturer will foot the bill for the electronics on their own. Therefore, the number of NFC-enabled handsets currently available from each UK operator tells us a lot about where NFC lies along the feature adoption curve:

  • O2 – 0
  • Vodafone – 0
  • Orange – 0
  • T-Mobile – 0
  • Three – 0

Carphone Warehouse, the UK’s biggest indepedent high street retailer, also currently sell no NFC-enabled handsets.

NFC-Capable Handsets

GSM handsets with NFC launched by handset manufacturers:

NFC Predictions

Which year will NFC take off?

How big will the market be?

  • “by 2012, some 292 million handsets — just over 20 percent of the global mobile handset market — will ship with built in NFC” (ABI Research, Apr 2007)
  • Mobile phone based contactless payments will facilitate over $36 billion of worldwide consumer spending by 2011.” (Strategy Analytics, Oct 2006)

It’s easy to be cynical about 20% of handsets having NFC in 2012, as we start to roll into 2010 without any NFC handsets on sale – but once NFC handsets start shipping, how quickly could they be adopted?

Phone Feature Adoption Curve

In 2000 Sharp launched the world’s first camera phone, which was a bit of a novelty. By the end of 2003, 25-35% of handsets had some sort of camera on them. By 2007, M:Metrics stated that 75% of UK handsets and 51% of US handsets had cameras – 7 years after the first launch.

Arguably, cameras are a more obvious feature for a mobile handset than NFC.

The first handset commercially available outside Japan with integrated NFC was the Nokia 6131NFC, launched in 2007. At the end of 2009 we still have no operator subsidised NFC handsets, which suggests there is little chance of matching the camera adoption rate, with 25-35% at the end of next year.

From this quick comparison, we can assume that we are either still sitting before the start of the NFC adoption curve, or the NFC adoption curve is very much flatter than that of phone cameras – more like mobile TV, say.

Conclusion

When it comes, NFC has some great potential in niche markets like mobile ticketing. At Masabi, we’re greatly looking forward to it. But right now, as a company principally interested in mass-market technology, we’re not holding our breaths.

Please comment on the original post

Masabists: Hacking AdMob Stats

// September 3rd, 2009 // No Comments » // Mobile

This post was originally featured on the Masabists blog, and was voted joint top post in Carnival of the Mobilists #190.

Handset statistics are notoriously hard to come by – only the operators know what handsets are actually being used by all customers on their network, and they won’t tell. Every other purveyor of statistics has an inherent bias, which makes them more attractive for some analyses and less for others. For example:

  • GetJar make comprehensive statistics available for who is downloading applications from their site and have huge cross-operator volumes of downloads
    • …but many of these are downloaded via the web and synced through a cable, a highly unusual activity for most mobile users
    • …which puts a huge skew on the data – I’m pretty certain Amoi aren’t actually larger in the UK market than RIM’s Blackberry.
  • Bango publish a Top 20 handsets list every month or so, with a skew for their operator relationships
    • Top 20 is great but there are plenty of handsets below that which are still worth supporting
  • AdMob have some immensely detailed metrics reports, but again the operator partner skew was always very visible
    • I’m just not convinced that anything by ZTE is actually in the Top 10 most popular UK phones!
    • I’m also unconvinced that the iPod Touch is much more popular than the iPhone…

User Profiles

All of these statistics have great value, but none of these companies can actually give an overall picture fo the entire market. Each set will be skewed heavily based on the type of user attracted to the service and the operator relationships that service has. To find out the overall market picture fudge them all together and treat with care – but by profiling each site you can find out more useful information for specific needs.

AdMob, as the main provider of mobile web advertising, offer a very good view of the mobile data user, who would also be an obvious early adopter of any mobile service requiring net access, be it web-based or a networked application.

Traditionally, AdMob have just given a Top N list of device models and some aggregate manufacturer numbers, which were never enough to tell anything useful – their strong relationship with MVNO Three clearly led to some very obvious weird “popular” handsets showing up and called all of the data into question.

I had always dismissed them at this point and moved on. Fortunately, though, when you look inside the reports they publish per-operator statistics for each manufacturer – so we can actually derive some meaningful national conclusions!

Hacking The Stats

So – why hack? Don’t we have everything we need?

Sadly not – the July ‘09 report is a very nice professional PDF given graphical summaries of the manufacturer breakdown per-operator, as a series of proportions in stacked columns:

AdMob handset statistics - UK operator split

Whilst it is flattering, as a Jersey boy, to see Jersey Telecoms given equal weight to Vodafone, I have a sneaking suspicion that the entire population of Jersey is equivalent to a rounding error when counting Vodafone’s UK customer base.

What we need is to convert these into national numbers, by weighting all of the proportions by the size of the operator. The only way to do this with the public information is to screenshot the graph from the PDF at the largest size you can get it, and count the pixels for every bar – tedious, but luckily for you I’ve done it for you.

Telecoms Market Research provide some useful figures from Q1 2008 for each operator (not up to date, but close enough for these purposes):

Once we aggregate all of these weighted proportions, we end up with the following rough proportions for manufacturers among early mobile web adopters:

Handset manufacturer proportions for mobile web users in UK June 2009, derived from AdMob statistics

It won’t help everyone, but hopefully it is of some use for anyone struggling for some statistics!

Please comment on the original post.

Carnival of the Mobilists 186

// August 13th, 2009 // Comments Off // Mobile

My Orange post was featured on this week’s Carnival over at All About iPhone – check it out for the week’s best mobile writing!

Orange Customer Communications – the Ups and the Downs

// August 5th, 2009 // No Comments » // Mobile

Roaming

I just received the following SMS from Orange, which they no doubt felt was extremely helpful:

Hello. From 7 Sept making & receiving roaming calls in zones 3-7 will have a min 60 second charge then charged per second orange.co.uk/business/roamingupdates

I do like the idea of at least proactively telling your customers when you unilaterally renegotiate the fees you charge them, but as a Londoner my initial reaction was “They’re going to charge me for taking calls outside of zone 2??” This is relatively pertinent as I’m going for a dinner in Putney tomorrow…

A note for non-Londoners: the city is divided into zones for public transport purposes, and anything outside of zone 1 is pretty much not really London.  Arguably even west zone 1 doesn’t really count.

London transport zones

A note for Americans: public transport is a novel system enabling movement around a city without driving a car, leading to a much more compact urban design where every shop doesn’t need a vast car park in front of it, and walking from shop to shop is achievable and encouraged (keeps the weight down too).

You can kind of understand the concept of non-London being roaming, because there’s no need to go there most of the time, but it does seem a little cheeky as the regions are often quite pleasant in the summer and they are technically also part of the country.

Another note for foreigners: unlike most countries, the UK’s first city takes a disproportionate share of everything as the governmental, administrative and business capital of the country; it can make a claim to be the cultural capital too, though some of the other cities could try and argue that one. People outside London tend to resent it for that, and Londoners tend to ignore them because they’re not in London.

This post has meandered some way off topic, but at the start I mentioned a text message from Orange.  My point really is that sending out something like that was pretty meaningless, and actually only caused confusion.

How was my roaming billed before?  I remember before the EU got involved it used to cost me more than a quid just to pick up the phone in Estonia, and a number of telephone salesman got extremely rude responses because of this.  Apparently it ought to be cheaper now, but talk of per second billing just encourages me to say less even though actually it probably means it’ll cost less, maybe.  Fundamentally, does anyone care enough?  If you’re on a business phone you just talk, if you’re not you get the hell off the line asap. It’s nice to know that there is a mathematical function applied to come up with the cost, but if it can be changed unilaterally like this and requires counting of seconds it’s unlikely most people will bother to worry about the details.

Possibly the zones are tied to DVD region zones? At least I’d have some hope of knowing what they meant that way.

Data Bundles

On to more of a successful communication from Orange.  Yesterday they rang me up for a halfway contract review (9 months to go – I much preferred the old style 12 month contracts, but apparently to get an N96 I had to plump for 18; how they must be laughing).  Apparently, we could save over £50 a month if we got data bundles.

This makes complete sense – we have testing SIMs downloading apps all the time, and Ben and I also use data a lot – but it’s somewhat ironic as 9 months ago we actually signed up for “unlimited” data bundles.  A few months later I called to ask why we were beiong charged so much for data when we were on unlimited bundles and they denied any knowledge of such a thing, saying we could add bundles if we wanted for something like £30/month/SIM – pretty ridiculous.  They had some other prepay bundles which were slightly more expensive per Mb than the usual per Mb charge, and that was it.  We declined.

Fast forward half a year and Orange data bundles are back, and fairly cheap.  We now have them, allegedly (I’ll be checking in a few months) and will be saving money, all at Orange’s recommendation.  This is a vastly more helpful and welcome communication than the news that Putney will incur roaming charges.

App Testing

Orange also have a testing centre, where you can borrow their handsets to test your apps.  We looked into it for FrontlineSMS and found in the UK there was not one phone from the last two years.  Plenty of old phones are still in circulation – that’s why we always support them at Masabi – but plenty of new ones are too!  Why do they bother?

On the other hand, they will now test and sign any Java apps they really like for their App Store, free of charge.  That’s a huge boost, as thusfar operators have tended to view the QA and signature steps of an app store as a means of revenue generation, gouging the developers at every step. There are alternative ways to explain what they do, but it’s hard to see it any other way if you’re not an operator yourself!

Mobile Webapps – iUI Framework Extensions

// August 3rd, 2009 // 9 Comments » // Mobile, Web

As I explained in my earlier Masabists post, I’m finally able to show off some of the work I’ve been doing recently on local mobile webapps.  We’ve based our webapps on the rather excellent iUI framework, which has a great philosophy:

  • Clean, standard HTML markup;
  • Very lightweight – one CSS stylesheet and a single Javascript file;
  • Built-in AJAX support, so form values can be submitted and HTML fragment responses pasted into the document structure;
  • iPhone native-style look and feel, including slick screen to screen transitions and screen rotation support.

The screens are all embedded inside a single HTML file, which has two advantages:

  1. You get very rapid movement around the app, with no need for a reliable network connection and none of the slowdown associated with downloading every page;
  2. You can cache the app using an HTML 5 manifest, so even when the user has no network signal they can access the site.

This is great as far as it goes, but there were a number of screen types not supported.  I have added an optional extension script, following the same philosophy, to add them – this ost is just a reference point to describe what the extensions do, when discussing merging them into the framework.

Structure

The extensions are in a seperate script and CSS file, which creates the window.iui_ext object, much like the core iUI framework itself.

To work, iUI has been extended in one key way – it now fires off Javascript events to screens, specifically:

  • onFocus() is called whenever a screen is made visible;
  • onBlur() is called whenever a screen is left.

Both events are called at the point where the link is clicked and the sliding transition begins.

Adding the events gives the developer a huge amount of extra scope for controlling the webapp, which is then used to create the additional webapps without breaking away from clean markup.

Form Handling

The iUI extensions automatically add focus and blur event handlers for every form, which store all field values in a name/value store whenever a form is left and restore the values whenever a form is visited again.  These are added inside the iUI code, and once finished they will call any explicitly defined onFocus="..." / onBlur="..." attributes within the markup.

The map follows the same basic semantics as the HTML 5 sessionStore object, which I wanted to use but sadly it isn’t implemented on the iPhone yet (the latest desktop Safari seems to have it though).  The methods are exposed through the iui_ext object, for example window.iui_ext.getItem('key').

The purpose of this store is to allow the movement of values between screens, which enables a number of tricks – by declaring inputs on seperate forms (displayed as seperate screens) with the same name attribute, you can make sure they always mirror each other’s values.  If for any reason you don’t want this behaviour for some fields, you can declare an onBlur event and remove them from the store.

Option Lists

I needed a form screen which listed a number of fields which could be changes, such as railcard type in the screenshot below, and by tapping on the field the user would move to a list of all the possible options from which they could select one.  A few examples of this UI pattern from my iPod Touch Settings app are:

  • Settings > Music > Audiobook Speed (list of 3 options)
  • Settings > Video > Start Playing (list of 2 options)
  • Settings > Safari > Accept Cookies

Visually, it looks like this:

iPhone option selection UI widget

I implemented in two stages. Firstly, I generated CSS to render a radio input (with label) as a block with the tick if it is selected, using a bit of custom Safari CSS (-khtml-appearance:none;) to suppress the native style of a checkbox – which interestingly changes from relatively nice on an iPod Touch v2 to quite nasty on an iPhone 3GS.

Next up, I tried to think of a natural way to express the options in HTML, and ended up with the idea of getting a script to rewrite any select in a form which has the CSS class of ‘panel’ into a seperate linked panel.  The markup you write looks like this:

<div class="row">
 <label for="buy_railcard">Railcard</label>
 <select id="buy_railcard" name="railcard" class="panel">
  <option value="rc_none" selected>None</option>
  <option value="rc_youth">Youth</option>
  <option value="rc_family">Family</option>
  <option value="rc_senior">Senior</option>
  <option value="rc_disabled">Disabled</option>
  <option value="rc_network">Network</option>
  <option value="rc_hm">HM Services</option>
 </select>
</div>

By default, it would render like this (taken from desktop Safari, just to make my life easier):

Selects as they would render in Safari without the script

The script rewrites the above HTML on the original form like this:

<div class="row">
 <a href="#select__buy_railcard">Railcard
  <input type="hidden" name="railcard" value="rc_none"/>
  <var id="railcard-rc_none" class="_lookup rc_none">None</var>
 </a>
</div>

Points to note:

  • The original form will submit in exactly the same way to the server
    • the new hidden field within the link has the same name as the select and the value of the selected option.
  • The textual label of the selected option is copied into the var tag, which actually visually shows the selected option to the user
    • the var is also given the option value as a css class, which allows us to do the funky icons on all labels if we want (using :before generated content, in this case).

The script also creates a new form.panel screen containing the options as a radio group, like this:

<form id="select__buy_railcard" class="panel" title="Railcard">
 <fieldset class="radiogroup">
  <div class="row">
   <label class="rc_none" for="buy_railcard_option_rc_none">None
    <input id="buy_railcard_option_rc_none" type="radio" value="rc_none" name="railcard"/>
   </label>
  </div>
  <div class="row">
   <label class="rc_youth" for="buy_railcard_option_rc_youth">Youth
    <input id="buy_railcard_option_rc_youth" type="radio" value="rc_youth" name="railcard"/>
   </label>
  </div>
  <div class="row">
   <label class="rc_family" for="buy_railcard_option_rc_family">Family
    <input id="buy_railcard_option_rc_family" type="radio" value="rc_family" name="railcard"/>
   </label>
  </div>
  <div class="row">
   <label class="rc_senior" for="buy_railcard_option_rc_senior">Senior
    <input id="buy_railcard_option_rc_senior" type="radio" value="rc_senior" name="railcard"/>
   </label>
  </div>
  <div class="row">
   <label class="rc_disabled" for="buy_railcard_option_rc_disabled">Disabled
    <input id="buy_railcard_option_rc_disabled" type="radio" value="rc_disabled" name="railcard"/>
   </label>
  </div>
  <div class="row">
   <label class="rc_network" for="buy_railcard_option_rc_network">Network
    <input id="buy_railcard_option_rc_network" type="radio" value="rc_network" name="railcard"/>
   </label>
  </div>
  <div class="row">
   <label class="rc_hm" for="buy_railcard_option_rc_hm">HM Services
    <input id="buy_railcard_option_rc_hm" type="radio" value="rc_hm" name="railcard"/>
   </label>
  </div>
  </fieldset>
</form>

Date Selection

One of the greatest things in HTML 5, to me, is also one of the simplest – the input tag has now been extended to allow all sorts of new types, such as dates, telephone numbers and even colours. The idea is that browsers will then handle these specially with funky calendar drop downs etc that curretly have to be implemented in Javascript – and on mobiles, they can use a more appropriate native solution optimised for the keypad, with address book access etc.

Obviously, no mobile browser has bothered to implement these – today you’ll have to look at Opera desktop if you want to see a browser starting to do it correctly.

In the absence of a native widget, I implemented a date selector myself.  On the iPhone itself, this is implemented in a style similar to HTML drop-downs in Safari – difficult to achieve in HTML alone, and not actually that natural for selecting travel dates.  I opted to support date selection with a calendar reminiscent of theiPhone calendar app’s instead:

Date selection with iUI extension

As before, this is implemented with a standard piece of HTML that is rewritten by the script.  To add a calendar you add an input like this to your form:

<div class="row">
 <label for="buy_travelDate">Outbound Date</label>
 <input name="travelDate" id="buy_travelDate" type="date" class="date" value="1/1/2009">
</div>

The type you choose to assign can be either date or text.  If you set the input’s type to text by hand, the script will always replace it with a custom calendar.  Currently, Safari rewrites any type it doesn’t understand to text when the page loads; if and when date support is added, this will presumably cease and the script will stop handling dates for you and leave selection to the browser.  Your choice which you want!

When the form is first loaded, your markujp is rewritten like this:

<div class="row">
 <a href="#select__buy_journeytype">Journey Type
  <input type="hidden" name="journeytype" value="tt_single"/>
  <var id="journeytype-tt_single" class="_lookup tt_single">Single</var>
 </a>
</div>

There will also be a (singleton) extra screen created for the date picker like this:

<form id="_datepicker" class="panel">
 <p>
  <span id="_dpback" class="back"> </span>
  <span id="_dpmonth" class="month"/>
  <input id="_dphidden" type="hidden"/>
  <span id="_dpfwd" class="fwd"> </span>
 </p>
 <table id="_dptable" cellspacing="0" cellpadding="0" border="0">
  <colgroup>
   <col class="sun"/>
   <col class="mon"/>
   <col class="tue"/>
   <col class="wed"/>
   <col class="thu"/>
   <col class="fri"/>
   <col class="sat"/>
  </colgroup>
  <thead>
   <tr class="days">
    <th>Sun</th>
    <th>Mon</th>
    <th>Tue</th>
    <th>Wed</th>
    <th>Thu</th>
    <th>Fri</th>
    <th>Sat</th>
   </tr>
  </thead>
  <tbody>
   <tr class="wk1">
    <td> </td>
    <!-- etc -->
   </tr>
   <tr class="wk2">...</tr>
   <tr class="wk3">...</tr>
   <tr class="wk4">...</tr>
   <tr class="wk5">...</tr>
   <tr class="wk6">...</tr>
  </tbody>
 </table>
</form>

The screen is a singleton, which means it will only be created once, and reused for every date picker in your app (which saves on memory).  Month and day names are taken from arrays which could be externalised and internationalised easily if required (CSS class names on cols are hardcoded though).

Every time the date picker is selected, the script refreshes the calendar, working out the date from the hidden field on the original form and copying over the relevant details.  Table cell contents are updated with the relevant date, and onClick events set to make selections work.

There are a few options, which can be passed in using CSS classes applied to the date field:

  1. If the today class is specified, then any selection of today’s date will be stored on the form (and shown visually) as ‘Today’ instead of the date;
  2. If the future class is specified, only today and future dates are visible and selectable;
  3. If the past class is specified, only today and past dates are visible and selectable;
  4. A date pattern can be specified using the following syntax:
    • Parts of the date:
      • d for the date eg. 28
      • D for the day’s abbreviated name eg. Mon or Fri
      • m for the month’s number eg. 1 (for January)
      • M for the month’s abbreviated name eg. Jan or Dec
      • y for the year as two digits eg. 09
      • Y for the year as four digits eg. 2009
    • Other symbols:
      • _ underscore is converted to a space
      • c is converted to a comma
      • Hyphens and slashes are also allowed.
    • Examples:
      • d/m/y goes to 3/8/09
      • d-M-y goes to 3-Aug-09
      • Dc_d_M_Y goes to Mon, 3 Aug 2009

If a date format is set, then only that format can be used to specify the value of the field.

That’s basically it for my extensions – having documented them, I’ll now see if anyone wants them merged in to the main iUI framework!

Masabists: Ticketing via Local Webapps

// July 31st, 2009 // Comments Off // Mobile

This was originally posted on the Masabists blog.

We’re finally able to show off some of the work we’ve been doing recently on local mobile webapps – interactive web pages which can be saved and run even when you’re offline.

Our mobile ticket sales app is now available as a local Java app for mass market handsets, and a local webapp for Android and iPhone – offering all the same functionality, security and slick branding:

Masabi Train Ticketing local webapp on an iPhone Masabi Train Ticketing Java app running on a Nokia N96

What Is A Local Webapp?

With the latest HTML 5 and Google Gears APIs support on Android, iPhone and Palm Pre, you can provide a fast multi-screen interactive app with local storage (to store tickets you have purchased), which behaves like a native local app and is accessible even when the phone is offline. Here’s how to store the app for later use on an iPhone – reached by clicking on the ‘+’ icon in the footer:

Why Webapps?

Traditionally at Masabi we have always written local apps in Java, because they offer the best mass market user experience for the sort of ticketing and financial services we provide; it’s only with the advent of handsets with fast, HTML 5-capable browsers that we have been able to explore the webapp route. We plan to use local webapps for many of our iPhone and Android products for two core reasons:

  1. With the proliferation of new platforms causing even more fragmentation in the mobile apps space, the Safari browser used on both platforms is actually the safest way to reduce fragmentation and streamline maintenance and development;
  2. There are some big advantages to the unrestricted installation of a webapp via the web, especially if your business model is not compatible with the rules or revenue shares of the relevant App Store; it can be hard to justify to a customer the extra expense of a dedicated app when you cannot guarantee the app will ever be allowed on the store or device.

Fortunately, it is easy to take a local webapp and wrap it up as a native iPhone or Android app, so we can make all of the services available through the relevant App Stores as well if that is what the users want.

It is worth noting that at Masabi we are producing free mass market services which pay for themselves through transaction fees, so the App Store’s billing system isn’t an issue for us – your mileage may vary…

Does It Feel Like A Normal App?

Webapps can very successfully replicate the look and feel of native apps, with quick scrolling between screens, button styles and the like.
Below are screenshots of the user selecting an option from a list, and a date from the calendar:

Selecting an option from a list on the Masabi Train Ticketing local webapp on an iPhone Picking a date on the Masabi Train Ticketing local webapp on an iPhone

These clearly follow the style and usability conventions of the built-in iPhone apps. With CSS targetted to the device through our DeployME server, we reskin the same application easily to adopt Android conventions and styling as well.

Please comment on the original post.

Masabi StreetVendor mPayments app announced

// July 30th, 2009 // No Comments » // Mobile

My company, Masabi, have just announced our mPayments platform for the developing world – quite funky stuff which breaks the traditional need for operator involvement to handle the sorts of peer-to-peer payments currently transforming Africa and Asia.  You can read more about it on the release, or just listen to Ben demo and explain it all on YouTube.

It’s amazing how slowly news lags development – the app has actually been running in Sudan for some time, and is going to be deployed in other parts of the world soon (details under wraps sadly…).

Screenshot of the Masabi StreetVendor mPayment application running in Arabic - click to see more on Flickr Screenshot of the Masabi StreetVendor mPayment application running in Arabic - click to see more on Flickr

Great work from everyone involved!

Events: Global Messaging 2009 – Mobile Ticketing and Payments

// June 24th, 2009 // No Comments » // Mobile

I’m just back from presenting at the excellent Global Messaging 2009 event in Westminster, on the subject of what makes a good mobile service in the context of mobile ticketing and payments:

It covers some of our standard reference points, like mass market handset support and the need for a mobile service to address a user pain point and actually perform better than the alternatives to be used. I think this really applies to selling train tickets from the handset, something that a pure deliver-only model fails to achieve.

Sadly I fluffed the Sir Mixalot slide, slipping and double pressing the right arrow so we skipped past it.  The actual line I was supposed to say was “But – and it’s a big but – are we addressing the customer’s needs with a pure mobile ticket delivery solution?”. Which may not have made much sense to this audience anyway, so maybe it’s for the best…