<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Surfsoft Consulting Ltd</title>
	<atom:link href="http://labs.surfsoftconsulting.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://labs.surfsoftconsulting.com</link>
	<description>Java, Groovy, Grails and Android musings</description>
	<lastBuildDate>Sun, 19 May 2013 14:11:51 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>There&#8217;s no wizard framework for Android</title>
		<link>http://labs.surfsoftconsulting.com/2012/theres-no-wizard-framework-for-android/</link>
		<comments>http://labs.surfsoftconsulting.com/2012/theres-no-wizard-framework-for-android/#comments</comments>
		<pubDate>Sun, 21 Oct 2012 12:31:58 +0000</pubDate>
		<dc:creator>Phil</dc:creator>
				<category><![CDATA[Android Applications]]></category>
		<category><![CDATA[Action Bar Sherlock]]></category>
		<category><![CDATA[Fragment]]></category>
		<category><![CDATA[Pager]]></category>
		<category><![CDATA[Wizard]]></category>

		<guid isPermaLink="false">http://labs.surfsoftconsulting.com/?p=96</guid>
		<description><![CDATA[Yes, sounds surprising doesn&#8217;t it? Message Manager needs a number of wizards to ensure that the user experience for this potentially complex application is good. Android 4.1 still doesn&#8217;t deliver the goods, and neither does my other staple for Android &#8211; the excellent Action Bar Sherlock. (rolls up sleeves) Right, well, better put one together &#8230; </p><p><a class="more-link block-button" href="http://labs.surfsoftconsulting.com/2012/theres-no-wizard-framework-for-android/">Continue reading &#187;</a>]]></description>
			<content:encoded><![CDATA[<p>Yes, sounds surprising doesn&#8217;t it? Message Manager needs a number of wizards to ensure that the user experience for this potentially complex application is good. Android 4.1 still doesn&#8217;t deliver the goods, and neither does my other staple for Android &#8211; the excellent Action Bar Sherlock.</p>
<p>(rolls up sleeves)</p>
<p>Right, well, better put one together then.</p>
<p><span id="more-96"></span></p>
<p>So I&#8217;ve ended up rolling my own framework. No, it isn&#8217;t finished yet and is too intertwined with the Message Manager code &#8211; and my other framework code &#8211; to be thrust on an unsuspecting Android community. I hope to make it available by the end of the year.</p>
<p>So what do I want out of a wizard framework? I want something with a good clean lifecycle for setting up at the start of the wizard and completing it cleanly. I want a clean API within a wizard step for things like populating the view from an abstract data source, validating, and providing trigger points to do things when moving between steps.  Something that presents an uncomplicated user interface with various navigation options.</p>
<p>After some thought I started from an ActionBarSherlock sample &#8211; specifically the &#8220;Tabs and Pager&#8221; sample you&#8217;ll find in the fragments sample app. Viewing each wizard step as a tab has a number of immediate advantages:</p>
<ul>
<li>Navigation by swiping or by clicking a tab</li>
<li>Visibility of what steps are coming up next</li>
</ul>
<p>Of course its easy to add buttons to the bottom of each tab providing a third way of navigating.</p>
<p>Now in my app I&#8217;m quite happy to allow people to move between tabs in any order at all and only apply validation when they click the &#8220;finish&#8221; button. But this can be easily disabled by ignoring clicks on the tabs &#8211; or hiding them entirely.</p>
<p>One of the advantages I didn&#8217;t see coming when I started coding though was that each wizard step ends up being entirely independent of its siblings. This turns out to be fantastically useful when I have three wizards (create profile, create rule, create profile and rule) because it is trivial to re-use wizards steps from one wizard in another one.</p>
<p>Finally, implementing a wizard in this way means that it is now trivial to put together my application&#8217;s help and getting started activities.</p>
<p>On a technical level the wizard framework uses a ViewPager and FragmentPagerAdapter at the centre of the owning wizard activity. Each wizard step is implemented as a fragment which at runtime gets attached to a tab in the view pager. The wizard activity is given its steps as a simple array of wizard step fragments and uses this to set up the ViewPager. The only complication is that fragments can get housekept even while the activity is running so you have to be careful to ensure that the (potentially modified) state in a fragment is preserved in some way when moving to another step.</p>
]]></content:encoded>
			<wfw:commentRss>http://labs.surfsoftconsulting.com/2012/theres-no-wizard-framework-for-android/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Coming Soon: Message Manager</title>
		<link>http://labs.surfsoftconsulting.com/2012/coming-soon-message-manager/</link>
		<comments>http://labs.surfsoftconsulting.com/2012/coming-soon-message-manager/#comments</comments>
		<pubDate>Sat, 13 Oct 2012 11:56:57 +0000</pubDate>
		<dc:creator>Phil</dc:creator>
				<category><![CDATA[Android Applications]]></category>
		<category><![CDATA[Messaging]]></category>
		<category><![CDATA[SMS]]></category>

		<guid isPermaLink="false">http://labs.surfsoftconsulting.com/?p=88</guid>
		<description><![CDATA[Over the last few months we&#8217;ve been playing with a new application concept and are able to announce that we will soon be launching a new Android application and cloud service which we are developing under the working title of &#8220;Message Manager&#8221;. Message Manager in its early from will allow you to selectively forward SMS messages &#8230; </p><p><a class="more-link block-button" href="http://labs.surfsoftconsulting.com/2012/coming-soon-message-manager/">Continue reading &#187;</a>]]></description>
			<content:encoded><![CDATA[<p>Over the last few months we&#8217;ve been playing with a new application concept and are able to announce that we will soon be launching a new Android application and cloud service which we are developing under the working title of &#8220;Message Manager&#8221;.<span id="more-88"></span></p>
<p>Message Manager in its early from will allow you to selectively forward SMS messages (as an SMS or using email) and/or automatically respond with a canned message to the sender. You&#8217;ll be able to define which messages should be forwarded or replied to using a selection of criteria such as the sender, message text and when the message was sent (or received).</p>
<p>The application will then be built out to add full SMS client functionality that will integrate with a cloud service to allow you to use Message Manager on any Android device to read and respond to SMS messages on your phone(s) wherever they are in the world &#8211; they just need to be switched on and have data and network access.</p>
<p>We&#8217;ll be providing a web site for access from non-Android devices and our own SMS gateway to help you save money when sending text messages when you go abroad or have reached your carrier&#8217;s limit.</p>
<p>If that isn&#8217;t enough, the cloud service will act as a full backup of all your SMS messaging, so you can move your SIM card from phone to phone and not have to worry about losing important messages or ongoing conversations.</p>
<p>Message Manager will be free of charge and without adverts. Pricing for the cloud based services has not been announced but at least some of the services mentioned above will also be free.</p>
]]></content:encoded>
			<wfw:commentRss>http://labs.surfsoftconsulting.com/2012/coming-soon-message-manager/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Audio Clock &#8211; An Update</title>
		<link>http://labs.surfsoftconsulting.com/2012/audio-clock-an-update/</link>
		<comments>http://labs.surfsoftconsulting.com/2012/audio-clock-an-update/#comments</comments>
		<pubDate>Sat, 13 Oct 2012 11:43:04 +0000</pubDate>
		<dc:creator>Phil</dc:creator>
				<category><![CDATA[Android Applications]]></category>
		<category><![CDATA[Application Update]]></category>

		<guid isPermaLink="false">http://labs.surfsoftconsulting.com/?p=86</guid>
		<description><![CDATA[In August and September we had some issues with the newer multicore phones running Android 4.0 and up,  responding with a series of five point releases (3.4.1 through 3.4.5) which brings us to the point where Audio Clock is now behaving itself again on all platforms. Going forward we have stopped adding new features to Audio &#8230; </p><p><a class="more-link block-button" href="http://labs.surfsoftconsulting.com/2012/audio-clock-an-update/">Continue reading &#187;</a>]]></description>
			<content:encoded><![CDATA[<p>In August and September we had some issues with the newer multicore phones running Android 4.0 and up,  responding with a series of five point releases (3.4.1 through 3.4.5) which brings us to the point where Audio Clock is now behaving itself again on all platforms.<span id="more-86"></span></p>
<p>Going forward we have stopped adding new features to Audio Clock for Gingerbread (Android 2.3) but will still fix any problems that are reported to us; new features will continue to appear over time if you have a device running Ice Cream Sandwich (Android 4.0) or Jellybean (Android 4.1).</p>
<p>Or next planned big change to Audio Clock is to refresh the user interface so that it looks, and works, as an Android 4.0 application should, and we aim to get this into the Play Store before the end of the year. If that sounds like a lot of time for a small amount of work &#8211; you&#8217;ll understand why if you read some of our other announcements.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://labs.surfsoftconsulting.com/2012/audio-clock-an-update/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Groovy and Grails User Group Meeting &#8211; July 16th</title>
		<link>http://labs.surfsoftconsulting.com/2012/groovy-and-grails-user-group-meeting-july-16th/</link>
		<comments>http://labs.surfsoftconsulting.com/2012/groovy-and-grails-user-group-meeting-july-16th/#comments</comments>
		<pubDate>Tue, 17 Jul 2012 12:26:19 +0000</pubDate>
		<dc:creator>Phil</dc:creator>
				<category><![CDATA[Grails]]></category>
		<category><![CDATA[@StaticCompile]]></category>
		<category><![CDATA[@TypeChecked]]></category>
		<category><![CDATA[Comet]]></category>
		<category><![CDATA[Even Bus]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Web Sockets]]></category>

		<guid isPermaLink="false">http://labs.surfsoftconsulting.com/?p=117</guid>
		<description><![CDATA[Yesterday I was at the monthly meeting of the Groovy and Grails User Group at Skills Matter to hear about the recent release of Groovy 2 and a standard event bus for Grails applications. The evening was split into two sessions &#8211; the first on Groovy 2 and the second on a new Grails event bus. First &#8230; </p><p><a class="more-link block-button" href="http://labs.surfsoftconsulting.com/2012/groovy-and-grails-user-group-meeting-july-16th/">Continue reading &#187;</a>]]></description>
			<content:encoded><![CDATA[<p>Yesterday I was at the monthly meeting of the <a title="London Groovy and Grails User Group" href="http://skillsmatter.com/event-details/home/london-groovy-grails-user-group" target="_blank">Groovy and Grails User Group</a> at Skills Matter to hear about the recent release of Groovy 2 and a standard event bus for Grails applications. The evening was split into two sessions &#8211; the first on Groovy 2 and the second on a new Grails event bus.<span id="more-117"></span></p>
<p><strong>First up was <a title="Peter Ledbrook on Google+" href="https://plus.google.com/114107389603135307094" target="_blank">Peter Ledbrook</a></strong> discussing Groovy 2. There are a number of interesting features but the two that stand out for me are static type checking and static compilation.</p>
<p>Static type checking gives you real-time syntax checking in your favourite IDE (and by extrapolation, compilation errors when you build). There is a trade-off &#8211; you lose most of Groovy’s dynamic features &#8211; but the new @TypeChecked annotation allows you to selectively enable or disable type checking at the class or method level. So its now possible to enable type checking by default on your code, and then turn it off where dynamic language features are being used.</p>
<p>Static Compilation allows you to annotate code to be compiled down to bytecode, thereby removing Groovy&#8217;s runtime overheads and improving performance. Just like type checking you use an annotation, @CompileStatic, and can use it for individual methods or whole classes. Clearly this is more likely to be used selectively where performance is more important than being able to use the dynamic features of Groovy &#8211; which are lost inside the code marked @StaticCompile.</p>
<p>You can find out more about the new features of Groovy 2 from Guillaume Laforge’s <a title="What's New in Groovy 2" href="http://www.infoq.com/articles/new-groovy-20" target="_blank">article</a> at infoq.</p>
<p><strong>Second up was <a title="Stéphane Maldini on Google+" href="https://plus.google.com/109208126063579871510" target="_blank">Stéphane Maldini</a></strong> discussing a new event bus plugin he’s beed working on. This was my main reason for attending this particular user group meeting as it promised easy integration between Grails applications as well as providing functionality that flows all the way through into the browser. We weren’t disappointed.</p>
<p>After spending some time explaining the messaging models supported &#8211; point to point, publish/subscribe as well as content-based routing (allowing you to target recipients based on content) Stéphane provided some code samples before giving a demonstration showing an interaction in one browser window showing up seamlessly in two other browsers. It was all very impressive and the Javascript interface in particular looked nice and clean. THe Javascript component utilises web sockets by default but gracefully falls back to Comet if the browser does not support them.</p>
<p>At the moment event bus is still a milestone release (1.0.0M1) with Milestone 2 due in the week ending July 20th and Milestone 3 shortly after. Stéphane is aiming to release version 1.0.0. alongside Grails 2.2 &#8211; which also happens to be the first version of Grails to adopt Groovy 2.0.</p>
<p>Event bus is open source and <a href="https://github.com/grailsrocks/grails-platform-core" target="_blank">available on github</a>, as is the <a href=" http://grails.org/plugin/events-push" target="_blank">Grails client-side plugin</a>. Sample code <a href="https://github.com/smaldini/grailsTodos" target="_blank">is also available</a>.</p>
<p>Skills Matter provide <a href="http://skillsmatter.com/podcast/home/standard-event-bus-for-grails-applications" target="_blank">a video podcast of the evening</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://labs.surfsoftconsulting.com/2012/groovy-and-grails-user-group-meeting-july-16th/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Galaxy Nexus ICS 4.0.4 &#8211; Regaining su privileges</title>
		<link>http://labs.surfsoftconsulting.com/2012/galaxy-nexus-ics-4-0-4-regaining-su-privileges/</link>
		<comments>http://labs.surfsoftconsulting.com/2012/galaxy-nexus-ics-4-0-4-regaining-su-privileges/#comments</comments>
		<pubDate>Sun, 20 May 2012 10:49:16 +0000</pubDate>
		<dc:creator>Phil</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[adb]]></category>
		<category><![CDATA[clockworkmod]]></category>
		<category><![CDATA[fastboot]]></category>
		<category><![CDATA[ICS]]></category>
		<category><![CDATA[root]]></category>
		<category><![CDATA[superuser]]></category>

		<guid isPermaLink="false">http://labs.surfsoftconsulting.com/?p=120</guid>
		<description><![CDATA[About ten days ago I finally received the OTA update for my Galaxy Nexus that would take it from 4.0.2 to 4.0.4. Of course it didn&#8217;t show up at a convenient time despite my numerous checkin requests over the previous two weeks, I was on the motorway, using Google&#8217;s Navigation app. Ten minutes later however &#8230; </p><p><a class="more-link block-button" href="http://labs.surfsoftconsulting.com/2012/galaxy-nexus-ics-4-0-4-regaining-su-privileges/">Continue reading &#187;</a>]]></description>
			<content:encoded><![CDATA[<p>About ten days ago I finally received the OTA update for my Galaxy Nexus that would take it from 4.0.2 to 4.0.4. Of course it didn&#8217;t show up at a convenient time despite my numerous checkin requests over the previous two weeks, I was on the motorway, using Google&#8217;s Navigation app. Ten minutes later however I was in a stationary traffic jam so I elected to apply the update. All went well and the navigation app was back and running inside ten minutes.</p>
<p><span id="more-120"></span></p>
<p>However today I realised that in the process I&#8217;d lost my root access. I&#8217;d downloaded a leaked copy of the &#8220;S Voice&#8221; application that is installed on the new S3 &#8211; apparently it works very well on the Galaxy Nexus &#8211; but found I couldn&#8217;t drop the file in the system applications folder. A few tests showed that (a) su was out of date and (b) although the binary was still in place, I wasn&#8217;t getting root access. So, here are the steps I took to regain root:</p>
<div class="warning_block message-block"><p class="printonly"><strong>Warning!</strong></p>These are the steps I performed, having already rooted my phone previously. Your mileage may differ!</div>
<ul>
<li>Download the latest Clockwork Mod recovery image (visit <a title="clockworkmod rom manager and recovery images" href="http://www.clockworkmod.com/rommanager" target="_blank">this page</a>)</li>
<li>Download the latest copy of su from Superuser (visit <a title="superuser" href="http://androidsu.com/superuser/" target="_blank">this page</a>)</li>
<li>Turn off the phone, then turn in on in bootloader mode by holding down both volume buttons and then pressing the power button.</li>
<li>Connect the phone to your computer with a USB cable.</li>
<li>Fire up Clockworkmod Recovery:</li>
</ul>
<pre>fastboot boot recovery-clockwork-5.5.0.2-maguro.img</pre>
<ul>
<li>Clockwork Recovery starts. Scroll down to &#8216;mounts and storage&#8217; and click the power button.</li>
<li>Scroll down to the line &#8216;mount system&#8217; (if it isn&#8217;t at the top of the list) and click the power button. /system is now mounted as a read/write volume.</li>
<li>Upload the new copy of su I downloaded earlier using the following shell command:</li>
</ul>
<pre>adb push su /system/bin</pre>
<ul>
<li>Set the file permissions using the following shell command:</li>
</ul>
<pre>adb shell chmod 06755 /system/bin/su</pre>
<ul>
<li>Reboot the phone:</li>
</ul>
<pre>adb reboot</pre>
<p>Hey Presto! Root access returned.</p>
<div class="warning_block message-block"><p class="printonly"><strong>Warning!</strong></p>Disclaimer: If you&#8217;re not prepared to face the prospect of completely bricking your phone, don&#8217;t root it. I am not responsible for any problems you may encounter or create for yourself if following the steps above!</div>
<p>In the next day or two I&#8217;ll post some notes on how I installed S Voice. For those who are interested, you can find a link to the S Voice application posted at <a title="How to install Samsung's S Voice on an Ice Cream Sandwich phone" href="https://www.google.com/url?q=http://forum.xda-developers.com/showthread.php%3Fp%3D26300180&amp;sa=U&amp;ei=bsq4T6aQE8yD-wb1xrirCg&amp;ved=0CAUQFjAA&amp;client=internal-uds-cse&amp;usg=AFQjCNG9OSUahTbeencIRJa7hgE-mL3JRg" target="_blank">xda developers</a>. You&#8217;ll need root first.</p>
]]></content:encoded>
			<wfw:commentRss>http://labs.surfsoftconsulting.com/2012/galaxy-nexus-ics-4-0-4-regaining-su-privileges/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google I/O 2012 Verdict: Must Do Better</title>
		<link>http://labs.surfsoftconsulting.com/2012/google-io-2012-verdict-must-do-better/</link>
		<comments>http://labs.surfsoftconsulting.com/2012/google-io-2012-verdict-must-do-better/#comments</comments>
		<pubDate>Tue, 27 Mar 2012 18:05:37 +0000</pubDate>
		<dc:creator>Phil</dc:creator>
				<category><![CDATA[Google]]></category>
		<category><![CDATA[IO12]]></category>

		<guid isPermaLink="false">http://labs.surfsoftconsulting.com/?p=123</guid>
		<description><![CDATA[Last year&#8217;s Google I/O conference sold out in under 60 minutes. This year, with many more tickets available, it sold out in just 28 minutes (according to my browser) or 20 (if you read Vic Gundotra&#8217;s Google+ post here). Google could have sold every ticket at least three times over last year. Or, if you just &#8230; </p><p><a class="more-link block-button" href="http://labs.surfsoftconsulting.com/2012/google-io-2012-verdict-must-do-better/">Continue reading &#187;</a>]]></description>
			<content:encoded><![CDATA[<p>Last year&#8217;s Google I/O conference sold out in under 60 minutes. This year, with many more tickets available, it sold out in just 28 minutes (according to my browser) or 20 (if you read Vic Gundotra&#8217;s Google+ post <a title="Vic Gondotra on Google I/O 2012" href="https://plus.google.com/107117483540235115863/posts/iyc4arLjidR" target="_blank">here</a>). Google could have sold every ticket at least three times over last year. Or, if you just count the tickets not sold to previous attendees &#8211; at least ten times over.</p>
<p>In any event many people were not going to get a ticket for this year. I was fortunate enough to go last year (thanks to eBay) and after reading this year&#8217;s registration FAQ was hopeful that demand from scalpers would be damped down by the price rise and non-transferability of tickets making re-selling a big gamble. Add in the fact that this year there was no opportunity for previous attendees to pre-register and you have 5000 tickets available instead of the 1500 or so. What&#8217;s to go wrong?</p>
<p><span id="more-123"></span></p>
<p>Well first there was a hint of a &#8216;coding competition&#8217;. This didn&#8217;t come to fruition, all you needed was to be able to code your way through creating a Google+ account and a Google Wallet account, and then sit pressing F5 (or Command-R) until registration opened.</p>
<p>Next there was the concept of &#8216;first come, first served&#8217;. This is a silly statement to make as we&#8217;ve already established that demand far outstrips supply. Registration opens and immediately there were, apparently, over 6000 registration attempts. Per second. So first come, first served has no meaning in this context. All it does is allow Google to say that they had no favourites. However I&#8217;m already reading posts that say the &#8216;searching for tickets&#8217; page simply polled the server periodically. This could still be a first come first served system, but from the outside it doesn&#8217;t look that way.</p>
<p>The fact that my browser didn&#8217;t start reporting the conference as sold out for 28 minutes indicates what? Simply that the system in place was, just like last year, woefully under-sized for its task &#8211; it just didn&#8217;t crash horribly like last year.</p>
<p>So is that the end to the PR own goal that Google I/O registration has turned in to? No. The first eBay listing was up just 39 minutes after registration opened with a general admission ticket up for sale at the bargain price of $2000 and as I write now there are two sold tickets and one cancelled sale.</p>
<p>I&#8217;m sure Google won&#8217;t be reading this blog post any time soon but I have some simple and easy to implement suggestions that, while they won&#8217;t cure the demand for Google I/O, can be used to minimise the bad press.</p>
<p>1. <strong>Ask people to pre-register. </strong>Have a pre-registration window and once the closing date has gone, that&#8217;s it. Only those that have pre-registered can then apply for a ticket. You now know the level of interest and can think about how you are going to make tickets available. Or taking up an option on more space.</p>
<p>2. <strong>No transfers allowed. Period. </strong>If you can&#8217;t transfer your ticket, you can&#8217;t sell it. Allow people to return their ticket for a full refund (feel free to sting them for a small admin charge if you like).</p>
<p>3. <strong>Run a ballot for returned tickets. </strong>This is where pre-registration comes in again. When a ticket is returned, draw a name from those remaining. Give them the ticket.</p>
<p>4. <strong>Stop giving stuff away. </strong>Even if you stop the scalpers you won&#8217;t stop people registering who have no interest in developing on the back of your products, because of the free stuff you hand out. Make it clear at registration: no freebies to be had at this conference. Instead, allow all registered attendees and speakers to purchase one item that will be useful in their job at a reduced cost.</p>
<p>Having been to Google I/O once I found it to be a fantastic experience and one I will never forget. After this year, though, I also expect never to go to again, because the odds of getting a ticket are use too long. At least the £2500 saved by not going (plus another week&#8217;s fees from my current client) allows me to look at purchasing more development hardware and take a few days off working on somebody else&#8217;s software to work on my own.</p>
<p>I&#8217;m not asking Google to change their core ticket sales process. With demand far exceeding supply, every system is as bad as the next and all Google can do is to reduce demand or increase supply. I won&#8217;t be watching live streamed presentations &#8211; I can watch them at my leisure on YouTube &#8211; but I am thinking about organising an Android hackathon with a group of friends.</p>
]]></content:encoded>
			<wfw:commentRss>http://labs.surfsoftconsulting.com/2012/google-io-2012-verdict-must-do-better/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dear Samsung&#8230; you&#8217;ll never be Apple</title>
		<link>http://labs.surfsoftconsulting.com/2012/dear-samsung-youll-never-be-apple/</link>
		<comments>http://labs.surfsoftconsulting.com/2012/dear-samsung-youll-never-be-apple/#comments</comments>
		<pubDate>Sat, 24 Mar 2012 19:36:32 +0000</pubDate>
		<dc:creator>Phil</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[Galaxy Nexus]]></category>
		<category><![CDATA[Galaxy Tab]]></category>
		<category><![CDATA[Samsung]]></category>

		<guid isPermaLink="false">http://labs.surfsoftconsulting.com/?p=125</guid>
		<description><![CDATA[Samsung is a company that has successfully renewed itself in recent years. If I want a good quality and feature packed TV I look at Samsung, not Sony. And If I want a good looking, up-to-date Android device then they have some fantastic hardware that performs well and looks good. At Google I/O I got &#8230; </p><p><a class="more-link block-button" href="http://labs.surfsoftconsulting.com/2012/dear-samsung-youll-never-be-apple/">Continue reading &#187;</a>]]></description>
			<content:encoded><![CDATA[<p>Samsung is a company that has successfully renewed itself in recent years. If I want a good quality and feature packed TV I look at Samsung, not Sony. And If I want a good looking, up-to-date Android device then they have some fantastic hardware that performs well and looks good.</p>
<p>At Google I/O I got my hands on the Galaxy Tab, which is about to receive an Ice Cream Sandwich upgrade. This was when I first started to realise that Samsung have become, compared to the rest of the large tech companies, more Apple-like. They have a distinct brand name for their devices &#8211; Galaxy &#8211; and their hardware feels good and looks good. I&#8217;ve had my Tab for nearly a year now and when I&#8217;m not developing software it tends to be my go-to device for email, web browsing and media consumption.<span id="more-125"></span></p>
<p>Unfortunately Samsung dropped the ball a bit on the Galaxy Tab. It&#8217;s never good to hand out a new device to 5,000 tech-heads because if there is a flaw &#8211; they will find it. The Galaxy Tab&#8217;s main flaw was its inability to transfer files over the USB cable using the company&#8217;s Kies software &#8211; or indeed any other software. The other major irritation was that you could only use their own mains charger to recharge it. Finally there was the &#8216;not Apple&#8217; dock connection which has the same dimensions as the iPod/iPhone dock (but with different keying). So you needed to carry around an extra charger and an extra cable.</p>
<p>At the start of December last year I finally upgraded my two year old Nexus One, buying the Samsung Galaxy Nexus as a replacement. The longer I have this phone, the more I like it. Yes it is a little on the large side for some, but the user experience is fantastic and the phone feels solid and very well put together.</p>
<p>However Samsung have yet again dropped the ball, hampering it with the same MTP transfer protocol that the Galaxy Tab has got, only making a 16Gb model available in Europe, and refusing to give it a microSD card slot. Amusingly this confuses some web sites that will push large microSD cards as &#8216;extras also purchased&#8217; alongside the Galaxy Nexus (I&#8217;m looking at You, Amazon).</p>
<p>However the worst part for me is that Samsung failed to release any accessories for the phone when they made the phone available. No cases. No USB adaptors. No batteries. No car cradle.</p>
<p>The cradle particularly annoys me. Now first I should explain that there is a cradle available, but only in the USA and for the Verizon version of the phone which is a slightly different shape. It won&#8217;t take the GSM version of the phone, so Samsung are losing sales of their cradle across all of Europe and beyond. I&#8217;ve been using my phone as my satnav since the day Google released Navigation and it works really well. But at the moment I&#8217;m driving up to 400 miles a week and I can&#8217;t put my satnav in my line of sight when I&#8217;m driving. That&#8217;s right. Here we are near the end of March (16 weeks after launch), with a phone that was released in mid-November, and still no car cradle. I ordered it from Amazon in mid-December when the shipping date was January 2nd. The shipping date for my order is currently shown as Feb 17th &#8211; April 13th. The battery I ordered at the same time showed up in the middle of February, just two months after it was ordered.</p>
<p>Samsung probably won&#8217;t be able to attain the kudos that still comes with an Apple product (even as Apple starts to show signs of losing their famous attention to the whole experience) but they could, with application, gain a strong reputation for their products. But only if they release their products when everything is ready. And the cloud services they are rumoured to be building? Please, Samsung. You really aren&#8217;t Apple. If you want loyal customers then release good hardware with high quality software &#8211; and accessories available from day one. And keep upgrading the software on your phones. Don&#8217;t expect any loyalty if you leave us out in the cold on accessories or software updates.</p>
]]></content:encoded>
			<wfw:commentRss>http://labs.surfsoftconsulting.com/2012/dear-samsung-youll-never-be-apple/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Joy of JSF</title>
		<link>http://labs.surfsoftconsulting.com/2012/the-joy-of-jsf/</link>
		<comments>http://labs.surfsoftconsulting.com/2012/the-joy-of-jsf/#comments</comments>
		<pubDate>Sat, 04 Feb 2012 12:03:40 +0000</pubDate>
		<dc:creator>Phil</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[F2]]></category>
		<category><![CDATA[JQuery]]></category>
		<category><![CDATA[JSF]]></category>

		<guid isPermaLink="false">http://labs.surfsoftconsulting.com/?p=127</guid>
		<description><![CDATA[Android has been taking a back seat recently (although that is about to change) as the new Formula One season looms and I&#8217;ve been comprehensively overhauling the fantasy game web site I&#8217;ve been running for over ten years, fantasy-f1.net. Last year I spent three months removing the Struts MVC layer, restructuring the underlying code and then &#8230; </p><p><a class="more-link block-button" href="http://labs.surfsoftconsulting.com/2012/the-joy-of-jsf/">Continue reading &#187;</a>]]></description>
			<content:encoded><![CDATA[<p>Android has been taking a back seat recently (although that is about to change) as the new Formula One season looms and I&#8217;ve been comprehensively overhauling the fantasy game web site I&#8217;ve been running for over ten years, <a title="Fantasy-F1.Net" href="http://www.fantasy-f1.net" target="_blank">fantasy-f1.net</a>.</p>
<p>Last year I spent three months removing the Struts MVC layer, restructuring the underlying code and then implementing a new JSF 1.2 user interface. Once you&#8217;ve got used to the quirks of the JSF lifecycle its a relatively frictionless way to create well-structured and component-based web sites. There&#8217;s no need to write tag libraries any more &#8211; just develop your component in situ and then extract it into its own XHTML fragment and &#8211; hey presto &#8211; you have a re-usable component.</p>
<p><span id="more-127"></span></p>
<p>Last year&#8217;s effort was very plain, being a bare minimum effort to produce a working web site. This year I threw away all the HTML from last year and wrote a completely fresh user interface. The experience was very rewarding &#8211; the site was developed rapidly and with little pain &#8211; and backed up my opinion of JSF as a rapid way of creating or re-skinning web sites.</p>
<p>Working for the last nine months on a high-profile broadcast media web site has also had the beneficial effect of reinforcing and extending my CSS skills, making the process of creating a consistent layout and colour scheme much quicker. Having used a few RichFaces components last year I&#8217;m now also writing my own rich client-side functionality using JQuery &#8211; RichFaces is not a good fit for this kind of site.</p>
<p>So with a newly skinned web site I&#8217;m hoping it will have its best year yet in terms of the number of people who use it and how much they use it. Last year the site had 2.9 million page hits over the F1 season, this year I&#8217;m hoping to hit 5 million page hits and to pick up an extra 2000-3000 users.</p>
<p>Having nearly (but not quite) reached the end of this work the next step is to set up my new hosting environment and put out the next release of Audio Clock, before starting work on the next Android application on my list. Watch this space&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://labs.surfsoftconsulting.com/2012/the-joy-of-jsf/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Social Apps on Android</title>
		<link>http://labs.surfsoftconsulting.com/2011/social-apps-on-android/</link>
		<comments>http://labs.surfsoftconsulting.com/2011/social-apps-on-android/#comments</comments>
		<pubDate>Wed, 14 Dec 2011 09:10:38 +0000</pubDate>
		<dc:creator>Phil</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Marketplace]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Social]]></category>

		<guid isPermaLink="false">http://labs.surfsoftconsulting.com/?p=129</guid>
		<description><![CDATA[At this year&#8217;s Devoxx, Google&#8217;s Tim Bray gave a thought-provoking keynote which covered several areas but what stood out for me were his comments around writing applications for Android. In summary his message was &#8220;give software away and sell a service&#8221; and &#8220;make it social&#8221;. Giving software away and selling a service is a whole &#8230; </p><p><a class="more-link block-button" href="http://labs.surfsoftconsulting.com/2011/social-apps-on-android/">Continue reading &#187;</a>]]></description>
			<content:encoded><![CDATA[<p>At this year&#8217;s Devoxx, Google&#8217;s Tim Bray gave a thought-provoking keynote which covered several areas but what stood out for me were his comments around writing applications for Android. In summary his message was &#8220;give software away and sell a service&#8221; and &#8220;make it social&#8221;.</p>
<p>Giving software away and selling a service is a whole other discussion which I intend to address separately. With regards to making it social, this is fine provided that there is a significant social angle to your application.<span id="more-129"></span></p>
<p>Anything we do that involves a social element &#8211; playing sport, going out to the theatre or cinema, even attending an evening class &#8211; these are all areas where applications can justifiably build in a social element beyond the now-standard &#8220;share via&#8221; context menu. A fantasy football application that makes it easy to share your team with friends, or a study helper application that lets you interact directly with others on your course through existing social networks. Invariably this means giving the application access to your address book, which is fine provided that the benefit to doing so outweighs whatever risks you perceive.</p>
<p>I am very cautious when installing and updating software: what privileges are required by the application, how sensitive are they, are they central to the application&#8217;s purpose? Some cases in point:</p>
<p><a href="https://market.android.com/details?id=com.google.android.apps.docs" target="_blank">Google Docs</a> requires read access to my contacts. Now my sporadic use of Docs doesn&#8217;t really benefit from integration with my contacts list, but as the app publisher is Google, I don&#8217;t worry unduly about it. Likewise the <a href="https://market.android.com/details?id=com.paypal.android.p2pmobile" target="_blank">PayPal</a> application. As a payment processor, PayPal must maintain a high degree of trust with its users, so the fact that it requires access to my contacts does not worry me from a data security angle. <a href="https://market.android.com/details?id=com.fede.launcher" target="_blank">LauncherPro</a> is a whole new launcher application which by definition requires access to almost everything you can think of. But as a widely installed application it has built up a level of trust with its users, and this in turn allows me to trust it.</p>
<p>Moving on I have a couple of apps where I have decided that the benefits of the apps outweigh the fact that they require access to my contacts - <a href="https://market.android.com/details?id=com.anydo" target="_blank">Any.DO</a> and <a href="https://market.android.com/details?id=com.threebanana.notes" target="_blank">Catch</a> - both note taking and (potentially) collaboration tools. I use them almost exclusively as personal to-do lists and so far they have done nothing to violate the trust I have placed in them.</p>
<div>However I am starting to see applications tagged as &#8216;social&#8217; where their core function is anything but.</div>
<p>Exhibit &#8216;A&#8217; is RingDroid. Having used <a href="https://market.android.com/details?id=com.ringdroid" target="_blank">RingDroid</a> on my Nexus One I attempted to install it onto my Galaxy Nexus. It wasn&#8217;t available (as open source I expect an update will appear eventually), but <a href="https://market.android.com/details?id=com.ringdroid.social" target="_blank">Ringdroid (Social Edition)</a> is. And it requires not just read access to my contacts, but write access too. The primary purpose of Ringdroid is to let you extract part of an audio file and convert it into a ringtone for your phone. Social networking is not a core feature of this &#8211; period. Ringdroid (Social Edition) will not be making an appearance on my phone &#8211; ever.</p>
<p>Exhibit &#8216;B&#8217; is <a href="https://market.android.com/details?id=com.google.zxing.client.android" target="_blank">Barcode Scanner</a> which not only requires read and write access to my contacts, but also access to my browser history. I&#8217;m scanning a barcode and my primary purpose is to look up prices and reviews. This does not need access to my address book or browser history.</p>
<p>Android allows us to develop separately installable components with their own permissions, so these edge cases can still be made available &#8211; but as an option, rather than as part of the core download. I will continue to refuse to install any application requiring address book access where that access is not core to the application&#8217;s purpose.</p>
]]></content:encoded>
			<wfw:commentRss>http://labs.surfsoftconsulting.com/2011/social-apps-on-android/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android, Grails and Heroku</title>
		<link>http://labs.surfsoftconsulting.com/2011/android-grails-and-heroku/</link>
		<comments>http://labs.surfsoftconsulting.com/2011/android-grails-and-heroku/#comments</comments>
		<pubDate>Thu, 22 Sep 2011 19:36:26 +0000</pubDate>
		<dc:creator>Phil</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[Cloud]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[Heroku]]></category>
		<category><![CDATA[maven]]></category>

		<guid isPermaLink="false">http://labs.surfsoftconsulting.com/?p=131</guid>
		<description><![CDATA[Having published a first Android application Audio Clock in the Android Market my attention has turned to developing something new. Audio Clock was simple but this new application is on a whole other scale. Audio Clock had a minimal UI &#8211; in fact just some configuration views and a notification bar entry &#8211; and ran in the &#8230; </p><p><a class="more-link block-button" href="http://labs.surfsoftconsulting.com/2011/android-grails-and-heroku/">Continue reading &#187;</a>]]></description>
			<content:encoded><![CDATA[<p>Having published a first Android application <a title="Audio Clock - Android Market" href="http://market.android.com/details?id=labs.surfsoftconsulting.audioclock" target="_blank">Audio Clock</a> in the Android Market my attention has turned to developing something new. Audio Clock was simple but this new application is on a whole other scale.</p>
<p>Audio Clock had a minimal UI &#8211; in fact just some configuration views and a notification bar entry &#8211; and ran in the background, waking every 15 minutes to chime. It has no web component, no remote connections. In other words it was kept almost as simple as it was possible to be whilst till providing some useful purpose.</p>
<p>The current application, which I should be able to start testing in the wild with some willing victims within a week is completely different. It will have a relatively complex UI. It will use more hardware features. It will require an internet connection and I will have to write a server component.<span id="more-131"></span></p>
<p>Having spent the last four months working on Groovy and Grails applications it was only natural that I should write the server using the same technology. After all, Groovy and Grails now is everything Java and the JEE web tier should have been a couple of years ago.</p>
<p>Where to host it though? I&#8217;d been considering Google App Engine &#8211; it has good Android integration including push notifications, but my attempts to get something going were patchy and then Google&#8217;s new price list came through. I considered self-hosting to start with, but my Virgin ADSL connection is fast when it works, but is too intermittent to be trusted.</p>
<p>Around that time a colleague at work introduced me to <a title="Heroku - Cloud Application Platform" href="http://www.heroku.com/" target="_blank">Heroku.com</a>, a cloud application platform that started out supporting Ruby but has recently started supporting JVM based languages as well. Some further leg work then led me to <a title="Grails on Heroku" href="http://fbflex.wordpress.com/2011/08/30/grails-on-heroku" target="_blank">this post from Tomás Lin</a> which took me from zero to a deployed Grails application in under 30 minutes using Maven and Git. Fantastic!</p>
<p>So now I&#8217;m powering ahead with an embryonic server that can talk to my fast-developing Android application. With luck and a following wind I&#8217;ll have end-to-end communications implemented in a couple more evenings work.</p>
<p>By the way &#8211; Audio Clock is ticking along nicely (if you&#8217;ll excuse the pun) at one sale a day. No marketing, no seed purchases or reviews. Just consistent sales and a list of enhancements I&#8217;ll be adding over time.</p>
]]></content:encoded>
			<wfw:commentRss>http://labs.surfsoftconsulting.com/2011/android-grails-and-heroku/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
