<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CkAESX86cSp7ImA9WhRUFkQ.&quot;"><id>tag:blogger.com,1999:blog-10735231</id><updated>2012-01-27T18:58:28.119Z</updated><category term="mobile" /><category term="pictures" /><category term="calendar" /><category term="adl" /><category term="subsea" /><category term="finance" /><category term="news" /><category term="China" /><category term="basketball" /><category term="gadgets" /><category term="books" /><category term="pr0n" /><category term="deepdive" /><category term="predictions" /><category term="UI" /><category term="custom search engines" /><category term="HDR" /><category term="gdrive" /><category term="analytics" /><category term="coop" /><category term="virtual world" /><category term="phone" /><category term="spreadsheets" /><category term="picasa" /><category term="google mashup editor" /><category term="authors" /><category term="Australia" /><category term="second life" /><category term="travel" /><category term="job" /><category term="iphone" /><category term="spring" /><category term="emea" /><category term="apps" /><category term="android market" /><category term="google television" /><category term="t-mobile" /><category term="professional android application development" /><category term="petrol" /><category term="Honeycomb" /><category term="developer challenge" /><category term="mwc" /><category term="developer" /><category term="tv" /><category term="critisism" /><category term="webdev" /><category term="mashup" /><category term="blogs" /><category term="google phone" /><category term="facebook" /><category term="business" /><category term="android developer lab" /><category term="google maps" /><category term="fragments" /><category term="google developer day" /><category term="netbooks" /><category term="World Cup" /><category term="google office" /><category term="india" /><category term="open social" /><category term="patents" /><category term="io2011" /><category term="protips" /><category term="android" /><category term="tablets" /><category term="GAfyD" /><category term="offshore" /><category term="market" /><category term="terrain" /><category term="google homepage" /><category term="West Indies" /><category term="transit" /><category term="google" /><category term="hostility" /><category term="mapplet" /><category term="javascript" /><category term="cricket" /><category term="apple" /><category term="cupcake" /><category term="subscribed links" /><category term="google talk" /><category term="piracy" /><category term="advertising" /><category term="social" /><category term="japan." /><category term="gdd" /><category term="igoogle" /><category term="ebook" /><category term="law suit" /><category term="earthquake" /><category term="sensationalism" /><category term="amazon" /><category term="animation" /><category term="g1" /><category term="shameless bragging" /><category term="code" /><category term="google os" /><category term="Google I/O" /><category term="pipes" /><category term="Android App Surgery" /><category term="Yahoo" /><category term="farm" /><category term="google calendar" /><category term="Perth" /><category term="timesheets" /><category term="charts" /><category term="docs" /><category term="geocoding" /><category term="picasaweb" /><category term="photography" /><category term="programming" /><category term="Kenya" /><category term="voip" /><category term="oil and gas" /><category term="google spreadsheet" /><category term="API" /><category term="television" /><category term="publishing" /><category term="kindle" /><category term="google groups" /><category term="gphone" /><category term="meta" /><category term="wikipedia" /><category term="London Marathon" /><category term="blogger" /><category term="google earth" /><category term="ipod" /><category term="adsense" /><category term="twitter" /><category term="nexus one" /><category term="rumours" /><category term="google reader" /><category term="bookmarking" /><category term="maps" /><category term="traffic" /><category term="knol" /><category term="April Fool's Day" /><category term="fiction" /><category term="gmail" /><title>The Radioactive Yak</title><subtitle type="html" /><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://blog.radioactiveyak.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://blog.radioactiveyak.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/10735231/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Reto Meier</name><uri>https://profiles.google.com/111169963967137030210</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-FnQer4-BRHE/AAAAAAAAAAI/AAAAAAAAhdQ/hYIqsdGTYgA/s512-c/photo.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>198</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/TheRadioactiveYak" /><feedburner:info uri="theradioactiveyak" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><geo:lat>51.418413</geo:lat><geo:long>-0.224136</geo:long><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2FTheRadioactiveYak" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FTheRadioactiveYak" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/TheRadioactiveYak" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FTheRadioactiveYak" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2FTheRadioactiveYak" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FTheRadioactiveYak" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><entry gd:etag="W/&quot;DUcGRXcyfip7ImA9WhRWFkQ.&quot;"><id>tag:blogger.com,1999:blog-10735231.post-1304733174930704307</id><published>2012-01-02T03:21:00.000Z</published><updated>2012-01-04T17:10:24.996Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-04T17:10:24.996Z</app:edited><title>2011: My Year in Review</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
2011 was a big year for me. I moved from London to the Bay Area, got promoted, wrote &lt;a href="http://www.amazon.com/gp/product/1118102274/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=interventione-20&amp;amp;linkCode=as2&amp;amp;camp=217145&amp;amp;creative=399373&amp;amp;creativeASIN=1118102274"&gt;Professional Android 4 Application Development&lt;/a&gt;, and had my first Thanksgiving.&lt;br /&gt;
&lt;br /&gt;
In amongst all that I read some books, took some pictures, and played with some Android gadgets. Here's a little summary of the highlights.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Books&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
This year I used Google Books to store my &lt;a href="http://books.google.com/books?uid=103165518259240682176&amp;amp;as_coll=1010&amp;amp;source=gbs_lp_bookshelf_list"&gt;2011 reading list&lt;/a&gt;. My count was down somewhat (16 books compared to 23 last year), mainly due to the free-time spend writing the aforementioned book. This year's highlights:&lt;br /&gt;
&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;&lt;b&gt;Favorite Book&lt;/b&gt;: &lt;a href="http://www.amazon.com/gp/product/0553801473/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=interventione-20"&gt;A Dance with Dragons&lt;/a&gt; by George R. R. Martin.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Most Read Author&lt;/b&gt;: I read two books by &lt;a href="http://www.amazon.com/gp/entity/Courtney-Summers/B001JSCFY6/?ie=UTF8&amp;amp;tag=interventione-20"&gt;Courtney Summers&lt;/a&gt; and two by &lt;a href="http://www.amazon.com/mn/search/?_encoding=UTF8&amp;amp;redirect=true&amp;amp;keywords=Wil%20Wheaton&amp;amp;tag=interventione-20"&gt;Wil Wheaton&lt;/a&gt;, but 16 books doesn't leave a lot of room for doubling up in a year when Feist, Pratchett, and Martin all release new books.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Hardcover versus Paperback&lt;/b&gt;: 4 hardcovers, 5 Kindle eBooks, 7 paperbacks.&lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;Apps&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Lots of changes &lt;a href="http://blog.radioactiveyak.com/p/reto-meiers-installed-android-apps.html"&gt;to the list&lt;/a&gt; this year. iPlayer, Ocado, and the London Cycle Hire Widget all drop off the list thanks to my move Stateside. Beluga gets dropped in favour of G+ Messenger, and TweetDeck gets the old uninstall thanks to increasingly poor performance and my shift away from Twitter towards Google+.&lt;br /&gt;
&lt;br /&gt;
New to the list this year are &lt;a href="https://market.android.com/details?id=com.pandora.android"&gt;Pandora&lt;/a&gt; and &lt;a href="https://market.android.com/details?id=com.google.android.music"&gt;Google Music&lt;/a&gt;, which have revolutionized the way I listen to music since moving to the US. &lt;a href="https://market.android.com/details?id=com.zeptolab.ctr.paid"&gt;Cut the Rope&lt;/a&gt;, &lt;a href="https://market.android.com/details?id=com.threed.bowling"&gt;3D Bowling&lt;/a&gt;, and the &lt;a href="https://market.android.com/details?id=com.mxtech.videoplayer.ad"&gt;MX Video Player&lt;/a&gt; earned their striped keeping me entertained flying between California and Western Australia, and &lt;a href="https://market.android.com/details?id=com.mobilesrepublic.appy"&gt;News Republic&lt;/a&gt; has come out on top when it comes to giving me news on the go.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Photography&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
A move to the Bay Area (and its hundreds of hiking trails through gorgeous nature reserves), a visit to NYC, and a trip back to Australia provided ample fodder for some photography. This year I tried my hand at some HDR&amp;nbsp;processing too. A portfolio of my &lt;a href="https://plus.google.com/photos/111169963967137030210/albums/5692859986746506145"&gt;best pics is online here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://plus.google.com/photos/111169963967137030210/albums/5692859986746506145" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="266" src="http://2.bp.blogspot.com/-dcEhQWjK-jI/TwEaNcNksQI/AAAAAAAAg84/NGkAT7M-P0A/s400/Sunset_HDR_15.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;Gadgets&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
What am I carrying these days? Check out&amp;nbsp;&lt;a href="http://blog.radioactiveyak.com/p/reto-meiers-gadget-compendium.html"&gt;Reto Meier's Gadget Compendium&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
The big changes this year were the introduction of the &lt;a href="http://www.google.com/nexus/#"&gt;Galaxy Nexus&lt;/a&gt; to replace my Nexus S, and the inclusion of a &lt;a href="http://www.samsung.com/global/microsite/galaxytab/10.1/index.html"&gt;Galaxy Tab 10.1&lt;/a&gt; at the expense of the Xoom and a 7" Galaxy Tab. The 10" Tab is thin, light, and last forever --&amp;nbsp;indispensable&amp;nbsp;for long haul travel.&lt;br /&gt;
&lt;br /&gt;
Trends for 2011:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Lighter and thinner&lt;/b&gt;: The 10" Galaxy Tab probably weighs less than the 7" version. My Galaxy Nexus is the thinnest Android phone I've owned and is lighter than the smaller device it replaces.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Bigger screens&lt;/b&gt;: A 10" tablet replaced the 7" version and the Galaxy Nexus has a bigger screen than the Nexus S. People talk about screens being "too big", but provided they weigh less and don't suck up more power, I don't see a problem.&lt;/li&gt;
&lt;/ul&gt;
As for 2012? I'm hoping to see some Android @ Home gear this year. I think it might be time to upgrade my camera gear -- starting with a prime lens and going from there. I like the new Kindles, but the Kindle 3G I'm using right now does everything I need, so I don't see a Fire in my future.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10735231-1304733174930704307?l=blog.radioactiveyak.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheRadioactiveYak?a=6zaipSjMN08:4OKXdBZWG-E:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheRadioactiveYak?i=6zaipSjMN08:4OKXdBZWG-E:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheRadioactiveYak?a=6zaipSjMN08:4OKXdBZWG-E:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheRadioactiveYak?i=6zaipSjMN08:4OKXdBZWG-E:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheRadioactiveYak/~4/6zaipSjMN08" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.radioactiveyak.com/feeds/1304733174930704307/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.radioactiveyak.com/2012/01/2011-my-year-in-review.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10735231/posts/default/1304733174930704307?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10735231/posts/default/1304733174930704307?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheRadioactiveYak/~3/6zaipSjMN08/2011-my-year-in-review.html" title="2011: My Year in Review" /><author><name>Reto Meier</name><uri>https://profiles.google.com/111169963967137030210</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-FnQer4-BRHE/AAAAAAAAAAI/AAAAAAAAhdQ/hYIqsdGTYgA/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-dcEhQWjK-jI/TwEaNcNksQI/AAAAAAAAg84/NGkAT7M-P0A/s72-c/Sunset_HDR_15.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.radioactiveyak.com/2012/01/2011-my-year-in-review.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0UARH46eyp7ImA9WhRSFUk.&quot;"><id>tag:blogger.com,1999:blog-10735231.post-944638803725618639</id><published>2011-11-09T04:22:00.001Z</published><updated>2011-11-17T17:00:45.013Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-17T17:00:45.013Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="photography" /><category scheme="http://www.blogger.com/atom/ns#" term="HDR" /><title>Australia in High Dynamic Range</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://plus.google.com/photos/111169963967137030210/albums/5675763521899654785/5675763553582753858" imageanchor="1" style="margin-left: 0em; margin-right: 0em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-9TAvn77-Ep4/TsRc4WhoqEI/AAAAAAAAeGI/gy-lP652LDI/s640/BallaratHDR_13.jpg" width="600" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
I've been really impressed with the work &lt;a href="https://plus.google.com/105237212888595777019/posts"&gt;+Trey Ratcliff&lt;/a&gt;&amp;nbsp;has been sharing on Google+, which led to me wondering if&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/High_dynamic_range_imaging"&gt;HDR&lt;/a&gt;&amp;nbsp;might be a way to add some "punch" to my landscape photography.&amp;nbsp;My recent holiday back to Oz offered the perfect excuse to experiment.&amp;nbsp;I've put my best HDR photos so far into&amp;nbsp;&lt;a href="https://plus.google.com/photos/111169963967137030210/albums/5675763521899654785"&gt;this Google+ album&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
I've been working on my photography skills for a while now, but there are certain scenes that I've &amp;nbsp;found particularly challenging. Dramatic sunsets, photos taken in bright sunlight (or towards the sun), or photos taken on dark, gray days have been a struggle to&amp;nbsp;capture adequately on camera.&lt;br /&gt;
&lt;br /&gt;
HDR seemed like a technique that might help me capture on film what I could see with my eyes, and what better place to practice than on a Western Australian beach at sunset?&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://plus.google.com/photos/111169963967137030210/albums/5675763521899654785/5675763650278317778" imageanchor="1" style="margin-left: 0em; margin-right: 0em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-hi71ogUvg0I/TsRc9-vp3tI/AAAAAAAAeHU/neJ9ksPCzHg/s640/Sunset_HDR_15.jpg" width="600" /&gt;&lt;/a&gt;&lt;/div&gt;
We also spent some time in Ballarat, over in Victoria. In recent years rural Australia has been known for a crippling drought followed by&amp;nbsp;devastating&amp;nbsp;floods, but when we visited it was a velvet field punctuated by saphires, with the dams and lakes all filled to capacity.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://plus.google.com/photos/111169963967137030210/albums/5675763521899654785/5675763526664634754" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="267" src="http://2.bp.blogspot.com/-WTPYkljiphM/TsRc2yP2wYI/AAAAAAAAeF0/sLbMl4b16mk/s400/BallaratHDR_16.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
We were staying within the shadow of &lt;a href="http://en.wikipedia.org/wiki/Mount_Buninyong"&gt;Mount Buninyong&lt;/a&gt;, which provided the perfect opportunity to experiment with some midday shots taken from a high vantage point.&lt;br /&gt;
&lt;br /&gt;
Bird's eye views are always stunning in person, but I've had difficulty turning that view into &amp;nbsp;interesting photos -- particularly as I seldom make it to these places at dusk or dawn when the natural light would be more&amp;nbsp;favorable. &amp;nbsp;My initial results were definitely encouraging.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://plus.google.com/photos/111169963967137030210/albums/5675763521899654785/5675763528325630850" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="266" src="http://2.bp.blogspot.com/-o09Mr4Li2_I/TsRc24b3i4I/AAAAAAAAeFs/dyEtzWFxBUI/s400/BallaratHDR_18.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
To help experiment, my trusty Canon EOD 500D has an exposure bracketing option that lets me take three consecutive pictures using different exposures. Photoshop comes with an automation plugin that merges multiple exposures to produce HDR images.&lt;br /&gt;
&lt;br /&gt;
I learned a few things from my experience so far. The first - somewhat obviously - is to look for scenes with an abundance of color depth. Rich greens offset by deep blues and grays look fantastic.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://plus.google.com/photos/111169963967137030210/albums/5675763521899654785/5675763553922747042" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="266" src="http://4.bp.blogspot.com/-qlUPqCKjU6E/TsRc4XysiqI/AAAAAAAAeGM/9ZADxRdZVqE/s400/BallaratHDR_1.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
Somewhat less obvious is the effect that a hint of rich color can add to an otherwise monochromatic scene. HDR will add layers of depth to grey clouds and dark seas, so a small splash of red or green can produce dramatic results.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://plus.google.com/photos/111169963967137030210/albums/5675763521899654785/5675763568611986578" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="266" src="http://1.bp.blogspot.com/-JNiYj7_6xgE/TsRc5Og4jJI/AAAAAAAAeGs/38324bMp3A0/s400/StKilda_HDR_2.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
I also learned that taking portrait photos in HDR is much more difficult.&amp;nbsp;Close-ups&amp;nbsp;can be incredibly unflattering as skin tones are exaggerated and people start to creep into the &lt;a href="http://en.wikipedia.org/wiki/Uncanny_valley"&gt;uncanny valley&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
It's also tricky to photograph scenes with movement. When you merge the images, slight differences are often shown up as artifacts or ghosting. A steady hand is a must (my best results used a tripod), and shooting toward the sun will minimize your exposure times.&amp;nbsp;Looking at the images blown up on my 24" monitor, it's also clear that there are more annoying pixel artifacts, halos, and ghosting that I need to work on to improve the final effect.&lt;br /&gt;
&lt;br /&gt;
Overall, I need to practice to get better results, but I the progress so far is promising and HDR is definitely a tool I'll be adding to my amateur photography tool-belt.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://plus.google.com/photos/111169963967137030210/albums/5675763521899654785/5675763528524253874" imageanchor="1" style="margin-left: 0em; margin-right: 0em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-p1gRZU1WHLM/TsRc25LOSrI/AAAAAAAAeFw/oyDT7FON4N0/s640/KandPHDR_5.jpg" width="600" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;span class="Apple-style-span" style="background-color: white; color: #333333; font-family: 'Trebuchet MS', Verdana, Arial, sans-serif; font-size: 13px; line-height: 18px;"&gt;&lt;i&gt;[I've disabled comments here in favour of using Google+. Feel free to join the conversation&amp;nbsp;&lt;a href="https://plus.google.com/111169963967137030210/posts/D2DbVQjeRCr" style="color: #e1771e; text-decoration: none;"&gt;over there&lt;/a&gt;.]&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10735231-944638803725618639?l=blog.radioactiveyak.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheRadioactiveYak?a=PLWZHG0IXdE:cG227weGC0E:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheRadioactiveYak?i=PLWZHG0IXdE:cG227weGC0E:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheRadioactiveYak?a=PLWZHG0IXdE:cG227weGC0E:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheRadioactiveYak?i=PLWZHG0IXdE:cG227weGC0E:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheRadioactiveYak/~4/PLWZHG0IXdE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.radioactiveyak.com/feeds/944638803725618639/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.radioactiveyak.com/2011/11/australia-in-high-dynamic-range.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10735231/posts/default/944638803725618639?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10735231/posts/default/944638803725618639?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheRadioactiveYak/~3/PLWZHG0IXdE/australia-in-high-dynamic-range.html" title="Australia in High Dynamic Range" /><author><name>Reto Meier</name><uri>https://profiles.google.com/111169963967137030210</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-FnQer4-BRHE/AAAAAAAAAAI/AAAAAAAAhdQ/hYIqsdGTYgA/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-9TAvn77-Ep4/TsRc4WhoqEI/AAAAAAAAeGI/gy-lP652LDI/s72-c/BallaratHDR_13.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.radioactiveyak.com/2011/11/australia-in-high-dynamic-range.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEADQ3c5fCp7ImA9WhRTF08.&quot;"><id>tag:blogger.com,1999:blog-10735231.post-8804057095032694930</id><published>2011-11-08T03:23:00.000Z</published><updated>2011-11-08T03:26:12.924Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-08T03:26:12.924Z</app:edited><title>Memories in the White Space</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
A distinct melancholy accompanies me as I sort through the images and artifacts of my youth.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;img border="0" src="http://2.bp.blogspot.com/-300EfrS9vT8/TrDRoVrOccI/AAAAAAAAc_M/WhfeXGL8S6A/s400/Dice.jpg" width="300" /&gt;&lt;/div&gt;
&lt;br /&gt;
My wife and I left Australia almost 7 years ago. We lived in London and now the Bay Area, but for me &lt;i&gt;home&lt;/i&gt; is still Perth. We're back this month—the first time in three and a half years—and I'm using the opportunity to free my parents of some of the detritus I left with them before taking off in 2005.&lt;br /&gt;
&lt;br /&gt;
Our visit has been timed to coincide with the wedding of one of my very best friends. I've been friends with the groom and most of his side of the wedding since our first year at Duncraig Senior High. We were all members of the&amp;nbsp;&lt;i&gt;Academic Extension&lt;/i&gt; program (a particularly&amp;nbsp;nefarious&amp;nbsp;way to target those of us most likely to be on the fringes of high school social life and stigmatize us further by segregating us into separate classes.)&lt;br /&gt;
&lt;br /&gt;
When we all get together for some quiet drinks the night before the wedding it's only a matter of minutes before my accent has slowed and thickened, and we're poking fun and chatting as though I'd never left. The same pattern repeats as we catch up with close friends I'm lucky to see every few years. We share a hug and a beer and talk about their new kids, houses, fiances, spouses, and business ventures with an easy comfort that makes it seem like only a or two week has passed since we last hung out.&lt;br /&gt;
&lt;br /&gt;
Back at my parent's house, amongst the polyhedral dice, Star Trek VHS tapes, and school assignments are 10 A3 scrapbooks filled with photographs of me, my friends, and family from birth until I moved out at 21. &lt;br /&gt;
&lt;br /&gt;
I grew up in the age before digital cameras and smartphones captured every moment (magic or otherwise) ready for posting to Facebook. As teenage boys, my friends and I were particularly adept at avoiding my mum's instamatic. As a result, flipping through the stacks of photo albums is a surreal experience. Christmases, birthdays, high school balls, and graduation ceremonies are all captured in full colour—but what strikes me most is the memories that live in the white space between the photos.&lt;br /&gt;
&lt;br /&gt;
A thumb-obscured image doesn't capture the experience of all-night LAN parties spent playing Doom 2. A single photo&amp;nbsp;of us playing pickup basketball&amp;nbsp;(without the hoop in frame) is a faint reminder of the hours spent on court and the four broken arms collected between me and the aforementioned groom&amp;nbsp;during games; plaster-cast testimony to our passion for the game.&lt;br /&gt;
&lt;br /&gt;
A shot of me posing, awkward and gangly, in my inter-school sports uniform captures nothing about the day, but brings back the crowd of apathetic high-schoolers gathering around the high-jump mats, and the rush (and not a small amount of surprise) I felt as they genuinely cheered me on to jump my own height and break the school record.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;img border="0" src="http://4.bp.blogspot.com/-NI90FbLptOQ/TrDSAslLEsI/AAAAAAAAc_Y/8FpuVu9ReFk/s400/Childhood_1.jpg" width="610" /&gt;&lt;/div&gt;
&lt;br /&gt;
There aren't any photos to commemorate the long nights spent playing AD&amp;amp;D, or the Friday nights we all spent at WesTrek watching boot-leg videos of each new episode of TNG, but the Player's Handbooks and mountains of Star Trek videos, books, and technical manuals bring back the memories all the same.&lt;br /&gt;
&lt;br /&gt;
20 years. That's how long I've known some of my closest friends. Two thirds of my life. I'm a proper geek, so don't find it easy to build these effortless friendships, so the comfort of sliding back into them is tempered by the knowledge that it'll be years until I can next hang out with some of my best friends. &lt;br /&gt;
&lt;br /&gt;
Email, Facebook status updates, and Google+ will help us stay in touch until the next time we voyage the 8,000 miles back home. When that happens there'll be more kids to meet, new houses to tour, and new businesses to hear about. We'll hug, share a few beers, and it'll be like we never left.&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;[I've disabled comments here in favour of using Google+. Feel free to join the conversation&amp;nbsp;&lt;a href="https://plus.google.com/111169963967137030210/posts/Db7D1mxrxMT"&gt;over there&lt;/a&gt;.]&lt;/i&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10735231-8804057095032694930?l=blog.radioactiveyak.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheRadioactiveYak?a=JYuWnv8RqXU:dasrXr-46Yk:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheRadioactiveYak?i=JYuWnv8RqXU:dasrXr-46Yk:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheRadioactiveYak?a=JYuWnv8RqXU:dasrXr-46Yk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheRadioactiveYak?i=JYuWnv8RqXU:dasrXr-46Yk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheRadioactiveYak/~4/JYuWnv8RqXU" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10735231/posts/default/8804057095032694930?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10735231/posts/default/8804057095032694930?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheRadioactiveYak/~3/JYuWnv8RqXU/memories-in-white-space.html" title="Memories in the White Space" /><author><name>Reto Meier</name><uri>https://profiles.google.com/111169963967137030210</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-FnQer4-BRHE/AAAAAAAAAAI/AAAAAAAAhdQ/hYIqsdGTYgA/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-300EfrS9vT8/TrDRoVrOccI/AAAAAAAAc_M/WhfeXGL8S6A/s72-c/Dice.jpg" height="72" width="72" /><feedburner:origLink>http://blog.radioactiveyak.com/2011/11/memories-in-white-space.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEUCSHs6eyp7ImA9WhdTEEg.&quot;"><id>tag:blogger.com,1999:blog-10735231.post-2599814165714408460</id><published>2011-07-07T16:24:00.000+01:00</published><updated>2011-07-07T16:24:29.513+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-07T16:24:29.513+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="social" /><category scheme="http://www.blogger.com/atom/ns#" term="predictions" /><title>Obligatory Post Speculating on Google+</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;I love product launches. It's the perfect time to speculate with no inconvenient research or history to get in the way.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;This goes for everything on this blog, but it's probably worth highlighting in this instance that these opinions are my own. They do not represent the thoughts and opinions of Google, the Google+ team, or anyone else who works at Google.&lt;/blockquote&gt;&lt;br /&gt;
My history of speculating on products tends to be bullish on Google and cynical of social. I thought &lt;a href="http://blog.radioactiveyak.com/2007/11/android-in-action.html"&gt;Android&lt;/a&gt; and Wave were going to change the world, and that Twitter was a waste of time.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Twitter with conversations&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Despite my initial reservations I'm a big user of &lt;a href="http://www.twitter.com/retomeier"&gt;Twitter&lt;/a&gt;, but&amp;nbsp;I find that most of my interaction there is effectively anonymous - I'm either reading things by interesting people I don't know, or sharing things I think are interesting with people I've never met. &lt;br /&gt;
&lt;br /&gt;
I've found that half my use of &lt;a href="http://profiles.google.com/reto.meier"&gt;Google+&lt;/a&gt;&amp;nbsp;works similarly - by posting publicly and creating a "My Stream" circle full of interesting folks who I don't know personally.&lt;br /&gt;
&lt;br /&gt;
Where I think Google+ adds value is with threaded conversations. By attaching the&amp;nbsp;conversation that emerges from each post, anonymity is reduced and the process of sharing and reading are suddenly more social.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Facebook with sharing controls&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
I remember quite clearly the moment my use of Facebook went from regular to sporadic. My manager's passing comment on my most recent status update (something along the lines of "&lt;i&gt;I'm so bored I'm considering setting myself on fire just to liven up my day&lt;/i&gt;") prompted &lt;a href="http://blog.radioactiveyak.com/2007/10/could-facebook-hitting-critical-mass.html"&gt;this blog post&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
I've always maintained a policy of only adding people I know and would recognize in person as Facebook friends. Nonetheless, when your extended family, school friends, and current / former work colleagues are all reading the same stream, and seeing the same pictures, the intersection of "appropriate material" rapidly tends towards zero.&lt;br /&gt;
&lt;br /&gt;
Using circles to fragment my audience has been an elegant solution for me.&lt;br /&gt;
&lt;br /&gt;
I've created the obvious circles like "friends", "family", and "Googlers" but I've found smaller adhoc circles particularly useful when socializing&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Socializing+&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
In the paleolithic age we used email to arrange social events and share the photos afterwards, but it never really worked.&lt;br /&gt;
&lt;br /&gt;
Facebook is a good alternative, but it requires adding people you don't necessarily know to your "friends" list.&lt;br /&gt;
&lt;br /&gt;
Being able to create an adhoc circle (or just add individual people to a post) - makes it easy to work out the details for a 4th July BBQ - and then post the photos - all in one place. &lt;br /&gt;
&lt;br /&gt;
I've not spent a lot of time with Huddles or Hangouts yet, but they seem a natural extension. I can see using Huddle instead of SMS to let folks know you're running late, to get parking advice, or confirm the orders for a lunch-run. I've used similar products (most notably Beluga and GroupMe) to coordinate amongst a large group at conferences or events like MWC or Google I/O.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Social photo sharing without wanting to punch your screen&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Photos are probably the reason most folks joined Facebook to begin with. It's also the reason many people hate Facebook. &lt;br /&gt;
&lt;br /&gt;
I'll happily rave about the Google+ photo experience which is awesome. It's easy to share photos with just a small group, or post your best amateur photography for the world to critique.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;I don't want to be social at work&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
For all the good uses, let me highlight a couple that I don't see catching on.&lt;br /&gt;
&lt;br /&gt;
I admit to having been a little skeptical of Google+ during the dogfooding stage. With 20/20 hindsight, I think a lot of that had to do with it being effectively a corporate social network. My email inbox is full enough as it is; I really don't need another stream to monitor in order to be involved in work conversations.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;This is not a blog&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
You'll note that I haven't posted this directly on Google+.&lt;br /&gt;
&lt;br /&gt;
I don't want to read your essay in my social stream, just give me an abstract and link to your blog. For added bonus points, make sure your blog links back to your Google+ profile.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;In Conclusion&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Twitter is entirely public and as a result my interactions there are regular but tend towards the impersonal. Facebook is limited to people I know so the interactions are more personal, but (increasingly) less frequent.&lt;br /&gt;
&lt;br /&gt;
Google+ &amp;nbsp;lets me choose which group of people I'm comfortable sharing something with to a degree that lets me have regular, personal conversations.&lt;br /&gt;
&lt;br /&gt;
As many of you have no doubt noticed - that makes for an addictive combination. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10735231-2599814165714408460?l=blog.radioactiveyak.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheRadioactiveYak?a=7oUG8wOfdoc:GDYIVSeDSms:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheRadioactiveYak?i=7oUG8wOfdoc:GDYIVSeDSms:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheRadioactiveYak?a=7oUG8wOfdoc:GDYIVSeDSms:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheRadioactiveYak?i=7oUG8wOfdoc:GDYIVSeDSms:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheRadioactiveYak/~4/7oUG8wOfdoc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.radioactiveyak.com/feeds/2599814165714408460/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.radioactiveyak.com/2011/07/obligatory-post-speculating-on-google.html#comment-form" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10735231/posts/default/2599814165714408460?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10735231/posts/default/2599814165714408460?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheRadioactiveYak/~3/7oUG8wOfdoc/obligatory-post-speculating-on-google.html" title="Obligatory Post Speculating on Google+" /><author><name>Reto Meier</name><uri>https://profiles.google.com/111169963967137030210</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-FnQer4-BRHE/AAAAAAAAAAI/AAAAAAAAhdQ/hYIqsdGTYgA/s512-c/photo.jpg" /></author><thr:total>4</thr:total><georss:featurename>Mountain View, CA, USA</georss:featurename><georss:point>37.420199098162286 -122.08378796295165</georss:point><georss:box>37.36352609816228 -122.12038296295165 37.47687209816229 -122.04719296295164</georss:box><feedburner:origLink>http://blog.radioactiveyak.com/2011/07/obligatory-post-speculating-on-google.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkcHQnk4eip7ImA9WhZaGUo.&quot;"><id>tag:blogger.com,1999:blog-10735231.post-6013024648522039535</id><published>2011-07-06T18:40:00.000+01:00</published><updated>2011-07-06T18:40:33.732+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-06T18:40:33.732+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="photography" /><title>London 2005-2011 in Photographs</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
I really like the photo sharing and viewing experience in &lt;a href="http://www.google.com/+"&gt;Google+&lt;/a&gt; so I decided to sort through my massive collection of "London" photographs and share some of my&amp;nbsp;favorites.&lt;br /&gt;
&lt;br /&gt;
Selecting and preparing photos to share has a way of focussing your attention and allowing you to really look at them critically.&amp;nbsp;As I sifted through the thousands of photographs I'd taken in London it quickly became obvious that I've got some work to do before I'm competing with &lt;a href="http://www.flickr.com/photos/romainguy"&gt;Romain Guy&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
It was also clear that I had a couple of preferred sources of inspiration.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;The Seasons&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Grey skies and light rain don't make for great photos and&amp;nbsp;an overcast Winter that starts in October and ends around April does little to provide inspiration.&lt;br /&gt;
&lt;br /&gt;
London is blessed with real seasons though, and Autumn and Spring (however brief) are an entirely different matter. They offer some of the most amazing light and color for taking photos. And when it snows? London transforms briefly into a winter wonderland.&lt;br /&gt;
&lt;br /&gt;
By 10am the skies cloud over and the snow turns to mush, so to take advantage you need to be out there at dawn. I worked in banking, so that was never a problem.&lt;br /&gt;
&lt;br /&gt;
Each of the following thumbnails links to a&amp;nbsp;gallery&amp;nbsp;of my pictures of London in &lt;a href="https://plus.google.com/photos/111169963967137030210/albums/5626272406881217153"&gt;Winter&lt;/a&gt;, &lt;a href="https://plus.google.com/photos/111169963967137030210/albums/5626272572977256881"&gt;Spring&lt;/a&gt;, and &lt;a href="https://plus.google.com/photos/111169963967137030210/albums/5626272257935280001"&gt;Autumn&lt;/a&gt; respectively.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://plus.google.com/photos/111169963967137030210/albums/5626272406881217153"&gt;&lt;span id="goog_573265253"&gt;&lt;/span&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-KrqzIV1EBUs/ThSGNtXdJKI/AAAAAAAAbbw/FNYq8FPRsx4/s200/DSC01120.JPG" width="190" /&gt;&lt;span id="goog_573265254"&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href="https://plus.google.com/photos/111169963967137030210/albums/5626272572977256881"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-WzQJVablMdg/ThSGQNbBefI/AAAAAAAAbcY/JZOlUTdQed4/s200/DSC03118.JPG" width="190" /&gt;&lt;/a&gt;&lt;a href="https://plus.google.com/photos/111169963967137030210/albums/5626272257935280001"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-ae-SkPtBaGY/ThSGSn6nHeI/AAAAAAAAbc8/s0BtuoQmp7w/s200/DSC02226.JPG" width="190" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;
&lt;b&gt;The Sights&lt;/b&gt;&lt;/div&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;
London has some of the most easily recognized landmarks in the world. Because of the seemingly&amp;nbsp;perpetually grey and overcast skies, lots of tourist snaps come out flat and dull. To get around that I've taken most of them at night or very early in the morning.&lt;/div&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: center;"&gt;
&lt;a href="https://plus.google.com/photos/111169963967137030210/album/5626269252050609249" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="212" src="http://4.bp.blogspot.com/-xhFTYpuELAg/ThSGbr38jCI/AAAAAAAAbd0/gMBoq6VqQeA/s320/IMG_0085.JPG" style="cursor: move;" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10735231-6013024648522039535?l=blog.radioactiveyak.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheRadioactiveYak?a=HbiRQCG_me8:agFZvzkaL7M:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheRadioactiveYak?i=HbiRQCG_me8:agFZvzkaL7M:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheRadioactiveYak?a=HbiRQCG_me8:agFZvzkaL7M:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheRadioactiveYak?i=HbiRQCG_me8:agFZvzkaL7M:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheRadioactiveYak/~4/HbiRQCG_me8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.radioactiveyak.com/feeds/6013024648522039535/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.radioactiveyak.com/2011/07/london-2005-2011-in-photographs.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10735231/posts/default/6013024648522039535?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10735231/posts/default/6013024648522039535?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheRadioactiveYak/~3/HbiRQCG_me8/london-2005-2011-in-photographs.html" title="London 2005-2011 in Photographs" /><author><name>Reto Meier</name><uri>https://profiles.google.com/111169963967137030210</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-FnQer4-BRHE/AAAAAAAAAAI/AAAAAAAAhdQ/hYIqsdGTYgA/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-KrqzIV1EBUs/ThSGNtXdJKI/AAAAAAAAbbw/FNYq8FPRsx4/s72-c/DSC01120.JPG" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://blog.radioactiveyak.com/2011/07/london-2005-2011-in-photographs.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkEDR3c5cSp7ImA9WhZaEko.&quot;"><id>tag:blogger.com,1999:blog-10735231.post-6598490737852970783</id><published>2011-06-28T17:30:00.001+01:00</published><updated>2011-06-28T17:31:16.929+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-28T17:31:16.929+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="deepdive" /><category scheme="http://www.blogger.com/atom/ns#" term="android" /><title>A Deep Dive Into Location Part 2: Being Psychic and Staying Smooth</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;blockquote&gt;
&lt;i&gt;This is part two of &lt;a href="http://android-developers.blogspot.com/2011/06/deep-dive-into-location.html"&gt;A Deep Dive into Location&lt;/a&gt;. This post focuses on making your apps psychic and smooth using the Backup Manager, AsyncTask, Intent Services, the Cursor Loader, and Strict Mode.&lt;/i&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;i&gt;The code snippets used are available as part of the &lt;a href="http://code.google.com/p/android-protips-location/"&gt;Android Protips: A Deep Dive Into Location&lt;/a&gt; open source project. More pro tips can be found in my &lt;a href="http://www.google.com/events/io/2011/sessions/android-protips-advanced-topics-for-expert-android-app-developers.html"&gt;Android Pro Tips&lt;/a&gt; presentation from&amp;nbsp;&lt;/i&gt;&lt;i&gt;Google I/O.&amp;nbsp;&lt;/i&gt;&lt;/blockquote&gt;
&lt;b&gt;Being Psychic&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
You've just had to factory reset your device - never a good day - but yay! You've opted in to "backup my settings" and Android is happily downloading all your previously installed apps. Good times! You open your favourite app and... all your settings are gone. &lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://www.youtube.com/watch?v=twmuBbC_oB8#"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-PefCn1EZdf0/Tgn9cBxjdwI/AAAAAAAAZEE/8l226oSai6Q/s1600/small_psychic.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;Backup Shared Preferences to the Cloud using the Backup Manager&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
If you're not using the &lt;a href="http://developer.android.com/reference/android/app/backup/BackupManager.html"&gt;Backup Manager&lt;/a&gt; to preserve user preference to the cloud I have a question for you: Why do you hate your users?  The Backup Manager was added to Android in Froyo and it's about as trivial to implement as I can conceive.&lt;br /&gt;
&lt;br /&gt;
All you need to do is extend the &lt;a href="http://developer.android.com/reference/android/app/backup/BackupAgentHelper.html"&gt;BackupAgentHelper&lt;/a&gt; and create a new &lt;a href="http://developer.android.com/reference/android/app/backup/SharedPreferencesBackupHelper.html"&gt;SharedPreferencesBackupHelper&lt;/a&gt; within it's &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;onCreate&lt;/span&gt; handler.&lt;br /&gt;
&lt;br /&gt;
As shown in the &lt;a href="http://code.google.com/p/android-protips-location/source/browse/trunk/src/com/radioactiveyak/location_best_practices/PlacesBackupAgent.java"&gt;PlacesBackupAgent&lt;/a&gt;, your Shared Preferences Backup Helper instance takes the name of your Shared Preference file, and you can specify the key for each of the preferences you want to backup. This should &lt;b&gt;only&lt;/b&gt; be user specified preferences - it's poor practice to backup instance or state variables.&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;public class PlacesBackupAgent extends BackupAgentHelper {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;@Override&lt;br /&gt;
&amp;nbsp;&amp;nbsp;public void onCreate() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SharedPreferencesBackupHelper helper = new &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SharedPreferencesBackupHelper(this, PlacesConstants.SHARED_PREFERENCE_FILE);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;addHelper(PlacesConstants.SP_KEY_FOLLOW_LOCATION_CHANGES, helper);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
}&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
To add your Backup Agent to your application you need to add an&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;android:backupAgent&lt;/span&gt; attribute to the Application tag in your manifest.&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;&amp;lt;application android:icon="@drawable/icon" android:label="@string/app_name"&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;android:backupAgent="PlacesBackupAgent"&amp;gt;&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
You also need to specify an API key (which you can obtain from here: &lt;a href="http://code.google.com/android/backup/signup.html"&gt;http://code.google.com/android/backup/signup.html&lt;/a&gt;)&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;&amp;lt;meta-data android:name="com.google.android.backup.api_key" &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;android:value="Your Key Goes Here" /&amp;gt;&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
To trigger a backup you just tell the Backup Manager that the data being backed up has changed. I do this within the &lt;a href="http://code.google.com/p/android-protips-location/source/browse/trunk/src/com/radioactiveyak/location_best_practices/utils/base/SharedPreferenceSaver.java"&gt;SharedPreferenceSaver&lt;/a&gt; classes, starting with the &lt;a href="http://code.google.com/p/android-protips-location/source/browse/trunk/src/com/radioactiveyak/location_best_practices/utils/FroyoSharedPreferenceSaver.java"&gt;FroyoSharedPreferenceSaver&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;public void savePreferences(Editor editor, boolean backup) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;editor.commit();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;backupManager.dataChanged();&lt;br /&gt;
}&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Being Smooth: Make everything asynchronous. No exceptions.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Android makes it easy for us to write apps that do nothing on the main thread but update the UI.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://www.youtube.com/watch?v=twmuBbC_oB8#" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-c3WmNQuu20I/Tgn9dd6xMXI/AAAAAAAAZEI/SmnFoACs078/s1600/small_smooth.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;Using AsyncTask&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
In this example, taken from&amp;nbsp;&lt;a href="http://code.google.com/p/android-protips-location/source/browse/trunk/src/com/radioactiveyak/location_best_practices/UI/PlaceActivity.java"&gt;PlaceActivity&lt;/a&gt;, I'm creating and executing an &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;AsyncTask&lt;/span&gt; class to lookup the best previous known location. This isn't an operation that should be particularly expensive - but I don't care. It isn't directly updating the UI, so it has no business on the main application thread.&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;AsyncTask&amp;lt;void, void, void&amp;gt; findLastLocationTask = 
new AsyncTask&amp;lt;void, void, void&amp;gt;() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;@Override&lt;br /&gt;
&amp;nbsp;&amp;nbsp;protected Void doInBackground(Void... params) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Location lastKnownLocation = &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lastLocationFinder.getLastBestLocation(PlacesConstants.MAX_DISTANCE, &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.currentTimeMillis()-PlacesConstants.MAX_TIME);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;updatePlaces(lastKnownLocation, PlacesConstants.DEFAULT_RADIUS, false);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return null;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
};&lt;br /&gt;
findLastLocationTask.execute();&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
You'll note that I'm not touching the UI during the operation or at its completion, so in this instance I could have used normal Thread operations to background it rather than use AsyncTask.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Using the IntentService&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Intent Services implement a queued asynchronous worker Service.  Intent Services encapsulate all the best practices for writing services; they're short lived, perform a single task, default to Start Not Sticky (where supported), and run asynchronously. &lt;br /&gt;
&lt;br /&gt;
To add a new task to the queue you call &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;startService&lt;/span&gt; passing in an Intent that contains the data to act on. The Service will then run, executing &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;onHandleIntent&lt;/span&gt; on each Intent in series until the queue is empty, at which point the Service kills itself.&lt;br /&gt;
&lt;br /&gt;
I extended Intent Service for all my Service classes, &lt;a href="http://code.google.com/p/android-protips-location/source/browse/trunk/src/com/radioactiveyak/location_best_practices/services/PlacesUpdateService.java"&gt;PlacesUpdateService&lt;/a&gt;, &lt;a href="http://code.google.com/p/android-protips-location/source/browse/trunk/src/com/radioactiveyak/location_best_practices/services/PlaceDetailsUpdateService.java"&gt;PlaceDetailsUpdateService&lt;/a&gt;, &lt;a href="http://code.google.com/p/android-protips-location/source/browse/trunk/src/com/radioactiveyak/location_best_practices/services/PlaceCheckinService.java"&gt;PlaceCheckinService&lt;/a&gt;, and &lt;a href="http://code.google.com/p/android-protips-location/source/browse/trunk/src/com/radioactiveyak/location_best_practices/services/CheckinNotificationService.java"&gt;CheckinNotificationService&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Each implementation follows the same pattern, as shown in the &lt;a href="http://code.google.com/p/android-protips-location/source/browse/trunk/src/com/radioactiveyak/location_best_practices/services/PlacesUpdateService.java"&gt;PlacesUpdateService&lt;/a&gt; extract below.&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;@Override&lt;br /&gt;
protected void onHandleIntent(Intent intent) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;String reference = intent.getStringExtra(PlacesConstants.EXTRA_KEY_REFERENCE);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;String id = intent.getStringExtra(PlacesConstants.EXTRA_KEY_ID);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;boolean forceCache = 
intent.getBooleanExtra(PlacesConstants.EXTRA_KEY_FORCEREFRESH, false);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;boolean doUpdate = id == null || forceCache;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;if (!doUpdate) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Uri uri = Uri.withAppendedPath(PlaceDetailsContentProvider.CONTENT_URI, id);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Cursor cursor = contentResolver.query(uri, projection, null, null, null);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try { &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;doUpdate = true;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (cursor.moveToFirst()) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (cursor.getLong(
cursor.getColumnIndex(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PlaceDetailsContentProvider.KEY_LAST_UPDATE_TIME)) &amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.currentTimeMillis()-PlacesConstants.MAX_DETAILS_UPDATE_LATENCY)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;doUpdate = false;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;finally {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cursor.close();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;if (doUpdate)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;refreshPlaceDetails(reference, forceCache);&lt;br /&gt;
}&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Note that the queue is processed on a background thread, so I can query the Content Provider without having to spawn another background thread.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;CursorLoaders are awesome. Use them.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Loaders are awesome; and thanks to the &lt;a href="http://developer.android.com/sdk/compatibility-library.html"&gt;compatibility library&lt;/a&gt;, they're supported on every platform back to Android 1.6 - that’s about 98% of the current Android device install base.&lt;br /&gt;
&lt;br /&gt;
Using &lt;a href="http://developer.android.com/reference/android/content/CursorLoader.html"&gt;CursorLoaders&lt;/a&gt; is a no-brainer. They take a difficult common task - obtaining a Cursor of results from a Content Provider - and implement, encapsulate, and hide all the bits that are easy to get wrong.&lt;br /&gt;
&lt;br /&gt;
I've already fragmented and encapsulated my UI elements by creating three Fragments -- &lt;a href="http://code.google.com/p/android-protips-location/source/browse/trunk/src/com/radioactiveyak/location_best_practices/UI/fragments/PlaceListFragment.java"&gt;PlaceListFragment&lt;/a&gt;, &lt;a href="http://code.google.com/p/android-protips-location/source/browse/trunk/src/com/radioactiveyak/location_best_practices/UI/fragments/PlaceDetailFragment.java"&gt;PlaceDetailFragment&lt;/a&gt;, and &lt;a href="http://code.google.com/p/android-protips-location/source/browse/trunk/src/com/radioactiveyak/location_best_practices/UI/fragments/CheckinFragment.java"&gt;CheckinFragment&lt;/a&gt;. Each of these Fragments access a Content Provider to obtain the data they display.&lt;br /&gt;
&lt;br /&gt;
The list of nearby places is handled within the &lt;a href="http://code.google.com/p/android-protips-location/source/browse/trunk/src/com/radioactiveyak/location_best_practices/UI/fragments/PlaceListFragment.java"&gt;PlaceListFragment&lt;/a&gt;, the relevant parts of which are shown below.&lt;br /&gt;
&lt;br /&gt;
Note that it's entirely self contained; because the Fragment extends ListFragment the UI is already defined. Within &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;onActivityCreated&lt;/span&gt; I define a Simple Cursor Adapter that specifies which Content Provider columns I want to display in my list (place name and my distance from it), and assign that Adapter to the underlying List View.&lt;br /&gt;
&lt;br /&gt;
The final line initiates the Loader Manager.&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;public void onActivityCreated(Bundle savedInstanceState) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;super.onActivityCreated(savedInstanceState);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;activity = (PlaceActivity)getActivity();&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;adapter = new SimpleCursorAdapter(activity,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;android.R.layout.two_line_list_item,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cursor,&lt;br /&gt;            
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;new String[] &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{PlacesContentProvider.KEY_NAME, PlacesContentProvider.KEY_DISTANCE}, &lt;br /&gt;          
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;new int[] {android.R.id.text1, android.R.id.text2}, 0);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;// Allocate the adapter to the List displayed within this fragment.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;setListAdapter(adapter);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;// Populate the adapter / list using a Cursor Loader. &lt;br /&gt;
&amp;nbsp;&amp;nbsp;getLoaderManager().initLoader(0, null, this);&lt;br /&gt;
}&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
When the Loader is initiated we specify the parameters we would normally pass in to the Content Resolver when making a Content Provider query. Instead, we pass those parameters in to a new CursorLoader.&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;public Loader&amp;lt;cursor&amp;gt; onCreateLoader(int id, Bundle args) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;String[] projection = new String[] &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{PlacesContentProvider.KEY_ID,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PlacesContentProvider.KEY_NAME, &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PlacesContentProvider.KEY_DISTANCE, &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PlacesContentProvider.KEY_REFERENCE};&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;return new CursorLoader(activity, PlacesContentProvider.CONTENT_URI, &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;projection, null, null, null);&lt;br /&gt;
}&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
The following callbacks are triggered when the Loader Manager is initiated, completed, and reset respectively. When the Cursor has been returned, all we need to do is apply it to the Adapter we assigned to the List View and our UI will automatically update.&lt;br /&gt;
&lt;br /&gt;
The Cursor Loader will trigger &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;onLoadFinished&lt;/span&gt; whenever the underlying Cursor changes, so there's no need to register a separate Cursor Observer or manage the Cursor lifecycle yourself.&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;public void onLoadFinished(Loader&lt;cursor&gt; loader, Cursor data) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;adapter.swapCursor(data);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public void onLoaderReset(Loader&lt;cursor&gt; loader) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;adapter.swapCursor(null);&lt;br /&gt;
}&lt;/cursor&gt;&lt;/cursor&gt;&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
The &lt;a href="http://code.google.com/p/android-protips-location/source/browse/trunk/src/com/radioactiveyak/location_best_practices/UI/fragments/PlaceDetailFragment.java"&gt;PlaceDetailFragment&lt;/a&gt; is a little different; in this case we don't have an Adapter backed ListView to handle our UI updates. We initiate the Loader and define the Cursor parameters as we did in the Place List Fragment, but when the Loader has finished we need to extract the data and update the UI accordingly.&lt;br /&gt;
&lt;br /&gt;
Note that &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;onLoadFinished&lt;/span&gt; is &lt;i&gt;not&lt;/i&gt; synchronized to the main application thread, so I'm extracting the Cursor values on the same thread as the Cursor was loaded, before posting a new Runnable to the UI thread that assigns those new values to the UI elements - in this case a series of Text Views.&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;public void onLoadFinished(Loader&lt;cursor&gt; loader, Cursor data) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;if (data.moveToFirst()) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;final String name = data.getString(&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data.getColumnIndex(PlaceDetailsContentProvider.KEY_NAME));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;final String phone = data.getString(&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data.getColumnIndex(PlaceDetailsContentProvider.KEY_PHONE));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;final String address = data.getString(&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data.getColumnIndex(PlaceDetailsContentProvider.KEY_ADDRESS));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;final String rating = data.getString(&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data.getColumnIndex(PlaceDetailsContentProvider.KEY_RATING));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;final String url = data.getString(&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data.getColumnIndex(PlaceDetailsContentProvider.KEY_URL));&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (placeReference == null) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;placeReference = data.getString(&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data.getColumnIndex(PlaceDetailsContentProvider.KEY_REFERENCE));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;updatePlace(placeReference, placeId, true);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;handler.post(new Runnable () {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public void run() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nameTextView.setText(name);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;phoneTextView.setText(phone);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;addressTextView.setText(address);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ratingTextView.setText(rating);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;urlTextView.setText(url);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}        &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});&lt;br /&gt;
&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
}&lt;/cursor&gt;&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Using Strict Mode will prevent you from feeling stupid&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Strict Mode is how you know you've successfully moved everything off the main thread. Strict Mode was introduced in Gingerbread but some additional options were added in Honeycomb. I defined an &lt;a href="http://code.google.com/p/android-protips-location/source/browse/trunk/src/com/radioactiveyak/location_best_practices/utils/base/IStrictMode.java"&gt;IStrictMode&lt;/a&gt; Interface that includes an &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;enableStrictMode&lt;/span&gt; method that lets me use whichever options are available for a given platform. &lt;br /&gt;
&lt;br /&gt;
Below is the &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;enableStrictMode&lt;/span&gt; implementation within the &lt;a href="http://code.google.com/p/android-protips-location/source/browse/trunk/src/com/radioactiveyak/location_best_practices/utils/LegacyStrictMode.java"&gt;LegacyStrictMode&lt;/a&gt; class for Gingerbread devices.&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;public void enableStrictMode() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.detectDiskReads()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.detectDiskWrites()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.detectNetwork()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.penaltyDialog()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.build());&lt;br /&gt;
}&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
The only thing I hate more than modal dialogs in apps is apps that freeze because a network read or disk write is blocking the UI thread. As a result I've enabled detection of network and disk read/writes and reports using a modal dialog.&lt;br /&gt;
&lt;br /&gt;
I've applied Strict Mode detection to the entire app by extending the Application class to instantiate the appropriate &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;IStrictMode&lt;/span&gt; implementation and enable Strict Mode. Note that it is only turned on in developer mode. Be sure to flick that switch in the constants file when you launch.&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;public class PlacesApplication extends Application {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;@Override&lt;br /&gt;
&amp;nbsp;&amp;nbsp;public final void onCreate() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;super.onCreate();&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (PlacesConstants.DEVELOPER_MODE) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (PlacesConstants.SUPPORTS_HONEYCOMB)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;new HoneycombStrictMode().enableStrictMode();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else if (PlacesConstants.SUPPORTS_GINGERBREAD)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;new LegacyStrictMode().enableStrictMode();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;
&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
}&lt;/code&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10735231-6598490737852970783?l=blog.radioactiveyak.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheRadioactiveYak?a=PMowV_kysvU:4I6xdN0KnRg:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheRadioactiveYak?i=PMowV_kysvU:4I6xdN0KnRg:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheRadioactiveYak?a=PMowV_kysvU:4I6xdN0KnRg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheRadioactiveYak?i=PMowV_kysvU:4I6xdN0KnRg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheRadioactiveYak/~4/PMowV_kysvU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.radioactiveyak.com/feeds/6598490737852970783/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.radioactiveyak.com/2011/06/deep-dive-into-location-part-2-being.html#comment-form" title="13 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10735231/posts/default/6598490737852970783?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10735231/posts/default/6598490737852970783?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheRadioactiveYak/~3/PMowV_kysvU/deep-dive-into-location-part-2-being.html" title="A Deep Dive Into Location Part 2: Being Psychic and Staying Smooth" /><author><name>Reto Meier</name><uri>https://profiles.google.com/111169963967137030210</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-FnQer4-BRHE/AAAAAAAAAAI/AAAAAAAAhdQ/hYIqsdGTYgA/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-PefCn1EZdf0/Tgn9cBxjdwI/AAAAAAAAZEE/8l226oSai6Q/s72-c/small_psychic.png" height="72" width="72" /><thr:total>13</thr:total><georss:featurename>Mountain View, CA, USA</georss:featurename><georss:point>37.42023318154008 -122.08377723411559</georss:point><georss:box>37.36356018154007 -122.12037223411559 37.47690618154008 -122.04718223411558</georss:box><feedburner:origLink>http://blog.radioactiveyak.com/2011/06/deep-dive-into-location-part-2-being.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkUGRn4yeCp7ImA9WhZbGEs.&quot;"><id>tag:blogger.com,1999:blog-10735231.post-5921742259434594141</id><published>2011-06-23T22:23:00.000+01:00</published><updated>2011-06-23T22:23:47.090+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-23T22:23:47.090+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="deepdive" /><category scheme="http://www.blogger.com/atom/ns#" term="protips" /><category scheme="http://www.blogger.com/atom/ns#" term="android" /><title>How to Build Location-Based Apps That Don't Suck</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
If I were forced to choose between a smartphone that could make / receive voice calls, and one with Google Maps - I would choose Maps without blinking.  &lt;br /&gt;
&lt;br /&gt;
&lt;strike&gt;Here&lt;/strike&gt; Back in London, getting a reliable 3G connection is a challenge at the best of times - getting one while sat in most venues is about as likely as a South West Trains running a good service. So it doesn't help when I go to view details for, checkin, or review a location and a lack of 3G signal thwarts my efforts.&lt;br /&gt;
&lt;br /&gt;
Whether it's opening a FourSquare app to checkin, or Qype / Zagat / Where to choose where to eat, or the London Cycle Hire Widget to find a Boris Bike - I always feel like a douche standing around with my phone in my hand for half a minute while my phone gets a GPS fix and downloads the nearest locations.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;High latency and a lack of offline support in location-based mobile apps is a blight that must be cleansed&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Rather than (or indeed: after) shaking my fist at the sky in impudent rage, I wrote &lt;a href="http://code.google.com/p/android-protips-location/"&gt;an open-source reference app&lt;/a&gt; that incorporates all of the tips, tricks, and cheats I know to reduce the time between opening an app and seeing an up-to-date list of nearby venues - as well as providing a reasonable level of offline support.&lt;br /&gt;
&lt;br /&gt;
You can find out more in the associated &lt;a href="http://android-developers.blogspot.com/2011/06/deep-dive-into-location.html"&gt;deep-dive into location&lt;/a&gt; on the Android Developer Blog.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Android Protips: Location Best Pratices&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
It should came as no surprise to learn that I've borrowed heavily from my &lt;a href="http://www.google.com/events/io/2011/sessions/android-protips-advanced-topics-for-expert-android-app-developers.html"&gt;Android Protips presentation&lt;/a&gt; from Google I/O. Including (but not limited to) using &lt;a href="http://developer.android.com/reference/android/location/LocationManager.html#requestLocationUpdates(long, float, android.location.Criteria, android.app.PendingIntent)"&gt;Intents to receive location updates&lt;/a&gt;, using the &lt;a href="http://developer.android.com/reference/android/location/LocationManager.html#PASSIVE_PROVIDER"&gt;Passive Location Provider&lt;/a&gt;, using Intents to passively receive location updates when your app isn't active, monitoring device state to vary refresh rate, &lt;a href="http://developer.android.com/reference/android/content/pm/PackageManager.html#setComponentEnabledSetting(android.content.ComponentName, int, int)"&gt;toggling your manifest Receivers&lt;/a&gt; at runtime, and using the &lt;a href="http://developer.android.com/reference/android/content/CursorLoader.html"&gt;CursorLoader&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;But Wait There's More!&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
The post on the &lt;a href="http://android-developers.blogspot.com/2011/06/deep-dive-into-location.html"&gt;Android Developer Blog&lt;/a&gt; focusses on freshness - I'll be posting another deep-dive into the code that examines how I've made the app psychic and smooth on this blog early next week. Stay tuned.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10735231-5921742259434594141?l=blog.radioactiveyak.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheRadioactiveYak?a=iox-CInQREg:1u3bXy_aS-4:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheRadioactiveYak?i=iox-CInQREg:1u3bXy_aS-4:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheRadioactiveYak?a=iox-CInQREg:1u3bXy_aS-4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheRadioactiveYak?i=iox-CInQREg:1u3bXy_aS-4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheRadioactiveYak/~4/iox-CInQREg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.radioactiveyak.com/feeds/5921742259434594141/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.radioactiveyak.com/2011/06/how-to-build-location-based-apps-that.html#comment-form" title="11 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10735231/posts/default/5921742259434594141?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10735231/posts/default/5921742259434594141?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheRadioactiveYak/~3/iox-CInQREg/how-to-build-location-based-apps-that.html" title="How to Build Location-Based Apps That Don't Suck" /><author><name>Reto Meier</name><uri>https://profiles.google.com/111169963967137030210</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-FnQer4-BRHE/AAAAAAAAAAI/AAAAAAAAhdQ/hYIqsdGTYgA/s512-c/photo.jpg" /></author><thr:total>11</thr:total><georss:featurename>Mountain View, CA, USA</georss:featurename><georss:point>37.420248419962654 -122.08380973414614</georss:point><georss:box>37.36357541996265 -122.12040473414615 37.47692141996266 -122.04721473414614</georss:box><feedburner:origLink>http://blog.radioactiveyak.com/2011/06/how-to-build-location-based-apps-that.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUMARXwzfyp7ImA9WhZVE08.&quot;"><id>tag:blogger.com,1999:blog-10735231.post-4668541232014626820</id><published>2011-05-25T12:37:00.000+01:00</published><updated>2011-05-25T12:37:24.287+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-25T12:37:24.287+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="io2011" /><category scheme="http://www.blogger.com/atom/ns#" term="android" /><title>Answers to Unanswered Questions from the I/O Protips Q&amp;A</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;There's never enough time for Q&amp;amp;A at the end of an I/O session - particularly when the session is immediately followed by lunch. In an effort to remedy this, here are the answers to most of the questions that were entered onto the Moderator page for my &lt;a href="http://goo.gl/rbEch"&gt;Android Protips talk&lt;/a&gt;.&lt;br /&gt;
&lt;ol&gt;&lt;i&gt;Eclipse is a wonderful development tool. However sometimes it is clunky. Generic error messages, mysteriously build problems solved by quitting &amp;amp; relaunching, etc. Do you ever get frustrated with Eclipse? Do you have any tips of working with Eclipse?&lt;/i&gt;&lt;/ol&gt;I do! Almost as much as I was frustrated by Visual Studio in a previous life spent writing C# Winform GUIs. I don't have any specific tips beyond the things that work with mode IDEs. Frequently restart and make sure you're using the latest stable build along with the latest version of the ADT.&lt;br /&gt;
&lt;ol&gt;&lt;i&gt;Do you have any tips for working with SQLite databases through eclipse? At the minute I rely on external tools to view data that is in the database on the phone to debug problem. This means manually copying it off the device. Any tips?&lt;/i&gt;&lt;/ol&gt;You can use the &lt;a href="http://developer.android.com/guide/developing/tools/adb.html#sqlite"&gt;sqlite3&lt;/a&gt; command line tool to examine SQLite databases on the phone. It's not built into Eclipse but might save you the extra work of pulling the database off the device first.&lt;br /&gt;
&lt;ol&gt;&lt;i&gt;Do the developers at Google use any hardware emulators to speed up development. If so, can you please recommend some. The soft emulator is too slow.&lt;/i&gt;&lt;/ol&gt;Unfortunately not. Generally we'll be working towards the release of the new platform on a given piece of hardware, so the internal teams will use that rather than an emulator where appropriate / applicable.&lt;br /&gt;
&lt;ol&gt;&lt;i&gt;Will there be a faster Android device emulator anytime soon?&lt;/i&gt;&lt;/ol&gt;Yes! Check out this session on &lt;a href="http://www.google.com/events/io/2011/sessions/android-development-tools.html"&gt;Android Development Tools&lt;/a&gt; for a preview.&lt;br /&gt;
&lt;ol&gt;&lt;i&gt;Is there a suite of AVDs for Eclipse that emulate actual devices?&lt;/i&gt;&lt;/ol&gt;Some manufacturers make AVDs available for actual devices (I believe Samsung provide an &lt;a href="http://www.google.com/url?sa=D&amp;amp;q=http://innovator.samsungmobile.com/galaxyTab.do"&gt;AVD&lt;/a&gt; for the 7" Galaxy Tab). Generally speaking, no - there's no central repository or suite of all actual device AVDs.&lt;br /&gt;
&lt;ol&gt;&lt;i&gt;Will there soon be a legitimate way to replace the Android lockscreen (with a lockscreen application)?&lt;/i&gt;&lt;/ol&gt;Due to the security implications, I'm not aware of any plans to make the lock screen (or in-call screen) replaceable. &lt;br /&gt;
&lt;ol&gt;&lt;i&gt;You mentioned better not to loose your signing key. But how to update your app, when your certificate expired?&lt;/i&gt;&lt;/ol&gt;For now, certificates used to sign apps launched in the Android Market need to expire after 22 October 2033. We'll have a solution for replacing these certificates in place well before 2033 :)&lt;br /&gt;
&lt;ol&gt;&lt;i&gt;What's the recommended way to implement a horizontally scrolling, virtualized list?&lt;/i&gt;&lt;/ol&gt;No simple answer here as it depends on the kind of data you're displaying, how long your list is, and what the best user experience would be. There are some good articles online (including &lt;a href="http://stackoverflow.com/questions/1080811/android-endless-list"&gt;this answer on Stack Overflow&lt;/a&gt;) that explain how to create a virtual list in a ListView, but you can use a similar technique within a Gallery or even a HorizontalScrollView to achieve a horizontal virtualized scrolling list.&lt;br /&gt;
&lt;ol&gt;&lt;i&gt;Are Shared Preferences the bast way to store small piece of data?&lt;/i&gt;&lt;/ol&gt;It depends on what kind of small data you're storing. Shared Preferences are the best way to store user preferences and Activity / Application state information. &lt;br /&gt;
&lt;ol&gt;&lt;i&gt;A view from one app needs to be updated by another app. Can't use the widget paradigm, is there any other way?&lt;/i&gt;&lt;/ol&gt;This depends on a number of factors. Are both apps written by you, or is one a third party? How dramatic are the changes? New layouts or changed text in a TextView?&lt;br /&gt;
&lt;br /&gt;
Generally speaking, the best approach is likely to be a &lt;a href="http://developer.android.com/reference/android/content/Context.html#sendBroadcast(android.content.Intent)"&gt;Broadcast Intent&lt;/a&gt;. You can package the data that will be used to update the View in the "other" app by including them as extras. The "other" app simply registers a &lt;a href="http://developer.android.com/reference/android/content/BroadcastReceiver.html"&gt;Broadcast Receiver&lt;/a&gt; that listens for the Intent, extracts the data, and updates its view accordingly.&lt;br /&gt;
&lt;ol&gt;&lt;i&gt;How would you test/optimize the apps that are not meant for the Android Market?&lt;/i&gt;&lt;/ol&gt;The principle of using Analytics for tracking bugs and doing A/B testing works just as well internally as it would on apps that will launch in Market. The biggest difference is distribution. Given the ability to side-load apps onto most Android devices, I'd most likely setup an internal website that would host the APKs you want to distribute for the Beta test.&lt;br /&gt;
&lt;ol&gt;&lt;i&gt;How can we know if a certain service is already running?&lt;/i&gt;&lt;/ol&gt;You can bind to a Service using &lt;a href="http://developer.android.com/reference/android/content/Context.html#bindService(android.content.Intent, android.content.ServiceConnection, int)"&gt;bindService&lt;/a&gt; without starting the Service. The &lt;a href="http://developer.android.com/reference/android/content/ServiceConnection.html"&gt;Service Connection&lt;/a&gt; you pass in to bindService will notify you using its onServiceConnected and onServiceDisconnected handlers when the Service starts and stops. You can use those callbacks to set a variable within your code to check if the Service is running at any given time.&lt;br /&gt;
&lt;ol&gt;&lt;i&gt;Is there any option to backup the default SharedPreferences via BackupManager? Do I have to use the packagename?&lt;/i&gt;&lt;/ol&gt;The default SharedPreferences file getSharedPreferences uses the Activity's class name as the preferences name.&lt;br /&gt;
&lt;ol&gt;&lt;i&gt;Is there a way for accessories to "push" an embedded app or service package to the device so that specialized services for certain types of accessories will be able to automatically add functionality to the device when connected?&lt;/i&gt;&lt;/ol&gt;As part of the process of &lt;a href="http://developer.android.com/guide/topics/usb/adk.html#start"&gt;starting the device in accessory mode&lt;/a&gt;, you send identifying string information to the device. This information allows the device to figure out an appropriate application for this accessory and also present the user with a URL if an appropriate application does not exist. It won't install the package for you, but it will prompt the user to download it.&lt;br /&gt;
&lt;ol&gt;&lt;i&gt;Just to make sure, now we can send requests to the devices in order to update the info, instead of having the refresh intervals?&lt;/i&gt;&lt;/ol&gt;That's right, you can use &lt;a href="http://code.google.com/android/c2dm/index.html"&gt;Cloud to Device Messaging&lt;/a&gt; to ping a device when it needs to perform an update.&lt;br /&gt;
&lt;ol&gt;&lt;i&gt;When will we have a UI Builder that is par to what we get for iPhone?!&lt;/i&gt;&lt;/ol&gt;Check out this session on &lt;a href="http://www.google.com/events/io/2011/sessions/android-development-tools.html"&gt;Android Development Tools&lt;/a&gt; for a preview of some of the cool stuff the tools team have been working on.&lt;br /&gt;
&lt;ol&gt;&lt;i&gt;Can you describe your video and control hookup for your android tablet?&lt;/i&gt;&lt;/ol&gt;I wrote a blog post that &lt;a href="http://blog.radioactiveyak.com/2011/05/android-protips-at-io-session-video-and.html"&gt;describes the video and control hookup&lt;/a&gt; I used to do my presentation using a pair of Motorola Xooms.&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10735231-4668541232014626820?l=blog.radioactiveyak.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheRadioactiveYak?a=HdyL0mu4Wso:QU4F6OOH8us:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheRadioactiveYak?i=HdyL0mu4Wso:QU4F6OOH8us:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheRadioactiveYak?a=HdyL0mu4Wso:QU4F6OOH8us:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheRadioactiveYak?i=HdyL0mu4Wso:QU4F6OOH8us:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheRadioactiveYak/~4/HdyL0mu4Wso" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.radioactiveyak.com/feeds/4668541232014626820/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.radioactiveyak.com/2011/05/answers-to-unanswered-questions-from-io.html#comment-form" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10735231/posts/default/4668541232014626820?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10735231/posts/default/4668541232014626820?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheRadioactiveYak/~3/HdyL0mu4Wso/answers-to-unanswered-questions-from-io.html" title="Answers to Unanswered Questions from the I/O Protips Q&amp;A" /><author><name>Reto Meier</name><uri>https://profiles.google.com/111169963967137030210</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-FnQer4-BRHE/AAAAAAAAAAI/AAAAAAAAhdQ/hYIqsdGTYgA/s512-c/photo.jpg" /></author><thr:total>6</thr:total><feedburner:origLink>http://blog.radioactiveyak.com/2011/05/answers-to-unanswered-questions-from-io.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0QAQXY6eyp7ImA9WhZVEUs.&quot;"><id>tag:blogger.com,1999:blog-10735231.post-1885012700486990567</id><published>2011-05-23T16:21:00.001+01:00</published><updated>2011-05-23T16:42:20.813+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-23T16:42:20.813+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="piracy" /><category scheme="http://www.blogger.com/atom/ns#" term="publishing" /><title>My Attitude Towards Piracy of My Book</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;The short answer: &lt;i&gt;I am against it&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
Lest I be accused of bias, that goes for every book - not just the ones that result in a couple of bucks landing in my pocket.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;The long answer&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
I was surprised recently when asked via email what my attitude was towards piracy of my book, and if an online donation might work as a "last resort" way for pirates to show their appreciation for my work.&lt;br /&gt;
&lt;br /&gt;
For the record, I am a big supporter of making my book available in as many formats as possible. That's why I'm impressed that Wrox books are now available on &lt;a href="http://www.amazon.com/Professional-Android-Application-Development-ebook/dp/B004BA574Y/ref=tmm_kin_title_0?ie=UTF8&amp;m=AG56TWVU5XWC2&amp;qid=1306155732&amp;sr=8-1"&gt;Kindle&lt;/a&gt;, &lt;a href="https://market.android.com/details?id=book-ewMdnKNYfOsC"&gt;Google Books&lt;/a&gt;, &lt;a href="http://my.safaribooksonline.com/9780470565520?cid=shareLink"&gt;Safari&lt;/a&gt;, and &lt;a href="http://www.wrox.com/WileyCDA/WroxTitle/Professional-Android-2-Application-Development.productCd-0470637455.html"&gt;PDF eBooks&lt;/a&gt;. I get a royalty no-matter where you buy it from, so if you want a copy pick wherever offers the cheapest price for the format you prefer.&lt;br /&gt;
&lt;br /&gt;
I'm also &lt;i&gt;against&lt;/i&gt; DRM - I believe that DRM does nothing to prevent piracy while annoying the folks who legitimately paid for the content - so I was also thrilled with Wrox's decision to &lt;a href="http://p2p.wrox.com/content/blogs/jminatel/wrox-pdf-ebooks-drm-free"&gt;make their eBooks DRM free&lt;/a&gt;. &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Your book is expensive: Do you have a donate link anywhere to show my appreciation but save a few bucks?&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
I can't speak for anyone else, but I don't write my books for the money. The advance and royalties go some way to compensating for the significant time and effort it takes to get the books written - but for me at least, it's not going to make me rich or let me give up my day job.&lt;br /&gt;
&lt;br /&gt;
More importantly I don't write in a vacuum. Books cost money to make. I'm not talking about the paper, printing, and transport costs, I'm talking about all the people who were involved in making my book the best it could be.&lt;br /&gt;
&lt;br /&gt;
There are 17 people on the &lt;a href="http://books.google.com/books?id=ewMdnKNYfOsC&amp;lpg=PP1&amp;dq=reto%20meier&amp;pg=PR9#v=onepage&amp;q&amp;f=false"&gt;"Credits" page&lt;/a&gt; for Professional Android 2 Application Development. They are not vanity credits. As an example, the following folks are the ones on that list who I had direct, repeated email contact with over the course of writing the book. Apologies to those I left out - they are equally important to the process. &lt;br /&gt;
&lt;ul style="text-align: left;"&gt;&lt;li&gt;Scott Meyers (Acquisitions Editor) suggested I write a second edition and shepherded it through the process.&lt;/li&gt;
&lt;li&gt;William Bridges (Project Editor) made sure I handed in chapters on something resembling a schedule (without him I'd still be working on the 1st edition), as well as dispensing invaluable advice on everything from book and chapter structure to clarity and semi-colon use.&lt;/li&gt;
&lt;li&gt;Milan Shah (Technical Editor) reduced the number of bugs in my code.&lt;/li&gt;
&lt;li&gt;Sadie Kleinman (Copy Editor) corrected my comma use, spelling errors, grammatical issues, and generally ensured I didn't embarrass myself.&lt;/li&gt;
&lt;li&gt;Mary Beth Wakefield (Editorial Manager) kept it all together when things got chaotic.&lt;/li&gt;
&lt;li&gt;Kyle Schlesinger (Proofreader) ensured nothing slipped past us during the many edits and revisions before it went to print.&lt;/li&gt;
&lt;li&gt;Michael Trent (Cover Designer) gave us the awesome Terminator cover (image by Linda Bucklin).&lt;/li&gt;
&lt;li&gt;Robert Swanson (Indexer) provided a way to find things without a photographic memory.&lt;/li&gt;
&lt;li&gt;David Mayhew (Marketing) made sure it was available from wherever people wanted to buy it.&lt;/li&gt;
&lt;/ul&gt;These folks are an absolutely essential part of the writing process, and they don't work for free. Nor should they. There is a really simple way to show your appreciation for all the people involved in writing a book. Buy it.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Sure, but I need to know what the book teaches for my job / class, but I don't have the money to buy it.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Good news! You don't have to! At the risk of hurting my own sales, you don't need to buy my book to learn how to develop Android apps. I mentioned this during my Android Protips talk: Google aren't trying to keep this information a secret. There's a huge amount of information available online including:&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;&lt;li&gt;The &lt;a href="http://developer.android.com"&gt;Android Developer Site&lt;/a&gt; and &lt;a href="http://android-developers.blogspot.com/"&gt;Developer Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.google.com/events/io/2011/sessions.html#android-track"&gt;Talks and slides&lt;/a&gt; from Google I/O&lt;/li&gt;
&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/tagged/android"&gt;Android Questions&lt;/a&gt; at StackOverflow&lt;/li&gt;
&lt;li&gt;The &lt;a href="http://developer.android.com/resources/community-groups.html"&gt;Android Developer Forums&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;Many people find the structured, consistent, and guided form of a book to be a great way to learn new material. Others find books a more useful reference while working. If you're one of those people, and you want to be able to continue using books in such a way, buying them is the only way to help ensure that will happen.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;What are your thoughts on 2nd hand books and libraries?&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Bring them on! I've probably bought 1,000 books in my life - of which more than half are 2nd hand, and I've probably borrowed a few hundred from libraries too.&lt;br /&gt;
&lt;br /&gt;
Electronic books introduce new challenges to the 2nd hand book market and libraries. I'm firmly on the side that says that the rights we have with paper books should be mirrored in the electronic publishing age. If you're done with a book you should be able to sell it, loan it, or give it away without restriction.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;If everyone downloads pirated PDFs of books instead of buying them, publishers will stop&amp;nbsp;publishing&amp;nbsp;them.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Without a publisher many books won't get written or released. I don't have the time, money, skills, or inclination necessary to produce a book of sufficient quality on my own. I need the 17 people on the credits page (and several more besides) to publish each new book or revision.&lt;br /&gt;
&lt;br /&gt;
Writing isn't my livelihood, so as an author the end of publishing would be a serious disappointment, but I'd just stop writing and get on with my day job. &lt;br /&gt;
&lt;br /&gt;
As a reader? I can barely imagine a future so grim.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10735231-1885012700486990567?l=blog.radioactiveyak.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheRadioactiveYak?a=h0zvJ26u7d0:PivjZKiUoTQ:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheRadioactiveYak?i=h0zvJ26u7d0:PivjZKiUoTQ:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheRadioactiveYak?a=h0zvJ26u7d0:PivjZKiUoTQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheRadioactiveYak?i=h0zvJ26u7d0:PivjZKiUoTQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheRadioactiveYak/~4/h0zvJ26u7d0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.radioactiveyak.com/feeds/1885012700486990567/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.radioactiveyak.com/2011/05/my-attitude-towards-piracy-of-my-book.html#comment-form" title="8 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10735231/posts/default/1885012700486990567?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10735231/posts/default/1885012700486990567?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheRadioactiveYak/~3/h0zvJ26u7d0/my-attitude-towards-piracy-of-my-book.html" title="My Attitude Towards Piracy of My Book" /><author><name>Reto Meier</name><uri>https://profiles.google.com/111169963967137030210</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-FnQer4-BRHE/AAAAAAAAAAI/AAAAAAAAhdQ/hYIqsdGTYgA/s512-c/photo.jpg" /></author><thr:total>8</thr:total><feedburner:origLink>http://blog.radioactiveyak.com/2011/05/my-attitude-towards-piracy-of-my-book.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkQMRH44fyp7ImA9WhZWFUg.&quot;"><id>tag:blogger.com,1999:blog-10735231.post-1639050158505108097</id><published>2011-05-16T13:53:00.000+01:00</published><updated>2011-05-16T13:53:05.037+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-16T13:53:05.037+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="protips" /><category scheme="http://www.blogger.com/atom/ns#" term="android" /><category scheme="http://www.blogger.com/atom/ns#" term="Google I/O" /><title>Android Protips: Where to Download the Slides and Code Snippets</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;For those of you who want to take a closer look at my Android Protips session for Google I/O, you can now enjoy the video, slides, and code snippets in whichever format you prefer:&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;&lt;li&gt;The slides are now &lt;a href="https://docs.google.com/viewer?a=v&amp;amp;pid=explorer&amp;amp;chrome=true&amp;amp;srcid=0BwzqfgMC33l-ZWUzNTE5OTktYTY2Yy00Nzc1LTkzZjktZjg1MWU5MGZmYmVi&amp;amp;hl=en_GB"&gt;available for viewing and downloading&lt;/a&gt;&amp;nbsp;(as a PDF from Google Docs).&lt;/li&gt;
&lt;li&gt;The slides are also available on &lt;a href="http://www.slideshare.net/retomeier/android-protips-advanced-topics-for-expert-android-app-developers-7979013#"&gt;SlideShare&lt;/a&gt; for viewing and embedding.&lt;/li&gt;
&lt;li&gt;The code snippets are posted at&amp;nbsp;&lt;a href="https://docs.google.com/document/d/1xaz7J9wjVMIDsa8bSQNBmhpTWGBkvDax83sSLfNof5w/edit?hl=en_GB"&gt;Android Protips: The Code Snippets&lt;/a&gt;&amp;nbsp;for your copy/paste pleasure.&lt;/li&gt;
&lt;li&gt;The&amp;nbsp;&lt;a href="http://www.youtube.com/watch?v=twmuBbC_oB8"&gt;session video&lt;/a&gt; is on YouTube&amp;nbsp;(the only way you get to watch the awesome cartoons!)&lt;/li&gt;
&lt;li&gt;After a brief outage, details on &lt;a href="http://blog.radioactiveyak.com/2011/05/android-protips-at-io-session-video-and.html"&gt;the software I wrote to do the presentation&lt;/a&gt; are back up.&lt;/li&gt;
&lt;/ul&gt;One of the nice things about SlideShare is that it lets you embed slideshows into your blog post:&lt;br /&gt;
&lt;br /&gt;
&lt;div id="__ss_7979013" style="width: 595px;"&gt;&lt;object height="380" id="__sse7979013" width="600"&gt; &lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=androidprotipsadvancedtopicsforexpertandroidappdevelopers-110516052836-phpapp02&amp;stripped_title=android-protips-advanced-topics-for-expert-android-app-developers-7979013&amp;userName=retomeier" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse7979013" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=androidprotipsadvancedtopicsforexpertandroidappdevelopers-110516052836-phpapp02&amp;stripped_title=android-protips-advanced-topics-for-expert-android-app-developers-7979013&amp;userName=retomeier" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="600" height="380"&gt;&lt;/embed&gt; &lt;/object&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;
I plan to do a series of more blog posts that dig into some of the topics I cover in the presentation in more detail. Where do you guys think I should start?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10735231-1639050158505108097?l=blog.radioactiveyak.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheRadioactiveYak?a=0jywuYAp-N4:Ft7apVbVbyM:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheRadioactiveYak?i=0jywuYAp-N4:Ft7apVbVbyM:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheRadioactiveYak?a=0jywuYAp-N4:Ft7apVbVbyM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheRadioactiveYak?i=0jywuYAp-N4:Ft7apVbVbyM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheRadioactiveYak/~4/0jywuYAp-N4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.radioactiveyak.com/feeds/1639050158505108097/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.radioactiveyak.com/2011/05/android-protips-where-to-download.html#comment-form" title="10 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10735231/posts/default/1639050158505108097?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10735231/posts/default/1639050158505108097?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheRadioactiveYak/~3/0jywuYAp-N4/android-protips-where-to-download.html" title="Android Protips: Where to Download the Slides and Code Snippets" /><author><name>Reto Meier</name><uri>https://profiles.google.com/111169963967137030210</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-FnQer4-BRHE/AAAAAAAAAAI/AAAAAAAAhdQ/hYIqsdGTYgA/s512-c/photo.jpg" /></author><thr:total>10</thr:total><feedburner:origLink>http://blog.radioactiveyak.com/2011/05/android-protips-where-to-download.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE8NRXwzeCp7ImA9WhZWFUg.&quot;"><id>tag:blogger.com,1999:blog-10735231.post-5624554706460300003</id><published>2011-05-16T07:00:00.001+01:00</published><updated>2011-05-16T14:34:54.280+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-16T14:34:54.280+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="protips" /><category scheme="http://www.blogger.com/atom/ns#" term="android" /><category scheme="http://www.blogger.com/atom/ns#" term="Google I/O" /><title>Android Protips at I/O: The Session Video (and How I Presented It)</title><content type="html">&lt;b&gt;[Update 16/May: Reposted after Blogger outage]&lt;br /&gt;
[Update 2: Working links to the sessions slides are &lt;a href="http://blog.radioactiveyak.com/2011/05/android-protips-where-to-download.html"&gt;available from here&lt;/a&gt;]&lt;/b&gt;&lt;br /&gt;
&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Another Google I/O, another jam-packed Android session room. This year they nearly doubled the room capacity for the main Android track making space for 1,000 seats. That still wasn't enough though - once again people were sitting on the floor and lining up to get in.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Android Protips: Advanced Topics for Expert Android Developers&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
After delivering my Android Best Practices for Beginners for the better part of last year, I was really excited to take things up a notch and deliver some real advanced content. To push things one step further, I presented my session using a pair of Xoom tablets. More on that after the video.&lt;br /&gt;
&lt;br /&gt;
&lt;object height="371" width="600"&gt;&lt;param name="movie" value="http://www.youtube.com/v/twmuBbC_oB8?fs=1&amp;amp;hl=en_US&amp;amp;hd=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/twmuBbC_oB8?fs=1&amp;amp;hl=en_US&amp;amp;hd=1" type="application/x-shockwave-flash" width="600" height="371" allowscriptaccess="always" allowfullscreen="true"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;
&lt;br /&gt;
The awesome video content was created for me by an old friend of mine (he's still young, but we've been friends since high school) Victor Wycoco - thanks Victor!&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;How did you do that?&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
There were a lot of questions on Twitter asking:&lt;br /&gt;
&lt;ol style="text-align: left;"&gt;&lt;li&gt;What app did I use to do the presentation using an Android tablet&lt;/li&gt;
&lt;li&gt;How did I live tweet my own presentation in real time?&lt;/li&gt;
&lt;li&gt;How did I not re-tweet everything when the tablet rebooted?&lt;/li&gt;
&lt;/ol&gt;I'm an engineer so (of course) I took this as an &lt;strike&gt;excuse&lt;/strike&gt; opportunity to write an app that does the former and built in functionality to do the latter (and come on — you think I didn't consider the case of having to restart? Please.)&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;How does it work?&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
One app, running on two tablets, both running Android 3.1 (with USB hostmode support) connected via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
Tablet one was wired up with HDMI out and a USB-connected clicker let me transition between slides. I added a "finger paint" View with a transparent background on top of the ImageView that displayed each slide which let me do the real-time annotations.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-_kBzphO-IvA/TcrVzagHVFI/AAAAAAAAUs4/YkLcHrWcxzI/s1600/LiveView_With_Border.png" imageanchor="1" style="margin-left: 0em; margin-right: 0em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-_kBzphO-IvA/TcrVzagHVFI/AAAAAAAAUs4/YkLcHrWcxzI/s1600/LiveView_With_Border.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
A second device (out of sight on the lectern) showed me my "Speaker View": My speaker notes, the current / next slide preview, my pre-written live tweets, and a countdown timer. &lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-WDd74b40NS0/TcrWD0nTK1I/AAAAAAAAUtA/iVyMN7HOQ_A/s1600/SpeakerView_With_Border.png" imageanchor="1" style="margin-left: 0em; margin-right: 0em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-WDd74b40NS0/TcrWD0nTK1I/AAAAAAAAUtA/iVyMN7HOQ_A/s1600/SpeakerView_With_Border.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
The two devices were paired and connected over Bluetooth, with the speaker view tablet set up as a slave to the presentation device. Whenever the display tablet transitioned slides, it transmitted the current slide to the speaker view tablet. It works the other way around too, so I can transition slides on the speaker view and have the live view update accordingly.&lt;br /&gt;
&lt;br /&gt;
The tweeting happened on the speaker view tablet based on slide transitions (with a button for me to disable it if — for example — I had to restart half way through). I connected this one to a wired ethernet connection using a USB to ethernet dongle to avoid the notorious conference wifi syndrome.&lt;br /&gt;
&lt;br /&gt;
I've got a bunch of ideas I'd like to incorporate (particularly around remote viewing), but ran out of time before I/O to get them implemented. &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Can I Get the App? Can I See the Source?&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Yes and yes. I need to make a few improvements before I release it on the Android Market and I need to refactor and tidy the code before I open source it. In the mean time I'll do a couple more posts the go into more detail on how each of the components work. Stay tuned.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10735231-5624554706460300003?l=blog.radioactiveyak.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheRadioactiveYak?a=ywIuuqidsfw:WuwxOqIGE2E:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheRadioactiveYak?i=ywIuuqidsfw:WuwxOqIGE2E:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheRadioactiveYak?a=ywIuuqidsfw:WuwxOqIGE2E:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheRadioactiveYak?i=ywIuuqidsfw:WuwxOqIGE2E:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheRadioactiveYak/~4/ywIuuqidsfw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.radioactiveyak.com/feeds/5624554706460300003/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.radioactiveyak.com/2011/05/android-protips-at-io-session-video-and.html#comment-form" title="18 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10735231/posts/default/5624554706460300003?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10735231/posts/default/5624554706460300003?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheRadioactiveYak/~3/ywIuuqidsfw/android-protips-at-io-session-video-and.html" title="Android Protips at I/O: The Session Video (and How I Presented It)" /><author><name>Reto Meier</name><uri>https://profiles.google.com/111169963967137030210</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-FnQer4-BRHE/AAAAAAAAAAI/AAAAAAAAhdQ/hYIqsdGTYgA/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-_kBzphO-IvA/TcrVzagHVFI/AAAAAAAAUs4/YkLcHrWcxzI/s72-c/LiveView_With_Border.png" height="72" width="72" /><thr:total>18</thr:total><feedburner:origLink>http://blog.radioactiveyak.com/2011/05/android-protips-at-io-session-video-and.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkMBQX06cSp7ImA9WhZXGUQ.&quot;"><id>tag:blogger.com,1999:blog-10735231.post-8424889524545241945</id><published>2011-05-10T04:34:00.000+01:00</published><updated>2011-05-10T04:34:10.319+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-10T04:34:10.319+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="io2011" /><category scheme="http://www.blogger.com/atom/ns#" term="android" /><title>How to Get Your Android Protips</title><content type="html">I/O is always a great couple of days, and after last year's jam-packed Android room they've doubled our capacity and given us space for 1,000 folks in the audience. As if that wasn't enough, we're also live streaming the Android (and Chrome) sessions for your viewing pleasure.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;What Am I Presenting and How Can You Watch?&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
I'm presenting &lt;i&gt;Android Protips: Advanced Topics for Expert Android Developers&lt;/i&gt; at 11:30am PDT in room 11 up on the top floor (next to the keynote room) for those of you lucky enough to be at I/O in person.&lt;br /&gt;
&lt;br /&gt;
If you're not here, you can still watch my session live as it's going to be &lt;a href="http://www.google.com/events/io/2011/index.html"&gt;live streamed across the intertubes&lt;/a&gt; (Stay tuned: that page will update when I/O starts in a few short hours). &lt;br /&gt;
&lt;br /&gt;
If you are planning to tune in, that's 7:30pm BST and an ungodly 4:30am on the East coast of Australia.&lt;br /&gt;
&lt;br /&gt;
If you've got questions, and won't be in the audience, you can pose them (and vote for others) on &lt;a href="http://goo.gl/mod/oLus"&gt;the session's moderator page&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
I'm also going to try &lt;a href="http://www.twitter.com/retomeier"&gt;live-tweeting&lt;/a&gt; my own presentation using an Android app I've been working on for presentations (more on that later).&lt;br /&gt;
&lt;br /&gt;
Once I'm done, the recorded video and slides will be available on the &lt;a href="http://goo.gl/rbEch"&gt;Android Protips session page&lt;/a&gt;. I'll also post a link to the code snippets for your copy/paste pleasure.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;If You Just Can't Get Enough (or You Want to Know How to Avoid Bumping in to Me)&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
I'm also co-hosting "Web Apps versus Native" on Wednesday afternoon with Michael Mahemoff. Should be a good way to wind down after a long couple of days. When I'm not on stage I'll be hanging out at the Android office hours, so be sure to stop by and say hi!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10735231-8424889524545241945?l=blog.radioactiveyak.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheRadioactiveYak?a=aLaxaVcw-lo:NMy_W4Baq3Y:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheRadioactiveYak?i=aLaxaVcw-lo:NMy_W4Baq3Y:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheRadioactiveYak?a=aLaxaVcw-lo:NMy_W4Baq3Y:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheRadioactiveYak?i=aLaxaVcw-lo:NMy_W4Baq3Y:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheRadioactiveYak/~4/aLaxaVcw-lo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.radioactiveyak.com/feeds/8424889524545241945/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.radioactiveyak.com/2011/05/how-to-get-your-android-protips.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10735231/posts/default/8424889524545241945?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10735231/posts/default/8424889524545241945?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheRadioactiveYak/~3/aLaxaVcw-lo/how-to-get-your-android-protips.html" title="How to Get Your Android Protips" /><author><name>Reto Meier</name><uri>https://profiles.google.com/111169963967137030210</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-FnQer4-BRHE/AAAAAAAAAAI/AAAAAAAAhdQ/hYIqsdGTYgA/s512-c/photo.jpg" /></author><thr:total>3</thr:total><feedburner:origLink>http://blog.radioactiveyak.com/2011/05/how-to-get-your-android-protips.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0UCQHg7eSp7ImA9WhZQGU8.&quot;"><id>tag:blogger.com,1999:blog-10735231.post-4450797187976535877</id><published>2011-04-27T17:19:00.001+01:00</published><updated>2011-04-27T17:21:01.601+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-27T17:21:01.601+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="twitter" /><category scheme="http://www.blogger.com/atom/ns#" term="android" /><title>Using Twitter4J to Tweet in Android</title><content type="html">So I'm working on a little project for Google I/O that requires, amongst other things, the ability to post status updates to Twitter from within an Android app. I asked about it on Twitter and a couple of people asked me to post the results (and associated code snippets) so here you go.&lt;br /&gt;
&lt;br /&gt;
I was hoping for a small code snippet that would let me do that without needing any third-party libraries, but the feedback from the lazy web suggested that jumping through the hoops of an OAuth implementation myself wasn't worth the effort.&lt;br /&gt;
&lt;br /&gt;
The wisdom of crowds suggested Twitter4J as a simple alternative - and as the following code snippet shows - the most simple case is pleasantly simple to implement.&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;Twitter twitter = new TwitterFactory().getInstance();&lt;br /&gt;
AccessToken a = new AccessToken(oauth_token, oauth_token_secret);&lt;br /&gt;
twitter.setOAuthConsumer(consumer_token, consumer_secret);&lt;br /&gt;
twitter.setOAuthAccessToken(a); &lt;br /&gt;
twitter.updateStatus("If you're reading this on Twitter, it worked!");&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
In this instance I'm the only one who'll be using the app, so I'm dropping an &lt;i&gt;auth token&lt;/i&gt; and &lt;i&gt;auth token secret&lt;/i&gt; unique to my own Twitter login rather than going through the process required to obtain a user-specific auth token. If that matches your use-case you can grab those values by clicking "My Access Token" on the Twitter developer site after you've registered your app.&lt;br /&gt;
&lt;br /&gt;
You can download &lt;a href="http://twitter4j.org/en/index.html"&gt;Twitter4J for Android here&lt;/a&gt;. Then just add twitter4j-core-android-2.2.1.jar into your project as an external JAR.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10735231-4450797187976535877?l=blog.radioactiveyak.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheRadioactiveYak?a=G-TkToG-EbE:kKXLBZBDe3k:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheRadioactiveYak?i=G-TkToG-EbE:kKXLBZBDe3k:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheRadioactiveYak?a=G-TkToG-EbE:kKXLBZBDe3k:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheRadioactiveYak?i=G-TkToG-EbE:kKXLBZBDe3k:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheRadioactiveYak/~4/G-TkToG-EbE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.radioactiveyak.com/feeds/4450797187976535877/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.radioactiveyak.com/2011/04/using-twitter4j-to-tweet-in-android.html#comment-form" title="15 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10735231/posts/default/4450797187976535877?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10735231/posts/default/4450797187976535877?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheRadioactiveYak/~3/G-TkToG-EbE/using-twitter4j-to-tweet-in-android.html" title="Using Twitter4J to Tweet in Android" /><author><name>Reto Meier</name><uri>https://profiles.google.com/111169963967137030210</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-FnQer4-BRHE/AAAAAAAAAAI/AAAAAAAAhdQ/hYIqsdGTYgA/s512-c/photo.jpg" /></author><thr:total>15</thr:total><feedburner:origLink>http://blog.radioactiveyak.com/2011/04/using-twitter4j-to-tweet-in-android.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkcDRno6eyp7ImA9WhZRFk8.&quot;"><id>tag:blogger.com,1999:blog-10735231.post-8085458069534915710</id><published>2011-04-12T15:54:00.000+01:00</published><updated>2011-04-12T15:54:37.413+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-12T15:54:37.413+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="android" /><category scheme="http://www.blogger.com/atom/ns#" term="meta" /><title>I'm Saying Goodbye to London</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;b&gt;Where to next?&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Mountain View in&amp;nbsp;sunny California!&lt;br /&gt;
&lt;br /&gt;
Following this year's &lt;a href="http://www.google.com/events/io/2011/index.html"&gt;Google I/O&lt;/a&gt;, I'll be relocating to&amp;nbsp;the home of the &lt;a href="http://www.youtube.com/watch?v=Wa6oZtxQGBM&amp;feature=player_embedded"&gt;giant dessert sculpture garden&lt;/a&gt;, where I've been given the opportunity to take on the role of Tech Lead for the global &lt;a href="http://code.google.com/team/index.html?product=android"&gt;Android Developer Relations team&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
It's a chance for me to focus on some more strategic ideas and to work more closely with the core Android engineering team. It's a challenge I'm really looking forward to.&lt;br /&gt;
&lt;br /&gt;
I've spent the last 6 years in London - the last 2 working here at Google - and it's been an amazing experience. I'll be leaving the Android developers of EMEA in the very capable hands of &lt;a href="http://www.twitter.com/crafty"&gt;Nick Butcher&lt;/a&gt;,&amp;nbsp;&lt;a href="http://www.twitter.com/geekyouup"&gt;Richard Hyndman&lt;/a&gt;, and&amp;nbsp;&lt;a href="https://twitter.com/#!/sparkyrhode"&gt;Robert Rhode&lt;/a&gt;&amp;nbsp;- and I'll still visit, I'm particularly looking forward to this year's round of Google Developer Days.&lt;br /&gt;
&lt;br /&gt;
I'm still working at Google, and I'm still part of the Android team, so being based in Mountain View I'll have the opportunity to meet and work with some of our North American Android devs - so be sure to say hi if you're coming to Google I/O this year.&lt;br /&gt;
&lt;br /&gt;
The move is still some months away, but in the mean time here are some of the things I will (and won't) miss about London, and what I'm looking forward to in California.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Things I'll Miss About London&lt;/b&gt;&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;&lt;li&gt;World class theatre, restaurants, and concerts all at my door step.&lt;/li&gt;
&lt;li&gt;Living in close proximity to the rest of Europe.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Back_bacon"&gt;Proper bacon&lt;/a&gt; and real cheddar cheese.&lt;/li&gt;
&lt;li&gt;Seasons (particularly Spring and Autumn).&lt;/li&gt;
&lt;li&gt;The awesome Android developers I've worked with over the last 2 years.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.google.com/search?q=Full+English+breakfasts&amp;hl=en&amp;prmd=ivnse&amp;tbm=isch&amp;tbo=u&amp;source=univ&amp;sa=X&amp;ei=TiukTffCBsuFhQf1sJ3gCQ&amp;ved=0CCwQsAQ&amp;biw=1280&amp;bih=659"&gt;Full English breakfasts&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;b&gt;Things I Won't Miss About London&lt;/b&gt;&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;&lt;li&gt;Commuting for an hour every morning, and again every evening.&lt;/li&gt;
&lt;li&gt;The Victoria line and South West Trains.&lt;/li&gt;
&lt;li&gt;Hearing my neighbor snoring.&lt;/li&gt;
&lt;li&gt;Driving in London.&lt;/li&gt;
&lt;li&gt;Black pudding.&lt;/li&gt;
&lt;/ul&gt;&lt;b&gt;Things I'm Looking Forward to in California&lt;/b&gt;&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;&lt;li&gt;Fruit that tastes like fruit.&lt;/li&gt;
&lt;li&gt;Living on the West coast (the best coast).&lt;/li&gt;
&lt;li&gt;Living in close proximity to an ocean.&lt;/li&gt;
&lt;li&gt;Living in close proximity to the rest of the US.&lt;/li&gt;
&lt;li&gt;Wide roads and cheap(er) &lt;strike&gt;petrol&lt;/strike&gt; gas.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.google.com/search?hl=en&amp;biw=1280&amp;bih=659&amp;site=search&amp;tbm=isch&amp;sa=1&amp;q=American+breakfast&amp;aq=f&amp;aqi=&amp;aql=&amp;oq="&gt;American breakfasts&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10735231-8085458069534915710?l=blog.radioactiveyak.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheRadioactiveYak?a=6Wb-AAZxtCM:N91C6txIO6U:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheRadioactiveYak?i=6Wb-AAZxtCM:N91C6txIO6U:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheRadioactiveYak?a=6Wb-AAZxtCM:N91C6txIO6U:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheRadioactiveYak?i=6Wb-AAZxtCM:N91C6txIO6U:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheRadioactiveYak/~4/6Wb-AAZxtCM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.radioactiveyak.com/feeds/8085458069534915710/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.radioactiveyak.com/2011/04/im-saying-goodbye-to-london.html#comment-form" title="15 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10735231/posts/default/8085458069534915710?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10735231/posts/default/8085458069534915710?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheRadioactiveYak/~3/6Wb-AAZxtCM/im-saying-goodbye-to-london.html" title="I'm Saying Goodbye to London" /><author><name>Reto Meier</name><uri>https://profiles.google.com/111169963967137030210</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-FnQer4-BRHE/AAAAAAAAAAI/AAAAAAAAhdQ/hYIqsdGTYgA/s512-c/photo.jpg" /></author><thr:total>15</thr:total><feedburner:origLink>http://blog.radioactiveyak.com/2011/04/im-saying-goodbye-to-london.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkUMQns6fyp7ImA9WhZSFEQ.&quot;"><id>tag:blogger.com,1999:blog-10735231.post-529080788571820839</id><published>2011-03-30T16:18:00.000+01:00</published><updated>2011-03-30T16:18:03.517+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-30T16:18:03.517+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="subsea" /><category scheme="http://www.blogger.com/atom/ns#" term="animation" /><category scheme="http://www.blogger.com/atom/ns#" term="offshore" /><title>My Failed Startup (or How I Nearly Become a 3D Animator)</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;blockquote&gt;Building awesome software and having the right business contacts is not sufficient to convince the latter to hand over money for the former.&lt;/blockquote&gt;There was a time in 2004/05 when, for several minutes, I thought my future lay not in compilers and debuggers, but in modelers and  animation. As &lt;a href="https://picasaweb.google.com/reto.meier/3DComputerGeneratedImages?authkey=Gv1sRgCKeSlaH4wLW9wAE&amp;feat=directlink"&gt;you can see&lt;/a&gt;, it turns out I don't have the skill, patience, or eye for detail required to transition from "enthusiast" to "someone who gets paid".&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-_IEVx3gFG8o/TZIG1W2IqiI/AAAAAAAATK4/hZt6CHopoHc/s1600/UTA.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="150" src="http://2.bp.blogspot.com/-_IEVx3gFG8o/TZIG1W2IqiI/AAAAAAAATK4/hZt6CHopoHc/s200/UTA.jpg" width="200" /&gt;&lt;/a&gt;&lt;a href="http://1.bp.blogspot.com/-zT8qdjPsP38/TZIG1S3bMsI/AAAAAAAATLA/MZRLQsg_qJs/s1600/Pyramid.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="150" src="http://1.bp.blogspot.com/-zT8qdjPsP38/TZIG1S3bMsI/AAAAAAAATLA/MZRLQsg_qJs/s200/Pyramid.jpg" width="200" /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/-dppH63VJuLY/TZIG16O47jI/AAAAAAAATLI/E-3nM5pNAxg/s1600/Intervention.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="150" src="http://4.bp.blogspot.com/-dppH63VJuLY/TZIG16O47jI/AAAAAAAATLI/E-3nM5pNAxg/s200/Intervention.jpg" width="200" /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/-P3Ow55Y-M4I/TZIG2CED_rI/AAAAAAAATLQ/h5a3OKUb2sQ/s1600/7FunctionShootOut.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="150" src="http://4.bp.blogspot.com/-P3Ow55Y-M4I/TZIG2CED_rI/AAAAAAAATLQ/h5a3OKUb2sQ/s200/7FunctionShootOut.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
The journey that led me to consider adding "animator" to my resume is more interesting than my non-existent animation career. After 6 years writing oil &amp;amp; gas inspection software, I teamed up with a good friend and very smart guy - Big Stu - in a quixotic attempt to extract some serious coin from the bottomless money-pit that is the Western Australian oil &amp;amp; gas industry.&lt;br /&gt;
&lt;br /&gt;
Step 1: Combine his electrical / mechanical engineering knowledge and business contacts with my ninja coding and amateur 3D animation skills to forge a killer app.&lt;br /&gt;
Step 2: ???&lt;br /&gt;
Step 3: Profit!&lt;br /&gt;
&lt;br /&gt;
Here's our Pièce de résistance:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;object width="600" height="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/oX0KqjuCvo8?fs=1&amp;amp;hl=en_US"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/oX0KqjuCvo8?fs=1&amp;amp;hl=en_US" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="600" height="480"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;
Our output wasn't Avatar, but the cinematic eye-candy was a side-effect of the tools we used rather than the goal. &lt;br /&gt;
&lt;br /&gt;
We built a system to visualize and simulate &lt;i&gt;anything&lt;/i&gt; in a sub-sea installation. Each scene was fully interactive, and the models were based on engineering diagrams and were perfectly accurate. The field layouts were created from sub-sea survey data to perfectly depict every twist and turn of the flow-lines and anchor chains. I've still never heard of a system that provides that level of detail and accuracy for sub sea environments. &lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;object width="480" height="390"&gt;&lt;param name="movie" value="http://www.youtube.com/v/CM1ECY0ezzc?fs=1&amp;amp;hl=en_US"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/CM1ECY0ezzc?fs=1&amp;amp;hl=en_US" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="390"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;
Despite the power of the tool and the shiny eye-candy it produced, our venture never gained critical mass and eventually fizzled as Stu and I went our separate ways - Stu as the admiral of a &lt;a href="http://www.intervention.com.au/"&gt;veritable navy of ROVs&lt;/a&gt;, and me to London. &lt;br /&gt;
&lt;br /&gt;
What follows is a look back at why a great idea generated zero profit.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Some companies are born of technology, some achieve technological greatness and some have technology thrust upon them&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Technology is at the very heart of Google. Any chance to advance the technology of which it was born is seized upon as an opportunity for greater success. It's the philosophy behind our endeavor to "&lt;a href="http://www.google.com/chrome/intl/en/why.html"&gt;drive the web forward&lt;/a&gt;".&lt;br /&gt;
&lt;br /&gt;
Like Google, the oil &amp;amp; gas industry has an absolute dependence on technology. It simply could not exist without an army of technologists creating oil-field prediction engines and well flow models.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Like super-heroes, you can learn a lot about industries from their origin stories&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
The Social Network and There Will Be Blood both include generous helpings of greed and betrayal, but while getting gypped out of half a billion dollars is a pretty bad day, it's still a significantly better outcome than &lt;i&gt;having your head caved in&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
Don't get me wrong, in the 6 years I worked in oil &amp;amp; gas I never &lt;i&gt;once&lt;/i&gt; saw anyone beaten to death, so things have progressed significantly in the past hundred years or so. But in it's soul oil &amp;amp; gas isn't about technology; it's a business of hard bastards drilling &lt;a href="http://en.wikipedia.org/wiki/Deepwater_Horizon"&gt;absurdly deep&lt;/a&gt; holes into the earth's crust, praying to f**k it doesn't &lt;a href="http://www.google.com/images?q=oil+platform+disaster&amp;um=1&amp;ie=UTF-8&amp;source=og&amp;sa=N&amp;hl=en&amp;tab=wi&amp;biw=1280&amp;bih=659"&gt;explode&lt;/a&gt;, all in the hope of wringing a few more drops out of the bottom of a &lt;a href="http://en.wikipedia.org/wiki/Peak_oil"&gt;rapidly emptying cup&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;I drink your milkshake. I drink it up.&lt;/b&gt;&lt;br /&gt;
&lt;blockquote&gt;(Value of a resource * quantity of resource extracted) - cost of extraction = profit&lt;/blockquote&gt;Finding more of a scarce resource makes it, by definition, less valuable. It's nearly impossible to increase the quality of a natural resource, so the best way to increase profits is to decrease the costs of pulling it out of the ground.&lt;br /&gt;
&lt;br /&gt;
As resources become scarcer, the difficulty (and cost) of locating and extracting said resources increases. At this point your dependence on technology increases, and that technology costs money. &lt;br /&gt;
&lt;br /&gt;
At Google, technology is the product. Our success has come from search and advertising, but technologies like Android, Chrome, and cloud computing offer an opportunity for more success. &lt;br /&gt;
&lt;br /&gt;
In oil &amp;amp; gas, oil &amp;amp; gas is the product - and technology is simply a tool necessary to extract it. This is fundamental, and it affects the way technologists are regarded within each industry.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;What they want is fancier tools - not a new cost center.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Stu and I quickly discovered that while there &lt;i&gt;is&lt;/i&gt; a bottomless pit of cash, it is allocated almost exclusively to parts of the business that generate revenue. &lt;br /&gt;
&lt;br /&gt;
They will happily pay stupid money for is a shiny box that helps you find oil reserves, or one that lets you extract said nectar from Mother Earth. What they do &lt;i&gt;not&lt;/i&gt; want is to pay the salary of a dozen engineers (software or otherwise) that build shiny boxes.&lt;br /&gt;
&lt;br /&gt;
The significant supporting industries - everything from field inspections and environmental surveys to intervention engineering and remedial work - is all just costs. Most have been outsourced and the associated budgets minimized, allocated, and fixed. Entire companies are created through such outsourcing and their goals are to lower costs as far below the allocated budget as possible.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Our technology was about lowering costs - so we should have been golden, right?&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
The best technology in the world isn't valuable without a customer to sell it to.&lt;br /&gt;
&lt;br /&gt;
The oil companies loved our technology. The shiny graphics are like catnip to executives, and our pitch was compelling:&lt;br /&gt;
&lt;blockquote&gt;Using this software, we can increase efficiency by shortening each job by up to 20%. We only charge 5% for using the software, giving you a net saving of 15%.&lt;/blockquote&gt;Big smiles and firm handshakes all 'round.&lt;br /&gt;
&lt;blockquote&gt;You need to go speak to Our Contractor. They should definitely be using this!&lt;/blockquote&gt;Next week we bring our roadshow to the Contractor. These guys wear coveralls for a living and recognize the smell of bullshit as  it pulls up in the parking lot. They know the animated movies for the smoke and mirrors they are, but they're also engineers - so we switch our focus to the accuracy of our models. So far so good, until we get to the pitch:&lt;br /&gt;
&lt;blockquote&gt;Using this software, we can increase efficiency by shortening each job by up to 20%. We only charge 5% for using the software, giving you a net saving of 15%."&lt;/blockquote&gt;The smiles are gone and people are starting to fidget. &lt;br /&gt;
&lt;br /&gt;
Offshore jobs tend to operate on a "daily rate". So our pitch translated into something like this:&lt;br /&gt;
&lt;blockquote&gt;Using this software we can shorten your billable days by up to 20% and increase your operational costs by 5%, giving you a net profit reduction of 25%."&lt;/blockquote&gt;Oil Companies outsource technology for a reason, and they're not going to force their contractors to use one particular piece of new, untried technology. The aforementioned contractors have every incentive they need not to use it.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;The week-to-week possibility of Croesus wealth punctuated by imminent doom were good practice for later years.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
That said, it was a great idea that would likely have succeeded given more time and effort. If I hadn't been in such a hurry to move to London, we could have worked the right deals to get the Oil Companies to convince their contractors to use our tools. It would have continued to be challenging, but it had a good chance. I believe it's inevitable that others will succeed where Stu and I left-off, but in startups - like much in life - timing is everything.&lt;br /&gt;
&lt;br /&gt;
The lessons I learned about business, entrepreneurship, and opportunity have proven invaluable. The pressure and excitement of seemingly imminent success parallel to equally imminent crushing failure was a brutal introduction into the Real World after years spent hiding in the dark corner of my own coding universe. It's strange, but seeing something you pour your heart and soul into fail, can be better incentive to strive than unmitigated success.&lt;br /&gt;
&lt;br /&gt;
I never did persue a career in animation. After taking half a year off to travel Europe I settled in London with my passion for coding reignited. Some four years later, I found a job that offers the perfect mix of business development, technology evangelism, and hardcore coding that plays to my strengths. Oh, and did I mention &lt;a href="http://sites.google.com/site/googdevreljobs/"&gt;we're hiring&lt;/a&gt;?&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10735231-529080788571820839?l=blog.radioactiveyak.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheRadioactiveYak?a=grr8ZRtfhmM:czwzPxVaIyM:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheRadioactiveYak?i=grr8ZRtfhmM:czwzPxVaIyM:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheRadioactiveYak?a=grr8ZRtfhmM:czwzPxVaIyM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheRadioactiveYak?i=grr8ZRtfhmM:czwzPxVaIyM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheRadioactiveYak/~4/grr8ZRtfhmM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.radioactiveyak.com/feeds/529080788571820839/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.radioactiveyak.com/2011/03/my-failed-startup-or-how-i-nearly.html#comment-form" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10735231/posts/default/529080788571820839?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10735231/posts/default/529080788571820839?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheRadioactiveYak/~3/grr8ZRtfhmM/my-failed-startup-or-how-i-nearly.html" title="My Failed Startup (or How I Nearly Become a 3D Animator)" /><author><name>Reto Meier</name><uri>https://profiles.google.com/111169963967137030210</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-FnQer4-BRHE/AAAAAAAAAAI/AAAAAAAAhdQ/hYIqsdGTYgA/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-_IEVx3gFG8o/TZIG1W2IqiI/AAAAAAAATK4/hZt6CHopoHc/s72-c/UTA.jpg" height="72" width="72" /><thr:total>5</thr:total><feedburner:origLink>http://blog.radioactiveyak.com/2011/03/my-failed-startup-or-how-i-nearly.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkEGQHg9eip7ImA9WhZTE0U.&quot;"><id>tag:blogger.com,1999:blog-10735231.post-4722370217469654235</id><published>2011-03-17T17:34:00.001Z</published><updated>2011-03-17T17:57:01.662Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-17T17:57:01.662Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="analytics" /><category scheme="http://www.blogger.com/atom/ns#" term="android" /><category scheme="http://www.blogger.com/atom/ns#" term="android market" /><title>Using the New Android Market Stats for Fun and Profit</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Earlier this week the &lt;a href="http://market.android.com/publish"&gt;Android Market Publisher&lt;/a&gt; site was updated to include some &lt;a href="http://android-developers.blogspot.com/2011/03/application-stats-on-android-market.html"&gt;cool new statistics&lt;/a&gt; for your apps. You can now see the user distribution of your app in terms of the countries, languages, operating system versions, and devices on which your apps are running.&lt;br /&gt;
&lt;br /&gt;
Better still, you can compare your app's distribution in each of these categories with the overall distribution for all apps in the Market.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-ha-e7jr2H6I/TYJFznhsVjI/AAAAAAAASfk/SOg_Z8wOiTw/s1600/MarketStats.png" imageanchor="1" style="margin-left:0em; margin-right:0em"&gt;&lt;img border="0" width="600" src="http://3.bp.blogspot.com/-ha-e7jr2H6I/TYJFznhsVjI/AAAAAAAASfk/SOg_Z8wOiTw/s400/MarketStats.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;b&gt;What does this mean?&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
There are two axes for gaining insight from these figures:&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;&lt;li&gt;The distribution of languages, OS versions, devices, and countries of your app users.&lt;/li&gt;
&lt;li&gt;The variance between your app and the overall (expected) distribution.&lt;/li&gt;
&lt;/ul&gt;I looked at the statistics for my three most popular / successful apps: &lt;a href="https://market.android.com/details?id=com.radioactiveyak.earthquake"&gt;Earthquake&lt;/a&gt;, &lt;a href="https://market.android.com/details?id=com.radioactiveyak.animaltranslator"&gt;Animal Translator&lt;/a&gt;, and &lt;a href="https://market.android.com/details?id=com.paad.compass"&gt;Gyro Compass&lt;/a&gt;, and have the following observations, conclusions, and action items.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Action Items and Conclusions&lt;/b&gt;&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;&lt;li&gt;Create a Japanese and Spanish translation of &lt;i&gt;Earthquake&lt;/i&gt;.&lt;/li&gt;
&lt;li&gt;Translate &lt;i&gt;Animal Translator&lt;/i&gt; into Japanese.&lt;/li&gt;
&lt;li&gt;Modify culturally sensitive place names for Korean users.&lt;/li&gt;
&lt;li&gt;Confirm Earthquake works on small-screen devices.&lt;/li&gt;
&lt;li&gt;Drop platform support for Android 1.5 and 1.6 on &lt;i&gt;Animal Translator&lt;/i&gt;.&lt;/li&gt;
&lt;li&gt;For new apps, it's may not be worth supporting Android 1.5 or 1.6.&lt;/li&gt;
&lt;li&gt;For new apps, it's worth launching with&amp;nbsp;localized&amp;nbsp;language support for Korean and Japan.&lt;/li&gt;
&lt;li&gt;When promoting apps, be aware of&amp;nbsp;time-zones.&lt;/li&gt;
&lt;li&gt;Build tablet-targeted versions now to get first-mover advantage.&lt;/li&gt;
&lt;/ul&gt;&lt;b&gt;Observations: Location and Language&lt;/b&gt;&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;&lt;li&gt;All my apps do disproportionately well in the UK.&amp;nbsp;I'm based in London, so it's likely that my tweeting and blogging have driven more people in my time-zone&amp;nbsp;to my apps.&lt;/li&gt;
&lt;li&gt;The proportion of Japanese and Korean users is effected by how long the app has been around. The older apps have disproportionately more US users and fewer Japanese and Korean users, so &amp;nbsp;for new apps it's worth building with Japan and Korea in mind at launch.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Japanese users account for 10% of &lt;i&gt;Animal Translator&lt;/i&gt; users (double the normal distribution). They clearly like the concept, so a japanese language version should help drive popularity.&lt;/li&gt;
&lt;li&gt;Around 70% of&amp;nbsp;&lt;i&gt;Earthquake!&lt;/i&gt;&amp;nbsp;users are from the US (expected distribution if 60%). This is likely due to a lot of Android users in the San Adreas fault cities of San Francisco and Los Angeles.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Earthquake&lt;/i&gt; has 1.5% South Korean users versus an average of 10%.&amp;nbsp;Many South Korean users have complained about the USGS use of the name "Sea of Japan" which they believe should be "East Sea". This appears to have a direct impact on their usage of the app.&lt;/li&gt;
&lt;/ul&gt;&lt;b&gt;Observations:&amp;nbsp;OS Versions&lt;/b&gt;&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;&lt;li&gt;My apps show a trend where older apps have&amp;nbsp;disproportionately&amp;nbsp;more 1.5 / 1.6 users, and new apps have disproportionately fewer. This seems to suggest that owners of these older devices aren't downloading as many new apps. As a result, it might not be worth supporting 1.5 / 1.6 users for new apps.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Earthquake!&lt;/i&gt;&amp;nbsp;already has 0.2% of users running Android 3.0. This suggests that building tablet-optimized versions now can give you first-mover advantage.&lt;/li&gt;
&lt;li&gt;Only 8 people are running Animal Translator on a device running 1.6 or earlier, so I can probably drop support for for &amp;lt; 2.0 in the next update.&lt;/li&gt;
&lt;/ul&gt;&lt;b&gt;Observations:&amp;nbsp;Devices&lt;/b&gt;&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;&lt;li&gt;Based on the devices, there are no small-screen &lt;i&gt;Earthquake!&lt;/i&gt; users. Does the app work on small screens?&lt;/li&gt;
&lt;li&gt;The popularity of devices seems heavily affected by the country&amp;nbsp;distribution&amp;nbsp;of users. For my apps the HTC EVO 4G and Droid series of devices seem very popular in the US, with the HTC Desire and Samsung Galaxy S very popular in Korea and Europe.&lt;/li&gt;
&lt;/ul&gt;&lt;b&gt;What patterns did you see?&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
What observations and patterns did you find looking at your app statistics?&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10735231-4722370217469654235?l=blog.radioactiveyak.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheRadioactiveYak?a=XDZCuj3tSlc:3P586oAY4qM:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheRadioactiveYak?i=XDZCuj3tSlc:3P586oAY4qM:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheRadioactiveYak?a=XDZCuj3tSlc:3P586oAY4qM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheRadioactiveYak?i=XDZCuj3tSlc:3P586oAY4qM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheRadioactiveYak/~4/XDZCuj3tSlc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.radioactiveyak.com/feeds/4722370217469654235/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.radioactiveyak.com/2011/03/using-new-android-market-stats-for-fun.html#comment-form" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10735231/posts/default/4722370217469654235?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10735231/posts/default/4722370217469654235?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheRadioactiveYak/~3/XDZCuj3tSlc/using-new-android-market-stats-for-fun.html" title="Using the New Android Market Stats for Fun and Profit" /><author><name>Reto Meier</name><uri>https://profiles.google.com/111169963967137030210</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-FnQer4-BRHE/AAAAAAAAAAI/AAAAAAAAhdQ/hYIqsdGTYgA/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-ha-e7jr2H6I/TYJFznhsVjI/AAAAAAAASfk/SOg_Z8wOiTw/s72-c/MarketStats.png" height="72" width="72" /><thr:total>5</thr:total><feedburner:origLink>http://blog.radioactiveyak.com/2011/03/using-new-android-market-stats-for-fun.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak8FSXk8fCp7ImA9Wx9aGEg.&quot;"><id>tag:blogger.com,1999:blog-10735231.post-7640391120933549513</id><published>2011-03-11T10:53:00.001Z</published><updated>2011-03-11T15:53:38.774Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-11T15:53:38.774Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="japan." /><category scheme="http://www.blogger.com/atom/ns#" term="earthquake" /><title>What Does a Magnitude 8.9 Earthquake Look Like?</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Today &lt;a href="http://www.google.com/search?sourceid=chrome&amp;amp;ie=UTF-8&amp;amp;q=japan+earthquake#q=japan+earthquake&amp;amp;hl=en&amp;amp;prmd=ivnsu&amp;amp;source=univ&amp;amp;tbs=nws:1&amp;amp;tbo=u&amp;amp;sa=X&amp;amp;ei=U_Z5TfA2zqnxA-DR6LEE&amp;amp;ved=0CEUQqAI&amp;amp;bav=on.2,or.r_gc.r_pw.&amp;amp;fp=65feb11b35c9a642"&gt;Japan was struck by a massive 8.9 magnitude earthquake&lt;/a&gt; that caused major damage and loss of life. The quake hit off the coast which resulted in a tsunami which struck towns along the Northern coast of Japan and has resulted in tsunami alerts across the Pacific including as far away as the West coast of the US and Australia.&lt;br /&gt;
&lt;br /&gt;
Seismological details on the quake are available from the &lt;a href="http://www.jma.go.jp/en/quake/"&gt;Japan&amp;nbsp;Meteorological&amp;nbsp;Society&lt;/a&gt; and the &lt;a href="http://www.jma.go.jp/en/quake/"&gt;US Geological Survey&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: left;"&gt;If you have friends or family in Japan, or you're in Japan and want to let people know you're ok, you can use the &lt;a href="http://japan.person-finder.appspot.com/"&gt;Google Person Finder&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Aljazeera are streaming &lt;a href="http://www.youtube.com/aljazeeraenglish?feature=ticker"&gt;live coverage on YouTube&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
In very real terms, these pictures from The Atlantic show exactly&amp;nbsp;&lt;a href="http://www.theatlantic.com/infocus/2011/03/earthquake-in-japan/100022/"&gt;what an 8.9 magnitude earthquake looks like&lt;/a&gt;.&amp;nbsp;My thoughts go out to everyone affected.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Some&amp;nbsp;Visualizations&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
A magnitude of 8.9 is big. Very big.&lt;br /&gt;
&lt;br /&gt;
The &lt;a href="http://en.wikipedia.org/wiki/Richter_magnitude_scale#Richter_magnitudes"&gt;Richter scale&lt;/a&gt; is&amp;nbsp;logarithmic, meaning an increment each whole number increase in magnitude represents a tenfold increase in measured amplitude. In real terms, that makes today's earthquake in Japan is around &lt;b&gt;500 times&lt;/b&gt; more powerful than the 6.3 magnitude quake that devastated &lt;a href="http://www.google.com/crisisresponse/christchurch_earthquake.html"&gt;Christchurch&lt;/a&gt; in New Zealand last month.&lt;br /&gt;
&lt;blockquote&gt;&lt;i&gt;The following visualizations are screen captures from my &lt;a href="https://market.android.com/details?id=com.radioactiveyak.earthquake&amp;amp;feature=search_result"&gt;Earthquake&lt;/a&gt; Android app. They attempt to give an idea of the scale (relative and otherwise) of the earthquake in Japan. They are approximate, using only the magnitude of the quake to determine the areas likely to be affected. Additional factors like depth of quake, fault lines, mountains, and landscape can significantly change the areas affected.&lt;/i&gt;&lt;/blockquote&gt;In the image below, the giant outer circle represents the area within which people were likely to have "felt something"during the quake. That's the better part of a hemisphere reaching as far as Brisbane in Australia and touching Alaska.&lt;br /&gt;
&lt;br /&gt;
By comparison, the smaller inner circle is the same "felt" area for a 7.1 magnitude aftershock.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img border="0" src="https://lh6.googleusercontent.com/-IHSnOr0SCWc/TXn4jBYcLSI/AAAAAAAAScw/MLDLGRqNuP0/s1600/Earthquake_Felt.png" width="600" /&gt;&lt;/div&gt;&lt;br /&gt;
This next image represents the area at significant risk of suffering from structural damage due to the quake. Again, the larger circle represents the initial 8.9 magnitude quake and covers around three quarters of Japan - an area that represents most of the US West coast.&lt;br /&gt;
&lt;br /&gt;
For comparison, the smaller circle centered around the 7.1 marker is the damage radius for the smaller aftershock.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img border="0" src="https://lh3.googleusercontent.com/-nM5SI9r2DFc/TXn4jS1w9rI/AAAAAAAASc0/jMVrpAwWmtg/s1600/Earthquake_Damage.png" width="600" /&gt;&lt;/div&gt;&lt;br /&gt;
Just as striking is the aftershocks that inevitably follow such a significant quake. The following image shows only the aftershocks measuring above 6 ("Strong: Can be destructive in areas up to about 160&amp;nbsp;kilometers") on the Richter Scale.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img border="0" height="347" src="https://lh6.googleusercontent.com/-2_Crx2QbHxA/TXn4jhNOapI/AAAAAAAASc4/z6_vH_Ocfv8/s640/Earthquake_Aftershocks.png" width="600" /&gt;&lt;/div&gt;&lt;br /&gt;
The overlapping areas all&amp;nbsp;occurred&amp;nbsp;within two hours of each other and give a sense of just how terrifying it must be for the people affected.&lt;br /&gt;
&lt;br /&gt;
My hopes and best wishes go out to everyone affected by this&amp;nbsp;catastrophe.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10735231-7640391120933549513?l=blog.radioactiveyak.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheRadioactiveYak?a=Eee5c2fcqvU:9WKXGU7k0qo:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheRadioactiveYak?i=Eee5c2fcqvU:9WKXGU7k0qo:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheRadioactiveYak?a=Eee5c2fcqvU:9WKXGU7k0qo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheRadioactiveYak?i=Eee5c2fcqvU:9WKXGU7k0qo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheRadioactiveYak/~4/Eee5c2fcqvU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.radioactiveyak.com/feeds/7640391120933549513/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.radioactiveyak.com/2011/03/what-does-magnitude-89-earthquake-look.html#comment-form" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10735231/posts/default/7640391120933549513?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10735231/posts/default/7640391120933549513?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheRadioactiveYak/~3/Eee5c2fcqvU/what-does-magnitude-89-earthquake-look.html" title="What Does a Magnitude 8.9 Earthquake Look Like?" /><author><name>Reto Meier</name><uri>https://profiles.google.com/111169963967137030210</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-FnQer4-BRHE/AAAAAAAAAAI/AAAAAAAAhdQ/hYIqsdGTYgA/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://lh6.googleusercontent.com/-IHSnOr0SCWc/TXn4jBYcLSI/AAAAAAAAScw/MLDLGRqNuP0/s72-c/Earthquake_Felt.png" height="72" width="72" /><thr:total>4</thr:total><feedburner:origLink>http://blog.radioactiveyak.com/2011/03/what-does-magnitude-89-earthquake-look.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEMMRHs9fSp7ImA9Wx9aFUw.&quot;"><id>tag:blogger.com,1999:blog-10735231.post-7729864498220228392</id><published>2011-03-07T16:48:00.000Z</published><updated>2011-03-07T16:48:05.565Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-07T16:48:05.565Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tablets" /><category scheme="http://www.blogger.com/atom/ns#" term="netbooks" /><category scheme="http://www.blogger.com/atom/ns#" term="android" /><title>The Rise of the Tablet and the Innevitable Death of the Netbook</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Last week I added a 10.1" Motorola Xoom to my &lt;a href="http://blog.radioactiveyak.com/p/reto-meiers-gadget-compendium.html"&gt;gadget bag&lt;/a&gt; at the expense of a Netbook. As tablets grow in popularity I predict the Netbook's days are numbered.&lt;br /&gt;
&lt;br /&gt;
Shortly after buying an &lt;a href="http://reviews.cnet.co.uk/netbooks/asus-eee-pc-701-review-49293507/"&gt;Asus EeePC 701&lt;/a&gt; in 2008 I described it to anyone who would listen as the best technology purchasing decision I'd ever made. It cost £200, was thin, light, and cheap. It booted Windows and loaded Office in under 10 seconds - only the paltry 800x600 display resolution was a legitimate cause of grief.&lt;br /&gt;
&lt;br /&gt;
I used it&amp;nbsp;to write most of my first book during my daily commute, and it was light and thin enough for me to throw in my bag for holidays or trips where I wasn't keen on bringing my laptop along (at the time my laptop was as &lt;a href="http://www.amazon.com/Sony-VGN-AR890U-17-inch-Processor-Ultimate/dp/B0019K3VPQ/ref=sr_1_1?s=electronics&amp;amp;ie=UTF8&amp;amp;qid=1299511276&amp;amp;sr=1-1"&gt;17" Vaio desktop replacement&lt;/a&gt; that weighed the better part of a metric fucktonne).&lt;br /&gt;
&lt;br /&gt;
Light and with a full-day battery life, &amp;nbsp;Netbooks were a cheap second computer for lightweight computing tasks and surfing the web.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;A one trick pony&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Growing up, my parents ran a typewriter sales and repair company. I watched as the typewriter was gradually (and then very quickly) replaced with the desktop computer. For a small while "&lt;a href="http://www.google.com/images?q=Canon+StarWriter&amp;amp;um=1&amp;amp;ie=UTF-8&amp;amp;source=univ&amp;amp;sa=X&amp;amp;ei=ev90TfCgBo238QO1mKWvCA&amp;amp;ved=0CFUQsAQ&amp;amp;biw=1280&amp;amp;bih=659"&gt;word&amp;nbsp;&lt;/a&gt;&lt;span class="Apple-style-span" style="color: #0000ee;"&gt;&lt;u&gt;processors&lt;/u&gt;&lt;/span&gt;" were a popular alternative - significantly cheaper than computers, and with most of the features of Word Perfect 5.1.&lt;br /&gt;
&lt;br /&gt;
As PCs, laptops, and printers become cheap and ubiquitous, word processors grew more fanciful in an effort to compete. They offered more fonts and options but at a higher price. Before long, like most one-trick ponies, it was quietly covered with a sheet and put out of its misery.&lt;br /&gt;
&lt;br /&gt;
I had a distinct feeling of deju-vu when late last year &amp;nbsp;I went in search of a replacement for my EeePC in the hopes of finding something cheaper, lighter, and a little faster. Instead I was presented with devices that were:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;More expensive.&lt;/li&gt;
&lt;li&gt;Thicker and heavier.&lt;/li&gt;
&lt;li&gt;Slower to load and lacking SSDs.&lt;/li&gt;
&lt;/ul&gt;At the same time, my new Macbook weighs around two kilograms and is no more than an inch thick. I can use it to write my book, write my code, edit photos, and pretty much anything else I could want to do.&lt;br /&gt;
&lt;br /&gt;
It's true that a MBP is a lot more expensive than a Netbook - and bulkier - but it's not as though you would buy a Netbook&amp;nbsp;&lt;i&gt;instead&lt;/i&gt;&amp;nbsp;of a real laptop. It's an additional device, so it's actually competing with tablets or smartphones - and a smartphone / tablet combo has a lot more to offer.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Smartphones and tablets make Netbooks a quaint&amp;nbsp;irrelevancy&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Modern smartphones, led by iPhone and Android, have largely filled the niche of mobile web browsing.&lt;br /&gt;
&lt;br /&gt;
The arrival of the tablet is the final nail in the coffin, with a&amp;nbsp;10" tablet neatly filling the gap between smartphone and laptop.&lt;br /&gt;
&lt;br /&gt;
With bright, high resolution displays, tablets offer an unparalleled experience for watching video. Games designed for tablets are created&amp;nbsp;specifically for portable hardware featuring a touch screens and accelerometers. Similarly the rich ecosystem of apps is optimized specifically for smartphone and tablet platforms.&lt;br /&gt;
&lt;br /&gt;
Typing on a 10.1" touchscreen is certainly no worse than typing on an undersized Netbook keyboard.&amp;nbsp;Walking into meetings these days I'm increasingly finding people have left their laptops behind and are instead bringing along their tablets.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;If you need to type, bring a laptop. If weight is an issue, bring your tablet&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Tablets provide an optimized experience for&amp;nbsp;portability, mobility, and touch-based input with a rich selection of apps and games designed with their size and power in mind.&lt;br /&gt;
&lt;br /&gt;
Laptops are cheaper, lighter, and more powerful than ever before. They offer a rich ecosystem of apps and provide the perfect platform where text input is required.&lt;br /&gt;
&lt;br /&gt;
Netbooks can still provide a great platform for getting online, but so can laptops and tablets. Laptops may one day give way to tablets and smartphones entirely, and apps may move entirely online, but Netbooks - like word processors in the 80's - will inevitably fall victim to competitors that offer a more dynamic ecosystem of apps, games, and features at an increasingly comparable price.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10735231-7729864498220228392?l=blog.radioactiveyak.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheRadioactiveYak?a=L5nWxwY-nRc:Ex2mnl3oUOk:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheRadioactiveYak?i=L5nWxwY-nRc:Ex2mnl3oUOk:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheRadioactiveYak?a=L5nWxwY-nRc:Ex2mnl3oUOk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheRadioactiveYak?i=L5nWxwY-nRc:Ex2mnl3oUOk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheRadioactiveYak/~4/L5nWxwY-nRc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.radioactiveyak.com/feeds/7729864498220228392/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.radioactiveyak.com/2011/03/rise-of-tablet-and-innevitable-death-of.html#comment-form" title="13 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10735231/posts/default/7729864498220228392?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10735231/posts/default/7729864498220228392?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheRadioactiveYak/~3/L5nWxwY-nRc/rise-of-tablet-and-innevitable-death-of.html" title="The Rise of the Tablet and the Innevitable Death of the Netbook" /><author><name>Reto Meier</name><uri>https://profiles.google.com/111169963967137030210</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-FnQer4-BRHE/AAAAAAAAAAI/AAAAAAAAhdQ/hYIqsdGTYgA/s512-c/photo.jpg" /></author><thr:total>13</thr:total><feedburner:origLink>http://blog.radioactiveyak.com/2011/03/rise-of-tablet-and-innevitable-death-of.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0YNQH0ycSp7ImA9Wx9bE0s.&quot;"><id>tag:blogger.com,1999:blog-10735231.post-4316378599077814648</id><published>2011-02-21T17:37:00.002Z</published><updated>2011-02-22T08:59:51.399Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-22T08:59:51.399Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="android" /><category scheme="http://www.blogger.com/atom/ns#" term="mwc" /><title>Mobile World Congress: Slides, Smoothies, Collectable Pins, and Gadgets Galore</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;On the scale on which these things are measured, Mobile World Congress doesn't have a reputation for being a "fun" event. Exciting, vibrant, interesting, and worthwhile - sure. But the number of suits and ties in attendance generally precludes the sort of party atmosphere people expect at events like SXSW or Google I/O.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Less fun, that is, until now&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
It turns out that if you want to see serious folks in serious suits take a ride down a slide all you need to do is build it: and they will come.&lt;br /&gt;
&lt;br /&gt;
By 9:30 on Monday morning the pristine environment of the Android stand - tucked away in a corner of Hall 8 - was a heaving mass of developers, CEOs, reporters, and collectable pin enthusiasts. &lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-m-75cMKnY6g/TWFMIbTct2I/AAAAAAAASJw/9I7spe6Xg9A/s1600/BeforeandAfterSmall.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;
The Android stand (here's some &lt;a href="https://picasaweb.google.com/reto.meier/MobileWorldCongress2011?feat=directlink"&gt;more pictures&lt;/a&gt;) at MWC was all about openness and inclusion. The highlight for me was the 40 or so 3rd party developers who (rightly) stole the show. They worked tirelessly, demonstrating their apps and showcasing just what's possible on the Android platform. Developers take note: this could be you next year.&lt;br /&gt;
&lt;br /&gt;
Typically at MWC Tuesday is the busiest day, with Wednesday tapering off and Thursday seeing the halls empty and abandoned by midday. Not this year. The stand was packed every day from 9:00 when they opened the gates to 7 when they flashed the lights. Even on Thursday when most stands are rolling up the carpet after lunch, we had a full house until the lights went off at 4pm.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-BQ2ttnk2a10/TWFMVtiDFJI/AAAAAAAASJ4/VCCpiFXEWzA/s1600/IMG_20110215_130026.jpg" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;
Android Gurus, 3rd party developers, and a device bar with over 80 different Android powered handsets kept the crowd entertained. The obligatory slide was in constant use, and free smoothies (the Honeycomb - flavored with honey and lychee - was my pick) were on offer served by a bevy of friendly antipodean bartenders, who towards the end of the event served as the kingpins of a roaring trade in collectable Android pins.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Have you got any pins?&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
So it turns out that all you need to transform a clean-cut three-piece-suited CEO into a screaming fanboi is the introduction of limited edition Android collectable pins. &lt;br /&gt;
&lt;br /&gt;
What started as a curiosity on day one exploded into full-blown pin-mania by Tuesday. There were 86 of these on offer at MWC - here's a few of my favorites.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-MXwuC1taKH0/TWFIII8Wn9I/AAAAAAAASJY/z4m9pI1gq1k/s1600/IMG_2387.JPG" /&gt;&lt;/div&gt;&lt;br /&gt;
&lt;b&gt;Of course what we're really here for is the gadgets&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
And we weren't disappointed. There were some great new handsets on display this year, including LG's fascinating &lt;a href="http://www.bbc.co.uk/news/technology-12461071"&gt;Optimus 3D&lt;/a&gt; features a 3D display that doesn't require special glasses.&lt;br /&gt;
&lt;br /&gt;
The Samsung stand was a gold mine of awesome sauce with the frankly stunning &lt;a href="http://www.engadget.com/2011/02/13/samsung-galaxy-s-ii-official-tegra-2-4-3-inch-super-amoled-plu/"&gt;Galaxy S II&lt;/a&gt; and the Honeycomb-sporting &lt;a href="http://galaxytab.samsungmobile.com/"&gt;Galaxy Tab 10.1&lt;/a&gt; tablet. As usual the screens on these devices where gorgeous - and the 10.1" Galaxy Tab was surprisingly light - I'd like to spend a little more time with both.&lt;br /&gt;
&lt;br /&gt;
Tablets were the big news of the show, with the Samsung Tab 10.1 and the &lt;a href="http://gizmodo.com/#!5749495/lg-g+slate-a-dual+core-android-honeycomb-tablet-packed-full-of-3d-tech"&gt;LG G-Slate&lt;/a&gt; joining the &lt;a href="http://www.motorola.com/Consumers/US-EN/Consumer-Product-and-Services/Tablets/ci.MOTOROLA-XOOM-US-EN.overview"&gt;Motorola Xoom&lt;/a&gt; as forthcoming tablet devices running Android Honeycomb. HTC's also announced their first Android tablet (the &lt;a href="http://www.techradar.com/news/mobile-computing/htc-flyer-price-revealed-already-930073"&gt;HTC Flyer&lt;/a&gt;), a 7" tablet that will apparently run Gingerbread before receiving an OTA update to bring it up to Honeycomb. &lt;br /&gt;
&lt;br /&gt;
I'm a fan of HTC's industrial design, so I'm excited to see what they come up with in the tablet market.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;A+++ Would attend again&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Any trip to Barcelona means great food and plentiful drink and this visit was no exception.&lt;br /&gt;
&lt;br /&gt;
While in Barcelona I had the great pleasure of hanging out with the folks who make up the &lt;a href="http://barcelona.gtugs.org/"&gt;Barcelona GTUG&lt;/a&gt;. These guys are as awesome as they are welcoming. MWC is famous for its extravagant parties but hanging out with these guys in a crowded local bar was a definite highlight.&lt;br /&gt;
&lt;br /&gt;
Between the fun of the Android stand, the excitement of getting to play with new toys, and the gluttonous pleasure of Spanish cuisine it was an incredible experience. The only question now is how do we top it next year? &lt;br /&gt;
&lt;br /&gt;
Only time will tell, but I saw the designers behind this year's stand sketching plans for a two story slide...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10735231-4316378599077814648?l=blog.radioactiveyak.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheRadioactiveYak?a=yBoxVfeqIog:GYf2lRYHkTM:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheRadioactiveYak?i=yBoxVfeqIog:GYf2lRYHkTM:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheRadioactiveYak?a=yBoxVfeqIog:GYf2lRYHkTM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheRadioactiveYak?i=yBoxVfeqIog:GYf2lRYHkTM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheRadioactiveYak/~4/yBoxVfeqIog" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.radioactiveyak.com/feeds/4316378599077814648/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.radioactiveyak.com/2011/02/mobile-world-congress-slides-smoothies.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10735231/posts/default/4316378599077814648?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10735231/posts/default/4316378599077814648?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheRadioactiveYak/~3/yBoxVfeqIog/mobile-world-congress-slides-smoothies.html" title="Mobile World Congress: Slides, Smoothies, Collectable Pins, and Gadgets Galore" /><author><name>Reto Meier</name><uri>https://profiles.google.com/111169963967137030210</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-FnQer4-BRHE/AAAAAAAAAAI/AAAAAAAAhdQ/hYIqsdGTYgA/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-m-75cMKnY6g/TWFMIbTct2I/AAAAAAAASJw/9I7spe6Xg9A/s72-c/BeforeandAfterSmall.jpg" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://blog.radioactiveyak.com/2011/02/mobile-world-congress-slides-smoothies.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUYGRHk_eCp7ImA9Wx9UEko.&quot;"><id>tag:blogger.com,1999:blog-10735231.post-3316444816520012505</id><published>2011-02-09T16:17:00.001Z</published><updated>2011-02-09T17:38:45.740Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-09T17:38:45.740Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tablets" /><category scheme="http://www.blogger.com/atom/ns#" term="fragments" /><category scheme="http://www.blogger.com/atom/ns#" term="android" /><title>Strategies for Honeycomb and Backwards Compatibility</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Each new Android release heralds two things: A raft of new developer APIs, and a chorus of questions on how to use them while staying backwards compatible. &lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://developer.android.com/sdk/android-3.0-highlights.html"&gt;Android 3.0&lt;/a&gt; (Honeycomb) is notable in that it introduces &lt;a href="http://android-developers.blogspot.com/2011/02/android-30-fragments-api.html"&gt;Fragments&lt;/a&gt;, possibly the most fundamental change to how Activity UIs are constructed since Android 1.0.&amp;nbsp;To add to the excitement, Honeycomb is also the first Android platform release optimized specifically for extra-large screen (tablet) devices.&lt;br /&gt;
&lt;br /&gt;
The good news is that we plan to have the same fragment APIs available as a static library for use with older versions of Android; the plan is to go right back to 1.6.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;The easiest short-term fix is to create separate sets of Activities&lt;/b&gt;&lt;br /&gt;
&lt;blockquote&gt;When the static Fragments library becomes available you'll be able to skip this step entirely (or simply deprecate these Activities from your application).&amp;nbsp;&lt;/blockquote&gt;The introduction of Fragments (and to a lesser degree the Action Bar) represents a significant change to the code the lives within your Activity classes.&lt;br /&gt;
&lt;br /&gt;
The following technique demonstrates how you can &amp;nbsp;create two separate sets of Activities: one set that supports Fragments and another set that is designed to work without them.&lt;br /&gt;
&lt;br /&gt;
To select the right set of Activities at runtime, you need to include a launcher Activity in your manifest that detects support (or lack thereof) for Fragments and then starts the appropriate Activity.&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;&amp;lt;activity &lt;br /&gt;
&amp;nbsp;&amp;nbsp;android:name="InitialActivity"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;android:label="@string/app_name"&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;intent-filter&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;action android:name="android.intent.action.MAIN" /&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;category android:name="android.intent.category.LAUNCHER" /&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;/intent-filter&amp;gt;&lt;br /&gt;
&amp;lt;/activity&amp;gt;&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Within &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;InitialActivity&lt;/span&gt;, you can use reflection to check if Fragments are supported on the current device.&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;&amp;nbsp;&amp;nbsp;private static boolean fragmentsSupported = false;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;private static void checkFragmentsSupported() throws NoClassDefFoundError {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fragmentsSupported = android.app.Fragment.class != null;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;static {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;checkFragmentsSupported();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} catch (NoClassDefFoundError e) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fragmentsSupported = false;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Then within &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;onCreate&lt;/span&gt; forward the application to the "real" first Activity that either uses Fragments or not depending on the capabilities of the device.&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;&amp;nbsp;&amp;nbsp;@Override&lt;br /&gt;
&amp;nbsp;&amp;nbsp;public void onCreate(Bundle savedInstanceState) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;super.onCreate(savedInstanceState);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Intent startActivityIntent = null;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!fragmentsSupported)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;startActivityIntent = new Intent(this, MainNonFragmentActivity.class);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;startActivityIntent = new Intent(this, MainFragmentActivity.class);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;startActivity(startActivityIntent);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;finish();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
}&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Because you're calling &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;finish&lt;/span&gt; immediately after starting the new Activity, the back button behaviour of your application works as expected. &lt;br /&gt;
&lt;br /&gt;
Within the MainNonFragmentActivity you simply inflate a layout resource that doesn't use Fragments&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;setContentView(R.layout.non_fragment_main);&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
While the MainFragmentActivity inflates a layout that does.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;What about the rest of the Honeycomb APIs?&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;/b&gt;The upcoming static Fragment library means you probably won't need to implement the previous technique in order to use Fragments as the building blocks of your UI, but what about the other new Honeycomb APIs like the Action Bar and Animators?&lt;br /&gt;
&lt;br /&gt;
Let's ignore the non-Fragment Activities and focus on the scenario where Fragments are available, but none of the other Honeycomb APIs are.&lt;br /&gt;
&lt;br /&gt;
The first step is to determine the availability of the new APIs. You can implement the same exception catching technique I used above for each of the classes you wish to use, but I've found it simpler to bundle all the new APIs together and build only two variations:&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&amp;nbsp;&amp;nbsp;private static boolean shinyNewAPIsSupported =&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;android.os.Build.VERSION.SDK_INT &amp;gt; 10;&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;
&lt;b&gt;Maintaining two sets of Activities doesn't require a parallel set of Fragments, layouts and resources&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Once again, I'm going to create a&amp;nbsp;parallel&amp;nbsp;set of Activities: One that uses the shiny new APIs like the Action Bar and animations, and another that uses traditional techniques to create a similar user experience.&lt;br /&gt;
&lt;br /&gt;
The technique described above can be used in the same way - this time using the &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;shinyNewAPIsSupported&lt;/span&gt; variable to determine which Activity to start.&lt;br /&gt;
&lt;br /&gt;
Because most of the user-interface logic is contained within the Fragments rather than the Activity, these&amp;nbsp;parallel&amp;nbsp;Activities don't do much beyond inflate slightly different layouts. Where the Action Bar is available the Activity will handle the effect of navigation and action clicks. If the Action Bar isn't available, the layout used will likely incorporate a custom version that mimics its&amp;nbsp;behavior.&lt;br /&gt;
&lt;br /&gt;
Only the highlighted ActionBarFragment in the following snippet would be different between the pre- and post-Honeycomb app layout.&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;&amp;lt;LinearLayout&amp;nbsp;xmlns:android="http://schemas.android.com/apk/res/android"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;android:orientation="vertical"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;android:layout_width="fill_parent"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;android:layout_height="fill_parent"&amp;gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: blue;"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;lt;fragment&amp;nbsp;class="com.paad.hc_backwards.ActionBarFragment"&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;android:layout_width="fill_parent"&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;android:layout_height="wrap_content"/&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;LinearLayout&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;android:layout_width="fill_parent"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;android:layout_height="fill_parent"&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;fragment&amp;nbsp;class="com.paad.hc_backwards.SelectionFragment"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;android:layout_weight="3"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;android:layout_width="fill_parent"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;android:layout_height="fill_parent"/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;fragment&amp;nbsp;class="com.paad.hc_backwards.ContentFragment"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;android:layout_weight="1"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;android:layout_width="fill_parent"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;android:layout_height="fill_parent"/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;/LinearLayout&amp;gt;&lt;br /&gt;
&amp;lt;/LinearLayout&amp;gt;&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
The key is that both sets of Activities will use the &lt;i&gt;same fragments&lt;/i&gt;. Interaction between and within Fragments is usually maintained within each fragment, so only code related to the Action Bar (and other missing APIs) will need to be changed within the two Activity sets.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;I expect all the apps I use on my phone to be optimized for tablets&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Now lets take a look at the changes inherent in the introduction of the extra-large display. Fragments are designed&amp;nbsp;specifically&amp;nbsp;to make it easier to create flexible layouts, so I'm going to assume the existence of either Honeycomb or the static Fragment library when considering our options.&lt;br /&gt;
&lt;br /&gt;
Device independent pixels (dp) and flexible layouts (like Relative Layout and Linear Layout) let your app scale to the dimensions and orientation of tablets. However, an app running on a 10"&amp;nbsp;landscape device&amp;nbsp;1280 pixels across has a hell of a lot of whitespace when it was designed for a 4" portrait display at 480 pixels.&lt;br /&gt;
&lt;br /&gt;
Consider the typical app design pattern where making a selection on one Activity determines what content is displayed another. Making a selection hides the selection Activity and displays the selected content.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Using Fragments you can easily construct layout variations for different screens&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
On a tablet it makes sense to position the selection and content Fragments within a single Activity, while on a phone only one should be visible at a time.&lt;br /&gt;
&lt;br /&gt;
You can handle this as we did pre-Honeycomb by creating a &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;res/layout-xlarge&lt;/span&gt;&amp;nbsp;resource folder into which we put the side-by-side layout to use on an extra-large (tablet display).&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;&amp;lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;android:layout_width="fill_parent"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;android:layout_height="fill_parent"&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;fragment class="com.paad.hc_backwards.SelectionFragment"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;android:id="@+id/selection_fragment"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;android:layout_weight="3"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;android:layout_width="fill_parent" &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;android:layout_height="fill_parent"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;/&amp;gt; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;fragment class="com.paad.hc_backwards.ContentFragment"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;android:id="@+id/content_fragment"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;android:layout_weight="1"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;android:layout_width="fill_parent" &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;android:layout_height="fill_parent"&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;/fragment&amp;gt;&lt;br /&gt;
&amp;lt;/LinearLayout&amp;gt;&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
In practice, we'll usually want to define a portrait and landscape specific mode using port or land resource qualifiers:&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;res/layout-xlarge-port&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;res/layout-xlarge-land&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
For phones, we'll use the same Fragments, but the layout (stored in &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;res/layout&lt;/span&gt;) would contain only one Fragment stored in a containing layout.&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;&amp;lt;FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;android:id="@+id/selection_fragment_frame"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;android:layout_width="fill_parent"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;android:layout_height="fill_parent"&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;fragment class="com.paad.hc_backwards.SelectionFragment"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;android:id="@+id/selection_fragment"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;android:tag="full_screen_fragment"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;android:layout_width="fill_parent" &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;android:layout_height="fill_parent"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;/&amp;gt;&lt;br /&gt;
&amp;lt;/FrameLayout&amp;gt;&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Within our code this produces a dilemma&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
The selection and content Fragments will interact slightly differently in phone or tablet mode. In both cases, making a selection should be reflected in the content Fragment - however in the phone layout this should also replace the selection Fragment with the newly updated content Fragment.&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;public void makeSelection(int i) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;boolean extraLargeScreen = getResources().getConfiguration().screenLayout &amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Configuration.SCREENLAYOUT_SIZE_LARGE;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;if (!extraLargeScreen) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FragmentTransaction ft = fragmentManager.beginTransaction();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ft.hide(selectionFragment);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ft.add(R.id.selection_fragment_frame, contentFragment);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ft.addToBackStack(null);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ft.commit();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;contentFragment.setSelection(i);&lt;br /&gt;
}&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Note that by calling &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;addToBackStack&lt;/span&gt; we ensure that pressing the back button will undo this transaction, hiding the content Fragment and displaying the selection Fragment.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Fragments are a great way to componetize your UI&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
The new Android 3.0 (Honeycomb) SDK introduces a number of great new APIS, many of them designed to make it easier to build tablet version of your apps by providing a flexible mechanism for building different layouts depending on screen size and orientation. The availability of a static Fragment library will simplify the process of creating flexible layouts that are backwards compatible.&lt;br /&gt;
&lt;br /&gt;
It is my firm belief that any app developed for mobile should be available for tablets. When I put my credentials into a shiny new tablet, I expect it to install all the apps I use on my phone - and I expect all of them to be optimized for the tablet form factor.&lt;br /&gt;
&lt;br /&gt;
That's not to say you shouldn't create apps that are designed to work only on tablets, but I believe these tablet-specific editions should be made available side-by-side with phone versions that have been optimized to work on tablets.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10735231-3316444816520012505?l=blog.radioactiveyak.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheRadioactiveYak?a=ZzqsVqxaWIs:pR7AQpWYdr0:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheRadioactiveYak?i=ZzqsVqxaWIs:pR7AQpWYdr0:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheRadioactiveYak?a=ZzqsVqxaWIs:pR7AQpWYdr0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheRadioactiveYak?i=ZzqsVqxaWIs:pR7AQpWYdr0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheRadioactiveYak/~4/ZzqsVqxaWIs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.radioactiveyak.com/feeds/3316444816520012505/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.radioactiveyak.com/2011/02/strategies-for-honeycomb-and-backwards.html#comment-form" title="17 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10735231/posts/default/3316444816520012505?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10735231/posts/default/3316444816520012505?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheRadioactiveYak/~3/ZzqsVqxaWIs/strategies-for-honeycomb-and-backwards.html" title="Strategies for Honeycomb and Backwards Compatibility" /><author><name>Reto Meier</name><uri>https://profiles.google.com/111169963967137030210</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-FnQer4-BRHE/AAAAAAAAAAI/AAAAAAAAhdQ/hYIqsdGTYgA/s512-c/photo.jpg" /></author><thr:total>17</thr:total><feedburner:origLink>http://blog.radioactiveyak.com/2011/02/strategies-for-honeycomb-and-backwards.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEECRXg_fCp7ImA9Wx9VFkU.&quot;"><id>tag:blogger.com,1999:blog-10735231.post-3448517514537290575</id><published>2011-02-02T20:28:00.001Z</published><updated>2011-02-02T22:44:24.644Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-02T22:44:24.644Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Honeycomb" /><category scheme="http://www.blogger.com/atom/ns#" term="market" /><category scheme="http://www.blogger.com/atom/ns#" term="android" /><title>Android Web Market, In App Billing, and Buyer Currency</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Today during the Android Honeycomb Event we launched a couple of really exciting new features Android. As well as a closer look at what's possible with the Honeycomb SDK, we also announced:&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;a href="http://market.android.com/"&gt;Web-based Android Market&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;In App billing&lt;/li&gt;
&lt;li&gt;Buyer currency support&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;There's more details on all three at the &lt;a href="http://android-developers.blogspot.com/2011/02/new-merchandising-and-billing-features.html"&gt;Android Developer Blog&lt;/a&gt;, and you can watch the &lt;a href="http://www.youtube.com/android"&gt;launch event&lt;/a&gt; on YouTube.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;b&gt;Web Based Android Market&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;This is long awaited and seriously cool. Finally we developers have a homepage on the web for our Android apps. Not only that, but now we can install apps OTA simply by pressing install and the app of our choice will be automagically pushed to our phone.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;My question to you: Have you uploaded the 512x512 alpha blended app icon and 1024x500 full bleed feature graphic? If the answer is no, then you have (at best) a 72x72 icon stretched into jaggy hell representing your app to would be users. That's probably something you want to do something about sooner rather than later.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;To celebrate web landing pages for apps I've put together this &lt;a href="http://blog.radioactiveyak.com/p/reto-meiers-installed-android-apps.html"&gt;list of the apps&lt;/a&gt; that I've been using on my Android devices.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;b&gt;Buyer Currency Support&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;You can now specify different prices for different currencies - and even more importantly, as a result users will always see the app priced in their local currency. No more "~" symbols or strange foreign currencies.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;b&gt;In App Billing&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;More ways for developers to monetize their apps can only be a good thing. A simpler purchase process for users benefits everyone.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10735231-3448517514537290575?l=blog.radioactiveyak.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheRadioactiveYak?a=B8y2Wbphrwo:XuWmAUuXwFM:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheRadioactiveYak?i=B8y2Wbphrwo:XuWmAUuXwFM:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheRadioactiveYak?a=B8y2Wbphrwo:XuWmAUuXwFM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheRadioactiveYak?i=B8y2Wbphrwo:XuWmAUuXwFM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheRadioactiveYak/~4/B8y2Wbphrwo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.radioactiveyak.com/feeds/3448517514537290575/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.radioactiveyak.com/2011/02/android-web-market-in-app-billing-and.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10735231/posts/default/3448517514537290575?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10735231/posts/default/3448517514537290575?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheRadioactiveYak/~3/B8y2Wbphrwo/android-web-market-in-app-billing-and.html" title="Android Web Market, In App Billing, and Buyer Currency" /><author><name>Reto Meier</name><uri>https://profiles.google.com/111169963967137030210</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-FnQer4-BRHE/AAAAAAAAAAI/AAAAAAAAhdQ/hYIqsdGTYgA/s512-c/photo.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://blog.radioactiveyak.com/2011/02/android-web-market-in-app-billing-and.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkMNRHY-cCp7ImA9Wx9VFUo.&quot;"><id>tag:blogger.com,1999:blog-10735231.post-1846534248100935888</id><published>2011-02-01T16:36:00.002Z</published><updated>2011-02-01T16:41:35.858Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-01T16:41:35.858Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Honeycomb" /><category scheme="http://www.blogger.com/atom/ns#" term="Android App Surgery" /><category scheme="http://www.blogger.com/atom/ns#" term="tablets" /><category scheme="http://www.blogger.com/atom/ns#" term="android" /><title>Android App Surgery: Earthquake Redux (Honeycomb Tablet Edition)</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;If you follow &lt;a href="http://www.twitter.com/retomeier"&gt;me on Twitter&lt;/a&gt; you'll know I spent a great deal of the week before last firmly in The Zone, lost in the &lt;a href="http://twitter.com/retomeier/status/28528223830671360"&gt;joyful exuberance&lt;/a&gt; of writing code. What I was working on? I was exploring the many and varied &lt;a href="http://android-developers.blogspot.com/2011/01/android-30-platform-preview-and-updated.html"&gt;Android 3.0 (Honeycomb) SDK APIs.&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
To celebrate the Honeycomb &lt;a href="http://developer.android.com/sdk/preview/index.html"&gt;preview SDK&lt;/a&gt; I'm doing an &lt;a href="http://blog.radioactiveyak.com/search/label/Android%20App%20Surgery"&gt;Android App Surgery&lt;/a&gt; that explores how I modified my existing Earthquake phone app for Honeycomb tablet devices. If you're interested in seeing more of these, &lt;a href="http://www.google.com/moderator/#15/e=63d0&amp;amp;t=63d0.44"&gt;nominate an app for review&lt;/a&gt;!&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;object class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://i.ytimg.com/vi/knF7RGqk4MI/0.jpg" height="345" width="560"&gt;&lt;param name="movie" value="http://www.youtube.com/v/knF7RGqk4MI?f=user_uploads&amp;c=google-webdrive-0&amp;app=youtube_gdata" /&gt;&lt;param name="bgcolor" value="#FFFFFF" /&gt;&lt;embed width="560" height="345" src="http://www.youtube.com/v/knF7RGqk4MI?f=user_uploads&amp;c=google-webdrive-0&amp;app=youtube_gdata&amp;hd=1" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;
&lt;b&gt;The App: Earthquake! (Tablet Edition)&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
I've taken the tablet&amp;nbsp;redesign&amp;nbsp;as an opportunity to implement many of the ideas that came up during my original &lt;a href="http://blog.radioactiveyak.com/2010/07/android-app-surgery-earthquake.html"&gt;Earthquake App Surgery&lt;/a&gt;. Chief amongst them was to improve the user&amp;nbsp;experience, so I enlisted my colleague &lt;a href="http://twitter.com/romannurik"&gt;Roman Nurik&lt;/a&gt; to help me create a more polished design.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_xf-lmLuWr6U/TUBLNeugejI/AAAAAAAAQRA/hPgs7pDYcIo/s640/preview2.png" style="cursor: move;" width="600" /&gt;&lt;/div&gt;&lt;br /&gt;
As well as a tasteful and distinctive red and white theme, this new UI style incorporates the &lt;a href="http://android-developers.blogspot.com/2010/05/twitter-for-android-closer-look-at.html"&gt;Action Bar&lt;/a&gt; design pattern that simplifies navigation and highlights the refresh action. Small touches like the &lt;a href="http://developer.android.com/reference/android/graphics/drawable/LevelListDrawable.html"&gt;Level List Drawables &lt;/a&gt;used to indicate the relative size of each quake, the improved layout of each List View Item, and the introduction of the detail view work together to produce an app the is far more polished and intuitive.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Here's something I prepared earlier&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_xf-lmLuWr6U/TUAK6maXXGI/AAAAAAAAQQE/EeLCuwheq2E/s1600/Earthquake_Full_Screen.png" style="cursor: move;" width="600" /&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;The tablet design incorporates the distinctive new theme and List View Item layout, while the extra screen size lets me pull all three Activities (map, list, and details) into a single layout using Fragments. &amp;nbsp;In Honeycomb the Action Bar is a standard application component; I've customized it to use my theme and support my preferred navigation style and common actions.&lt;/div&gt;&lt;br /&gt;
&amp;nbsp;&lt;b&gt;The defining feature of the tablet is its extra large screen&lt;/b&gt;&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;i&gt;...or how I learned to stop worrying and love Fragments&lt;/i&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;i&gt;&lt;br /&gt;
&lt;/i&gt;&lt;/div&gt;The most pressing issue for most developers will be making effective use of an extra-large display. Fragments let you structure your Activities into separate interacting components.&lt;br /&gt;
&lt;br /&gt;
You can easily rearrange, replace, show, and hide individual Fragments based on screen size, orientation, or user interaction. This is really useful for designing apps to support different screen sizes, or creating different layouts for portrait versus landscape.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_xf-lmLuWr6U/TUBI3ZAFnnI/AAAAAAAAQQ8/2nPT7Q1mjHo/s640/Fragment_Layout.png" width="600" /&gt;&lt;/div&gt;&lt;br /&gt;
Each Fragment encapsulates a piece of application UI and the associated functionality. Like Activities, the visual layout for each Fragment is defined in layout XML files. Typically the Activity layouts for landscape, portrait, and different screen sizes simply rearrange how the same Fragments are laid out.&lt;br /&gt;
&lt;br /&gt;
I've used three Fragments plus the Action Bar. One to display the list of earthquakes, another to show the map, and a third to display the selected details.&lt;br /&gt;
&lt;blockquote&gt;For many tablet devices landscape will be the default orientation, so my primary design for Earthquake is landscape, but it's important to also create a compelling portrait mode.&lt;/blockquote&gt;Like Activities, each Fragment has its own lifecycle. You use the life cycle events to to save state and connect/disconnect listeners and receivers just as you used to do within Activities.&lt;br /&gt;
&lt;br /&gt;
Each fragment can access its parent Activity by calling &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;getActivity&lt;/span&gt;, and each Activity can find any of its Fragments with &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;findFragmentById&lt;/span&gt;. This lets Fragments interact with each other regardless of their&amp;nbsp;visibility&amp;nbsp;or how they're laid out within an Activity.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Fragment Transactions let you modify the screen layout in real-time in response to user actions&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
You can show, hide, or replace individual Fragments at run time to create dynamic, interactive displays.&amp;nbsp;In Earthquake I use Fragment Transactions to replace the details Fragment whenever a new quake is selected, and to hide the list and details fragments when the app switches to full screen.&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;FragmentTransaction ft = getFragmentManager().beginTransaction();&lt;br /&gt;
ft.hide(listFragment);&lt;br /&gt;
ft.commit();&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
The Fragment framework also lets you set breadcrumbs as you show, hide, or replace Fragments that allow cause the back button to revert the last transaction. In many cases your application will now contain a single Activity with a number of Fragments that are displayed, hidden, or replaced based on user navigation.&lt;br /&gt;
&lt;blockquote&gt;In Earthquake, for example, the normal (phone sized) UI layout would have a single Activity with the list Fragment visible at launch. Clicking a quake would replace the list with the with this transaction being added to the back stack so that a user pressing back returns then to the list view. I'd probably also use Tab Navigation in the Action Bar to let users switch between the map and list views.&lt;/blockquote&gt;&lt;b&gt;The New Navigation: Introducing the Action Bar&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
The Action Bar component is a navigation panel&amp;nbsp;that replaces the old title bar at the top of every Activity which neatly formalizes the emerging "Action Bar"&amp;nbsp;&lt;a href="http://android-developers.blogspot.com/2010/05/twitter-for-android-closer-look-at.html"&gt;design pattern&lt;/a&gt;. It's possible to hide the Action Bar, but best practice is to keep it and customize it to suit the style and navigation requirements of your app.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_xf-lmLuWr6U/TUA0pPaT41I/AAAAAAAAQQs/CaZIJTdM2Go/s1600/ActionBarDescription.png" /&gt;&lt;/div&gt;&lt;br /&gt;
I started by applying a custom gradient to the background.&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;final ActionBar ab = getActionBar();&lt;br /&gt;
final Resources r = getResources();&lt;br /&gt;
final Drawable myDrawable = r.getDrawable(R.drawable.gradient_header);&lt;br /&gt;
ab.setBackgroundDrawable(myDrawable);&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Next is navigation. There's a number of options for navigating your application - the two most common are tabs and drop down lists. I've used a drop down so users can choose the minimum magnitude of quakes to display. I might add a second drop down to also view quakes based on distance.&lt;br /&gt;
&lt;br /&gt;
Here's how I create the drop down list and set the navigation mode on the Action Bar to display the drop down list.&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;ArrayAdapter mSpinnerAdapter;&lt;br /&gt;
mSpinnerAdapter = ArrayAdapter.createFromResource(this,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;R.array.magnitude_options,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;android.R.layout.simple_list_item_multiple_choice);&lt;br /&gt;
ab.setListNavigationCallbacks(mSpinnerAdapter, mOnNavigationListener);&lt;br /&gt;
&lt;br /&gt;
ab.setNavigationMode(ActionBar.NAVIGATION_MODE_DROPDOWN_LIST);&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
The standard menu button has been deprecated in Honeycomb, in it's place is the on-screen menu icon at the far right of the Action Bar. The icons to its left are Menu Items that represent common actions.&lt;br /&gt;
&lt;br /&gt;
To make them appear as Action Bar icons, you just flag them as &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;SHOW_AS_ACTION&lt;/span&gt;, &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;SHOW_AS_IF_SPACE&lt;/span&gt;, or &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;SHOW_AS_ACTION_WITH_TEXT&lt;/span&gt; which will make their icons visible, visible only if there is enough space, and/or with the menu text visible respectively.&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;fullScreenMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Animations that are smooth like butter&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
One of my favourite Honeycomb APIs is the new Animation framework. It boldly promises nothing less than the ability to animate any property on any object, and it delivers on that promise spectacularly.&lt;br /&gt;
&lt;br /&gt;
The original idea for Earthquake was based on an &lt;a href="http://www.amnh.org/rose/hope/seismograph/"&gt;inspiring exhibit&lt;/a&gt; at the New York Natural History Museum. It used animated expanding circles to dramatically illustrate the size and location of earthquakes and their relative timing.&lt;br /&gt;
&lt;br /&gt;
I can now achieve the same effect by creating an Object Animator that animates the Image Level property of the Scale Drawable objects used to illustrate the felt radius of each quake.&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;final ObjectAnimator oa = new ObjectAnimator();&lt;br /&gt;
oa.setDuration(3*1000);&lt;br /&gt;
oa.setIntValues(0, 10000);&lt;br /&gt;
oa.setTarget(eachExandingCircle);&lt;br /&gt;
oa.setPropertyName("ImageLevel");&lt;br /&gt;
oa.start();&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
The silky smooth transition in and out of full-screen mode is also animated using an Object Animator. This time I'm animating the Layout Parameters of the Activity layout to adjust the relative weight of the list and map Fragments.&lt;br /&gt;
&lt;br /&gt;
The animated transitions between detail Fragments are managed by a Fragment Transaction. I simply specify the fragment to replace, what to replace it with, and what animation to use for the transition.&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;DetailsFragment newFragment = DetailsFragment.newInstance(quake_id);&lt;br /&gt;
FragmentTransaction ft = getFragmentManager().beginTransaction();&lt;br /&gt;
ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);&lt;br /&gt;
ft.replace(R.id.details_fragment_container, newFragment, "detailFragment");&lt;br /&gt;
ft.commit();&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;
&lt;b&gt;Still to do...&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
I'm pretty happy with the styling and user experience so far, the next step is to incorporate the significant improvements to the Widget and Notification APIs.&lt;br /&gt;
&lt;br /&gt;
Before launch I'll create a new list-based widget of recent quakes and an enhanced notification layout.&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;b&gt;Get Your App Reviewed!&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
If you'd like to see how your app might look and work on a Honeycomb tablet, you can self-nominate at the &lt;a href="http://www.google.com/moderator/#15/e=63d0&amp;amp;t=63d0.44"&gt;moderator site&lt;/a&gt;. You can also go there to &lt;a href="http://www.google.com/moderator/#15/e=63d0&amp;amp;t=63d0.44"&gt;vote&lt;/a&gt; for which app you'd like to see reviewed! If you've got questions about developing for Honeycomb, head to &lt;a href="http://stackoverflow.com/questions/tagged/honeycomb"&gt;StackOverflow&lt;/a&gt; and mark your questions with the Android and Honeycomb tags.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10735231-1846534248100935888?l=blog.radioactiveyak.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheRadioactiveYak?a=urUJhIYMsMo:Yv8tKMyNEUk:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheRadioactiveYak?i=urUJhIYMsMo:Yv8tKMyNEUk:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheRadioactiveYak?a=urUJhIYMsMo:Yv8tKMyNEUk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheRadioactiveYak?i=urUJhIYMsMo:Yv8tKMyNEUk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheRadioactiveYak/~4/urUJhIYMsMo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.radioactiveyak.com/feeds/1846534248100935888/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.radioactiveyak.com/2011/02/android-app-surgery-earthquake-redux.html#comment-form" title="18 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10735231/posts/default/1846534248100935888?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10735231/posts/default/1846534248100935888?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheRadioactiveYak/~3/urUJhIYMsMo/android-app-surgery-earthquake-redux.html" title="Android App Surgery: Earthquake Redux (Honeycomb Tablet Edition)" /><author><name>Reto Meier</name><uri>https://profiles.google.com/111169963967137030210</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-FnQer4-BRHE/AAAAAAAAAAI/AAAAAAAAhdQ/hYIqsdGTYgA/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_xf-lmLuWr6U/TUBLNeugejI/AAAAAAAAQRA/hPgs7pDYcIo/s72-c/preview2.png" height="72" width="72" /><thr:total>18</thr:total><feedburner:origLink>http://blog.radioactiveyak.com/2011/02/android-app-surgery-earthquake-redux.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0EDQ3g6eCp7ImA9Wx9XFko.&quot;"><id>tag:blogger.com,1999:blog-10735231.post-7842316337065828260</id><published>2011-01-10T16:07:00.000Z</published><updated>2011-01-10T16:07:52.610Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-01-10T16:07:52.610Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="professional android application development" /><category scheme="http://www.blogger.com/atom/ns#" term="android" /><title>How To: Use the Gyroscope API and Remain Android 1.1 Compatible</title><content type="html">&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Making your app backwards compatible is the process of ensuring it degrades gracefully.&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Every new Android SDK release introduces a variety of new APIs&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
It takes time for each new OS version to&amp;nbsp;percolate&amp;nbsp;through the ecosystem, so while new functionality is cool, but it introduces a&amp;nbsp;dilemma&amp;nbsp;- use the new hotness or support the majority of users?&lt;br /&gt;
&lt;br /&gt;
The answer of course is to do both! Make use of useful new APIs where they're available, and fall back to an earlier alternative (or disable functionality) when necessary.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Let's look at a practical example&lt;/b&gt;&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;My Nexus S has a gyroscope sensor that I can use to stabilize my artificial&amp;nbsp;horizon / compass app (New Horizons). I'll save most of the implementation details for a separate post, and focus instead on how I can adjust my code to go from supporting only Android 2.3, to supporting everything from Android 1.0 up.&lt;br /&gt;
&lt;blockquote&gt;&lt;i&gt;The &lt;a href="http://d.android.com/resources/dashboard/platform-versions.html"&gt;platform version distribution&lt;/a&gt; shows 99.9% of devices are now running at least Android 1.5, and more than 75% are running 2.1+, so in this case achieving 1.0&amp;nbsp;compatibility&amp;nbsp;is a contrivance that lets me demonstrate a number of useful techniques within a single example.&lt;/i&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;I'll start by reacting to orientation changes using the gyroscope in 2.3 and then remove hardware and API features until we end up compatible with a factory-fresh HTC G1.&lt;/div&gt;&lt;br /&gt;
&lt;b&gt;Using the gyroscope sensor&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
You'll need code that looks a little like this:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;private void hookupSensorListener() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;SensorManager sm = (SensorManager)getSystemService(Context.SENSOR_SERVICE);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;sm.registerListener(sel,&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;sm.getDefaultSensor(Sensor.TYPE_GYROSCOPE),&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;SensorManager.SENSOR_DELAY_UI);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
private final SensorEventListener sel = new SensorEventListener() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;public void onSensorChanged(SensorEvent event) { &lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;if (event.sensor.getType() == Sensor.TYPE_GYROSCOPE) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;updateOrientation(event.values[0],&amp;nbsp;event.values[1],&amp;nbsp;event.values[2]);&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;public void onAccuracyChanged(Sensor sensor, int accuracy) {}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
private void updateOrientation(float heading, float pitch, float roll) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;// Update the UI&lt;br /&gt;
}&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Within the &lt;code&gt;updateOrientation&lt;/code&gt; method you react to each orientation change (for a gyro that's going to mean integrating the changes in angular velocity) and eventually extract values you'll use to update the UI.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Case 1: What if there is no gyroscope?&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Can we implement the same functionality with different hardware? In this case yes, we can use the accelerometers to determine our orientation.&lt;br /&gt;
&lt;br /&gt;
Start by creating a listener interface that can listen for orientation changes:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;public interface OrientationChangeListener {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;public void onUpdate(float heading, float pitch, float roll);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;public void onAccuraryChanged(int accuracy);&lt;br /&gt;
}&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Then define another interface that can be implemented to handle orientation updates from different sensor hardware:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;public interface IOrientationSensorListener {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;public void setOrientationChangeListener(OrientationChangeListener l);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;public void registerListener(SensorManager sensorManager);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;public void unregisterListener(SensorManager sensorManager);&lt;br /&gt;
}&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Create two implementations of the &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;IOrientationSensorListener&lt;/span&gt; class, one that uses the gyro and the other that uses accelerometers:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;code&gt;GyroOrientationSensorListener&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AccOrientationSensorListener&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;The orientation updates are encapsulated in their hardware-specific implementations, so we need to implement an &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;OrientationChangeListener&lt;/span&gt; that will receive their orientation updates and update the UI accordingly:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;final OrientationChangeListener ocl = new OrientationChangeListener() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;public void onUpdate(float heading, float pitch, float roll,) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;updateOrientation(heading, pitch, roll);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;public void onAccuraryChanged(int accuracy) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;updateAccuracy(accuracy);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
});&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Now we determine if the gyro is available:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;PackageManager paM = getPackageManager();&lt;br /&gt;
boolean gyroExists = paM.hasSystemFeature(PackageManager.FEATURE_SENSOR_GYROSCOPE);&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
And instantiate the&amp;nbsp;appropriate&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;IOrientationSensorListener&lt;/span&gt; implementation:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;IOrientationSensorListener mySensorListener;&lt;br /&gt;
if (gyroExists)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;mySensorListener = new GyroOrientationSensorListener();&lt;br /&gt;
else&lt;br /&gt;
&amp;nbsp;&amp;nbsp;mySensorListener = new AccOrientationSensorListener();&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Before hooking up the orientation change listener:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;mySensorListener.setOrientationChangeListener(ocl);&lt;/code&gt;&lt;br /&gt;
&lt;blockquote&gt;&lt;i&gt;For cases where there is no viable alternative&amp;nbsp;hardware, you can either disable that functionality completely, or&amp;nbsp;specify the required hardware as a mandatory feature:&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;uses-feature android:name="android.hardware.sensor.gyroscope"/&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Note that this will prevent your app from being visible on the Market for devices without the required hardware.&lt;/i&gt;&lt;/blockquote&gt;&lt;br /&gt;
&lt;b&gt;Case 2: What if the APIs you're using are missing?&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
While your Android 2.3 app will install and run on any version of the Android OS, it will crash the moment it tries to use a class or method that doesn't exist on that device. To figure out what needs to be fixed, you can modify your project's build target to the lowest OS version you intend to support and see what won't compile.&lt;br /&gt;
&lt;br /&gt;
Looking at my code above, I can see the following constants, methods, and classes were introduced since Android 1.0:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;API Level 9: &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;PackageManager.FEATURE_SENSOR_GYROSCOPE&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;API Level 6: &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;PackageManager.hasSystemFeature(&lt;/span&gt;)&lt;/li&gt;
&lt;li&gt;API Level 3: &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Sensor&lt;/span&gt;, &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;SensorEvent&lt;/span&gt;, and &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;SensorEventListener&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;b&gt;Dealing with new constants&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
New constants will work without any changes. The compiler will convert them into the value they represent and the methods into which you pass them should be able to handle with&amp;nbsp;unrecognized&amp;nbsp;values cleanly.&lt;br /&gt;
&lt;br /&gt;
In this instance I pass a string constant into the &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;hasSystemFeature&lt;/span&gt; method that assumes any feature it doesn't recognize isn't available and returns false.&lt;br /&gt;
&lt;br /&gt;
We're now compatible with API Level 6 (Android 2.0.1)!&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Dealing with missing methods&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Missing methods are a little more complicated. In this case the &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;PackageManager&lt;/span&gt; class has been extended to include the &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;hasSystemFeature&lt;/span&gt; method. If you call this method on a device running Android 1.6 (or below) it will throw an exception and crash.&lt;br /&gt;
&lt;br /&gt;
To avoid this you can:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Use reflection at runtime to determine if the method exists.&lt;/li&gt;
&lt;li&gt;Replace the method with an alternative that works on previous OS versions.&lt;/li&gt;
&lt;/ul&gt;Reflection is expensive, so first we'll check if there's a cheaper alternative that doesn't add significant complexity or cost.&lt;br /&gt;
&lt;br /&gt;
In this case I can use &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;SensorManager.getDefaultSensor&lt;/span&gt; to check if there is a default gyroscope sensor available.&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;boolean gyroExists = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE) != null;&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
We're now compatible with API Level 3 (Android 1.5), and given the distribution of Android OS versions in the wild, for most cases we'd be done.&lt;br /&gt;
&lt;br /&gt;
We still haven't looked at dealing with missing classes though, so for the sake of completeness let's go one step further and ensure support for Android 1.0.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Dealing with missing classes&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
The &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Sensor&lt;/span&gt;, &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;SensorEvent&lt;/span&gt;, and &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;SensorEventListener&lt;/span&gt; classes were all added in Android 1.5 (along with a number of useful &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;SensorManager&lt;/span&gt; methods including &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;getDefaultSensor&lt;/span&gt; used above). &lt;br /&gt;
&lt;br /&gt;
Let's start by using reflection to see if the new Sensor classes and methods are available. This can be expensive so it's important to perform the check only once per application launch. We'll also assume that the existence of one 1.5+ class implies the existence of the rest.&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;private static boolean sensorListenerExists = false;&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
private static void checkSensorEventListenerExists() throws NoClassDefFoundError {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;sensorEventListenerExists = SensorEventListener.class != null;&lt;br /&gt;
}&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
static {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;try {&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;checkSensorEventListenerExists();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;} catch (NoClassDefFoundError e) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;sensorEventListenerExists = false;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
}&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
To avoid an exception on calling &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;getDefaultSensor&lt;/span&gt; we need to move this call into a new class that's only used if the new method is available. Let's expose the functionality using a static method to avoid the need to create any new objects:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;public class SensorEventHasGyro  { &lt;br /&gt;
&amp;nbsp;&amp;nbsp;public static boolean gyroExists(SensorManager sensorManager) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;return sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE) != null;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
}&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Gyroscopes weren't supported prior to Android 1.5, so we can check for a gyroscope sensor using the following code:&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;boolean gyroExists = sensorListenerExists &amp;amp;&amp;amp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SensorEventHasGyro.gyroExists(sensorManager);&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Finally, we create a new implementation of the &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;OrientationSensorListener&lt;/span&gt; that uses the old technique for calculating orientation from accelerometers (which is so deprecated it's not worth repeating here), then modify the code used to select and instantiate the correct implementation.&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;if (gyroExists)&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&amp;nbsp;&amp;nbsp;mySensorListener = new GyroOrientationSensorListener();&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;else if (sensorListenerExists)&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&amp;nbsp;&amp;nbsp;mySensorListener = new AccOrientationSensorListener();&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;else&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&amp;nbsp;&amp;nbsp;mySensorListener = new AccOldOrientationSensorListener();&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;b&gt;Summary&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;While providing support for Android 1.0 as done in this example is a little contrived, the same techniques will work in cases like the Download Manager or SIP stack where the majority of users don't have access to the newer versions of the OS.&lt;/div&gt;&lt;br /&gt;
Why wait until everyone is using Android 2.3 to make use of the gyroscope or download manager? Using these techniques you can build it in right now, and simply provide an alternative implementation for users who aren't fortunate enough to have the latest hardware / software.&lt;br /&gt;
&lt;div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10735231-7842316337065828260?l=blog.radioactiveyak.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheRadioactiveYak?a=2Fxw1QrGYVc:ClDrsnEJl9c:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheRadioactiveYak?i=2Fxw1QrGYVc:ClDrsnEJl9c:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheRadioactiveYak?a=2Fxw1QrGYVc:ClDrsnEJl9c:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheRadioactiveYak?i=2Fxw1QrGYVc:ClDrsnEJl9c:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheRadioactiveYak/~4/2Fxw1QrGYVc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.radioactiveyak.com/feeds/7842316337065828260/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.radioactiveyak.com/2011/01/how-to-use-gyroscope-api-and-remain.html#comment-form" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10735231/posts/default/7842316337065828260?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10735231/posts/default/7842316337065828260?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheRadioactiveYak/~3/2Fxw1QrGYVc/how-to-use-gyroscope-api-and-remain.html" title="How To: Use the Gyroscope API and Remain Android 1.1 Compatible" /><author><name>Reto Meier</name><uri>https://profiles.google.com/111169963967137030210</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-FnQer4-BRHE/AAAAAAAAAAI/AAAAAAAAhdQ/hYIqsdGTYgA/s512-c/photo.jpg" /></author><thr:total>5</thr:total><feedburner:origLink>http://blog.radioactiveyak.com/2011/01/how-to-use-gyroscope-api-and-remain.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkYGQX8zcSp7ImA9Wx9XEEo.&quot;"><id>tag:blogger.com,1999:blog-10735231.post-6515638041788429244</id><published>2011-01-03T15:55:00.000Z</published><updated>2011-01-03T15:55:20.189Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-01-03T15:55:20.189Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="books" /><category scheme="http://www.blogger.com/atom/ns#" term="gadgets" /><category scheme="http://www.blogger.com/atom/ns#" term="android" /><category scheme="http://www.blogger.com/atom/ns#" term="meta" /><title>Listomania! My Reading List and Gadget Compendium</title><content type="html">&lt;b&gt;tl;dr&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Those of you interested can check out these lists of &lt;a href="http://blog.radioactiveyak.com/p/reto-meiers-reading-list.html"&gt;what I've been reading&lt;/a&gt; and what &lt;a href="http://blog.radioactiveyak.com/p/reto-meiers-gadget-compendium.html"&gt;gadgets I'm using&lt;/a&gt; (and have used).&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;The Long Version&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;My Reading List&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
One of my resolutions for 2010 was to read at least one book every two weeks. Having kept track of everything I read, I figured I might as well share it - hence &lt;a href="http://blog.radioactiveyak.com/p/reto-meiers-reading-list.html"&gt;Reto Meier's Reading List&lt;/a&gt;. Some observations from reviewing the list:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;b&gt;Favourite Book&lt;/b&gt;: &lt;a href="http://www.amazon.com/gp/product/068817762X?ie=UTF8&amp;amp;tag=interventione-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=068817762X"&gt;Music for Torching&lt;/a&gt; by A. M. Holmes.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Most Read Author&lt;/b&gt;: &lt;a href="http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;amp;location=http%3A%2F%2Fwww.amazon.com%2Fs%3Fie%3DUTF8%26redirect%3Dtrue%26ref_%3Dsr_tc_2_0%26keywords%3DPhilip%2520K.%2520Dick%26field-contributor_id%3DB000APY61E%26qid%3D1294070081%26sr%3D1-2-ent%26rh%3Di%253Astripbooks%252Ck%253APhilip%2520K.%2520Dick&amp;amp;tag=interventione-20&amp;amp;linkCode=ur2&amp;amp;camp=1789&amp;amp;creative=390957"&gt;Philip K Dick&lt;/a&gt; accounted for 4 of the 23 books I read in 2010.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;The Kindle Effect&lt;/b&gt;: I read 6 books in 2 months on Kindle versus 17 in the 9 months before.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Hardcover versus Paperback&lt;/b&gt;: 12 hardcovers, 6 eBooks, 5 paperbacks.&lt;/li&gt;
&lt;/ul&gt;I'll continue to update this with new books as I read them -- hopefully at a rate of one every two weeks.&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;My Gadget Compendium&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
I often get asked which gadgets (Android powered or otherwise) I'm currently carrying around. These days the list seems to change every month or so, so for easy reference I've put together &lt;a href="http://blog.radioactiveyak.com/p/reto-meiers-gadget-compendium.html"&gt;Reto Meier's Gadget Compendium&lt;/a&gt;. &lt;br /&gt;
&lt;br /&gt;
I'll update it whenever a new gadget gets slightly less top secret, or something gets retired from the active lineup. A couple of observations from looking at my current lineup and the honorably discharged:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;b&gt;Rate of Innovation&lt;/b&gt;: From 2 phones in 5 years, to 5 phones in two years since the G1 was released in 2008.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Size&lt;/b&gt;: Everything (except my Netbook) has gotten thinner, lighter, and sleeker. There's also a distinct movement away from physical keys / buttons -- my SE P910i had a qwerty keyboard, dial pad, and a 5 function scroll wheel, my Nexus S and Galaxy Tab have only power and volume keys.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Connectivity&lt;/b&gt;: The only pieces of old kit with a mobile data connection where the phones. Now the only gadget in my bag &lt;i&gt;without&lt;/i&gt; 3G is my camera. Which reminds me, I must pick up an &lt;a href="http://www.amazon.com/gp/product/B003DV4234?ie=UTF8&amp;amp;tag=interventione-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=B003DV4234"&gt;Eye-Fi&lt;/a&gt; card.&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;With a broader variety of Android devices scheduled for release this year it'll be interesting to see if they replace or&amp;nbsp;augment&amp;nbsp;my existing collection of portable gadgets. I'd love to replace the netbook for a Chrome-powered variety, but I'm not sure I can imagine writing a whole book without Word so I'm not sure if that's on the cards.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10735231-6515638041788429244?l=blog.radioactiveyak.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheRadioactiveYak?a=ce9uEkz_qrU:iVC-29zXi_g:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheRadioactiveYak?i=ce9uEkz_qrU:iVC-29zXi_g:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheRadioactiveYak?a=ce9uEkz_qrU:iVC-29zXi_g:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheRadioactiveYak?i=ce9uEkz_qrU:iVC-29zXi_g:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheRadioactiveYak/~4/ce9uEkz_qrU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.radioactiveyak.com/feeds/6515638041788429244/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.radioactiveyak.com/2011/01/listomania-my-reading-list-and-gadget.html#comment-form" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10735231/posts/default/6515638041788429244?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10735231/posts/default/6515638041788429244?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheRadioactiveYak/~3/ce9uEkz_qrU/listomania-my-reading-list-and-gadget.html" title="Listomania! My Reading List and Gadget Compendium" /><author><name>Reto Meier</name><uri>https://profiles.google.com/111169963967137030210</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-FnQer4-BRHE/AAAAAAAAAAI/AAAAAAAAhdQ/hYIqsdGTYgA/s512-c/photo.jpg" /></author><thr:total>4</thr:total><georss:featurename>Greater London, UK</georss:featurename><georss:point>51.4339366 -0.2149308</georss:point><georss:box>51.2202136 -0.6818498 51.647659600000004 0.2519882</georss:box><feedburner:origLink>http://blog.radioactiveyak.com/2011/01/listomania-my-reading-list-and-gadget.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0QNRHw7eyp7ImA9Wx9TF00.&quot;"><id>tag:blogger.com,1999:blog-10735231.post-2443263903621687502</id><published>2010-11-25T16:21:00.001Z</published><updated>2010-11-25T18:23:15.203Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-11-25T18:23:15.203Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="gdd" /><category scheme="http://www.blogger.com/atom/ns#" term="adl" /><category scheme="http://www.blogger.com/atom/ns#" term="android" /><title>No. Sleep. 'Til Stockholm!</title><content type="html">&lt;a href="http://lanyrd.com/people/retomeier/"&gt;Ten events&lt;/a&gt; in seven cities across six countries in twenty-two days. &lt;br /&gt;
&lt;br /&gt;
The slides for "&lt;a href="http://www.slideshare.net/retomeier/being-epic-best-practices-for-building-android-apps"&gt;Being Epic: Best Practices for Android Development&lt;/a&gt;" are on SlideShare, and you can &lt;a href="http://www.youtube.com/watch?v=lk2oLp4X07I&amp;amp;p=25C4D980F95933C9"&gt;see me presenting them at GDD Prague&lt;/a&gt;. I also had the pleasure of co-presenting "HTML5 of Android for Mobile Development?" with Michael Mahemoff - you can &lt;a href="http://www.youtube.com/user/googlegooroo#p/u/14/pD9qKROLeTg"&gt;watch the video&lt;/a&gt; and / or &lt;a href="http://www.slideshare.net/retomeier/html5-or-android-for-mobile-development"&gt;check out the slides&lt;/a&gt; for that too.&lt;br /&gt;
&lt;br /&gt;
Starting with &lt;a href="http://www.droidcon.co.uk/"&gt;Droidcon UK&lt;/a&gt; on the 28th, I spent every day of the following 3 weeks either in the air or presenting. I lost my voice at the second event (an epic all-day Android Developer Lab in Berlin), but after resting it in Florence it held up all the way until Prague (where it lasted through the keynote but started failing in the last 5 minutes of my Android presentation.)&lt;br /&gt;
&lt;br /&gt;
&lt;img border="0" src="http://3.bp.blogspot.com/_xf-lmLuWr6U/TO6LZ9rpJRI/AAAAAAAAP0U/gLRD5xXWSq8/s640/ADLGDDPic.JPG" width="600" /&gt;&lt;br /&gt;
&lt;br /&gt;
It was a hell of a tour, filled with great events and incredible people. Starting with Yan, our host at &lt;a href="http://www.c-base.org/"&gt;C-Base&lt;/a&gt; and the man with the megaphone herding cats to successfully lead the &lt;a href="http://www.facebook.com/blinkendroid"&gt;Blinkendroid world record&lt;/a&gt; at GDD Munich.&lt;br /&gt;
&lt;br /&gt;
From Berlin we flew down to Florence - thanks in no small part to Andrea &lt;a href="http://www.androidiani.com/adl.html"&gt;forcefully insisting&lt;/a&gt; that we hold an ADL in Italy. Francesca and the &lt;a href="http://sites.google.com/site/firenzegtug/"&gt;Firenze GTUG&lt;/a&gt; then took us out to an incredible meal (featuring 4 entrees) at a wonderful tratoria before we headed out for Munich and the &lt;a href="http://www.google.com/events/developerday/2010/"&gt;GDD events&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
One of the most interesting aspects of doing so many events in close succession is learning what resonates best with different audiences. The best reaction I got was by imploring Czech developers not the be "Hovados". Explaining (in German) to the Munich attendees that my German was terrible, and as a result I'd be completing my presentation in English, seemed to get the crowd on-side.&lt;br /&gt;
&lt;br /&gt;
Moscow is always a highlight of any GDD trip - and we got the incredibly warm welcome we've learned to expect. A special thank you goes out to the folks at &lt;a href="http://andrstore.com/"&gt;Andrstore&lt;/a&gt; in Russia, who provided the latest addition to my plushy Android collection (pictured above). &lt;br /&gt;
&lt;br /&gt;
We ended the tour at the Ice Bar in Stockholm, after Peter Svensson let us take part in a special Android themed GTUG event that was the perfect end to a long, rewarding expedition.&lt;br /&gt;
&lt;br /&gt;
There will be more detailed posts on the Android Developer blog and Google Code blog, but for now I just wanted to say thank you to everyone who helped make this possible. From the GTUG organizers, to my fellow Googlers, and most of all the participants - you guys make the endless travel worthwhile. Thanks for coming out!&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Time for New Material&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
I'm now heartily sick of my slides and it's time for some new material. So tell me, loyal Android developers, what would you like to hear more about? Let me know in the comments!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10735231-2443263903621687502?l=blog.radioactiveyak.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheRadioactiveYak?a=UxGePiozctM:woe71JsDOCo:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheRadioactiveYak?i=UxGePiozctM:woe71JsDOCo:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheRadioactiveYak?a=UxGePiozctM:woe71JsDOCo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheRadioactiveYak?i=UxGePiozctM:woe71JsDOCo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheRadioactiveYak/~4/UxGePiozctM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.radioactiveyak.com/feeds/2443263903621687502/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.radioactiveyak.com/2010/11/no-sleep-til-stockholm.html#comment-form" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10735231/posts/default/2443263903621687502?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10735231/posts/default/2443263903621687502?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheRadioactiveYak/~3/UxGePiozctM/no-sleep-til-stockholm.html" title="No. Sleep. 'Til Stockholm!" /><author><name>Reto Meier</name><uri>https://profiles.google.com/111169963967137030210</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-FnQer4-BRHE/AAAAAAAAAAI/AAAAAAAAhdQ/hYIqsdGTYgA/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_xf-lmLuWr6U/TO6LZ9rpJRI/AAAAAAAAP0U/gLRD5xXWSq8/s72-c/ADLGDDPic.JPG" height="72" width="72" /><thr:total>6</thr:total><feedburner:origLink>http://blog.radioactiveyak.com/2010/11/no-sleep-til-stockholm.html</feedburner:origLink></entry></feed>

