<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Gadget Reviews from Coolman.ca</title>
	
	<link>http://gadgets.coolman.ca</link>
	<description>Just another technology review blog</description>
	<lastBuildDate>Fri, 15 Mar 2013 08:06:44 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
	<div id="fb-root" />
					<script type="text/javascript">
						window.fbAsyncInit = function()
						{
							FB.init({appId: null, status: true, cookie: true, xfbml: true});
						};
						(function()
						{
							var e = document.createElement('script'); e.async = true;
							e.src = document.location.protocol + '//connect.facebook.net/en_US/all.js';
							document.getElementById('fb-root').appendChild(e);
						}());
					</script>	
						<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/GadgetReviewsFromCoolmanca" /><feedburner:info uri="gadgetreviewsfromcoolmanca" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>GadgetReviewsFromCoolmanca</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>New Device Simulator skins</title>
		<link>http://feedproxy.google.com/~r/GadgetReviewsFromCoolmanca/~3/xQyuKOtFp_4/</link>
		<comments>http://gadgets.coolman.ca/new-device-simulator-skins-201303/#comments</comments>
		<pubDate>Thu, 14 Mar 2013 17:13:12 +0000</pubDate>
		<dc:creator>Eric Coolman</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Downloads]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Blackberry]]></category>
		<category><![CDATA[CodenameOne]]></category>
		<category><![CDATA[Cross-platform]]></category>
		<category><![CDATA[IOS]]></category>
		<category><![CDATA[J2ME]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Nokia]]></category>
		<category><![CDATA[S40]]></category>
		<category><![CDATA[Vase]]></category>
		<category><![CDATA[Windows Phone]]></category>

		<guid isPermaLink="false">http://gadgets.coolman.ca/?p=884</guid>
		<description><![CDATA[<p><p><a href="http://gadgets.coolman.ca/new-device-simulator-skins-201303/">New Device Simulator skins</a></p><p>There have been a lot of popular new devices introduced in the last year, so it&#8217;s a good time to refresh the device simulator with some new skins.  The following skins are now available in the Vase API project: BlackBerry 10 Simulators NOTE: The initial support for BlackBerry 10 in Codename One will be using [...]</p></p><p><a href="http://gadgets.coolman.ca/new-device-simulator-skins-201303/">New Device Simulator skins</a></p>]]></description>
			<content:encoded><![CDATA[<p><a href="http://gadgets.coolman.ca/new-device-simulator-skins-201303/">New Device Simulator skins</a></p><div class='wpfblike' style='float:left'><fb:like href='http://gadgets.coolman.ca/new-device-simulator-skins-201303/' layout='button_count' show_faces='true' width='100' action='like' colorscheme='light' send='false' /></div><p>There have been a lot of popular new devices introduced in the last year, so it&#8217;s a good time to refresh the device simulator with some new skins.  The following skins are now available in the Vase API project:</p>
<h2>BlackBerry 10 Simulators</h2>
<p><strong>NOTE:</strong> The <a href="http://code.google.com/p/codenameone/issues/detail?id=481&amp;sort=-id">initial support</a> for BlackBerry 10 in Codename One will be using the Android 2.3 Runtime.  For this reason, the following BlackBerry skins will be detected as Android devices, and use the Android gingerbread theme and fonts.</p>
<p>The BlackBerry 10 devices are completely gesture driven, there are no physical/virtual navigation buttons as seen on all other platforms.  To open the menu on BlackBerry, you would normally swipe down from the top bezel &#8211; in the simulator, touching the top bezel will open the menu.  When the menu is open in the physical Android runtime, an Android-specific &#8216;back button&#8217; appears in the bottom left of the screen &#8211; in the Simulator, touching the bottom left bezel will trigger a Back event.</p>
<h2>BlackBerry Z10</h2>
<p><a href="http://gadgets.coolman.ca/wp-content/uploads/2013/03/BlackBerryZ10.png"><img class="alignnone size-medium wp-image-922" title="BlackBerryZ10" src="http://gadgets.coolman.ca/wp-content/uploads/2013/03/BlackBerryZ10-155x300.png" alt="" width="155" height="300" /></a><a href="http://gadgets.coolman.ca/wp-content/uploads/2013/03/BlackBerryZ10-landscape.png"><img class="alignnone size-medium wp-image-923" title="BlackBerryZ10-landscape" src="http://gadgets.coolman.ca/wp-content/uploads/2013/03/BlackBerryZ10-landscape-300x151.png" alt="" width="300" height="151" /></a></p>
<p>BlackBerry&#8217;s latest full-touch smartphone running the new BlackBerry 10 OS, 1280 x 768 resolution, 356ppi pixel density, 4.2&#8243; diagonal, dual core 1.5Ghz TI OMAP 4470, 2G RAM.</p>
<p>[<a title="Download BlackBerry Z10 Skin" href="http://c1-vase.googlecode.com/files/BlackberryZ10.skin">Download BlackBerry Z10 skin</a>]</p>
<h2>BlackBerry Q10</h2>
<p><a href="http://gadgets.coolman.ca/wp-content/uploads/2013/03/BlackBerryQ10.png"><img class="alignnone size-medium wp-image-924" title="BlackBerryQ10" src="http://gadgets.coolman.ca/wp-content/uploads/2013/03/BlackBerryQ10-171x300.png" alt="" width="171" height="300" /></a><a href="http://gadgets.coolman.ca/wp-content/uploads/2013/03/BlackBerryQ10-landscape1.png"><img class="alignnone size-medium wp-image-926" title="BlackBerryQ10-landscape" src="http://gadgets.coolman.ca/wp-content/uploads/2013/03/BlackBerryQ10-landscape1-300x169.png" alt="" width="300" height="169" /></a></p>
<p>BlackBerry&#8217;s latest classic QWERTY smartphone (less the trackpad) running the new BlackBerry 10 OS, 720 x 720 resolution, 330ppi pixel density, 3.1&#8243; diagonal, dual core 1.5Ghz TI OMAP 4470, 2G RAM.</p>
<p>[<a title="Download BlackBerry Q10 skin" href="http://c1-vase.googlecode.com/files/BlackberryQ10.skin">Download BlackBerry Q10 skin</a>]</p>
<h2>BlackBerry PlayBook<br />
<a href="http://gadgets.coolman.ca/wp-content/uploads/2013/03/BlackBerryPlaybook.png"><img class="alignnone size-medium wp-image-890" title="BlackBerryPlaybook" src="http://gadgets.coolman.ca/wp-content/uploads/2013/03/BlackBerryPlaybook-205x300.png" alt="" width="205" height="300" /></a><a href="http://gadgets.coolman.ca/wp-content/uploads/2013/03/BlackBerryPlaybook-landscape.png"><img class="alignnone size-medium wp-image-891" title="BlackBerryPlaybook-landscape" src="http://gadgets.coolman.ca/wp-content/uploads/2013/03/BlackBerryPlaybook-landscape-300x192.png" alt="" width="300" height="192" /></a></h2>
<p>BlackBerry&#8217;s first tablet, the Playbook, running BlackBerry Tablet OS 2.1 at the time of this writing, but soon to be running BlackBerry 10.  1024 x 600 resolution, 170ppi pixel density, 7&#8243; diagonal, dual core 1.0Ghz (WiFi version) or 1.5Ghz (LTE version) Cortex-A9 TI OMAP 4430, 1G RAM.  (I recently picked up a 32G playbook for $100)</p>
<p>[<a title="Download BlackBerry Playbook skin" href="http://c1-vase.googlecode.com/files/BlackberryPlaybook.skin">Download BlackBerry Playbook skin</a>]</p>
<h2>Android JellyBean Simulators</h2>
<p>The HTC One simulator will be the first Ultra HD smartphone skin available for Codename One. I&#8217;ll have to update these images shortly, a couple bugs in Codename One related to this high resolution have been recently fixed.</p>
<p><a href="http://gadgets.coolman.ca/wp-content/uploads/2013/03/HTCOne.png"><img class="alignnone size-medium wp-image-902" title="HTCOne" src="http://gadgets.coolman.ca/wp-content/uploads/2013/03/HTCOne-152x300.png" alt="" width="152" height="300" /></a><a href="http://gadgets.coolman.ca/wp-content/uploads/2013/03/HTCOne-landscape.png"><img class="alignnone size-medium wp-image-893" title="HTCOne-landscape" src="http://gadgets.coolman.ca/wp-content/uploads/2013/03/HTCOne-landscape-300x147.png" alt="" width="300" height="147" /></a></p>
<p>HTC&#8217;s latest flagship device, the HTC One, Android JellyBean 4.2, 1080 x 1920 resolution, 468ppi, 4.7&#8243; LCD, 2G RAM, 1.7Ghz Quad Core Snapdragon 600.</p>
<p>[<a title="Download HTC One skin" href="http://c1-vase.googlecode.com/files/HTCOne.skin">Download HTC One skin</a>]</p>
<h2>Google/ASUS Nexus 7</h2>
<p><a href="http://gadgets.coolman.ca/wp-content/uploads/2013/03/GoogleNexus7.png"><img class="alignnone size-medium wp-image-895" title="GoogleNexus7" src="http://gadgets.coolman.ca/wp-content/uploads/2013/03/GoogleNexus7-185x300.png" alt="" width="185" height="300" /></a><a href="http://gadgets.coolman.ca/wp-content/uploads/2013/03/GoogleNexus7-landscape.png"><img class="alignnone size-medium wp-image-896" title="GoogleNexus7-landscape" src="http://gadgets.coolman.ca/wp-content/uploads/2013/03/GoogleNexus7-landscape-300x186.png" alt="" width="300" height="186" /></a></p>
<p>Google&#8217;s ultra popular Nexus 7 tablet by ASUS, Android JellyBean 4.2, 7” 1280&#215;800 resolution, 216ppi pixel density, 1G RAM, 1.3Ghz NVidia Tegra 3 quad core processor.</p>
<p>[<a title="Download Google Nexus 7 skin" href="http://c1-vase.googlecode.com/files/GoogleNexus7.skin">Download Google Nexus 7 skin</a>]</p>
<h2>Nokia S40 Simulators</h2>
<p>Nokia recently announced their <a title="Nokia's 2012Q4 financial report" href="http://www.results.nokia.com/results/Nokia_results2012Q4e.pdf">2012Q4 numbers</a>, and it included a staggering <strong>80 million S40 devices</strong>, including <strong>9.3 million full-touch Asha devices</strong> shipped in that quarter alone, versus only <strong>4.4 million Lumia</strong> devices, in the quarter the Lumia was first released.  The same report also shows that S40 popularity does not reflect true in North America.  The Asha&#8217;s popularity can be attributed to the smartphone-like features at an affordable price point without carrier subsidies/lock-in.</p>
<p><a href="http://gadgets.coolman.ca/wp-content/uploads/2013/03/NokiaAsha311.png"><img class="alignnone size-medium wp-image-897" title="NokiaAsha311" src="http://gadgets.coolman.ca/wp-content/uploads/2013/03/NokiaAsha311-153x300.png" alt="" width="153" height="300" /></a><a href="http://gadgets.coolman.ca/wp-content/uploads/2013/03/NokiaAsha311-landscape.png"><img class="alignnone size-medium wp-image-898" title="NokiaAsha311-landscape" src="http://gadgets.coolman.ca/wp-content/uploads/2013/03/NokiaAsha311-landscape-300x153.png" alt="" width="300" height="153" /></a></p>
<p>Nokia Asha 311, one model in Nokia&#8217;s popular Asha 300 series of S40 devices, this simulator is suitable for testing the Asha 305 through 311, all of which have identical display characteristics.  Nokia OS S40 Developer Platform 2.0, 240&#215;400 resolution, 155ppi pixel density, 3.0&#8243; full-touch screen, 1Ghz ARM11 processor (a couple models use a 800 Mhz processor).</p>
<p>[<a title="Download Nokia Asha 311 skin" href="http://c1-vase.googlecode.com/files/NokiaAsha311.skin">Download Nokia Asha 311 skin</a>]<br />
<a href="http://gadgets.coolman.ca/wp-content/uploads/2013/03/NokiaC3-01.png"><img class="alignnone size-medium wp-image-899" title="NokiaC3-01" src="http://gadgets.coolman.ca/wp-content/uploads/2013/03/NokiaC3-01-132x300.png" alt="" width="132" height="300" /></a><a href="http://gadgets.coolman.ca/wp-content/uploads/2013/03/NokiaC3-01-landscape.png"><img class="alignnone size-medium wp-image-900" title="NokiaC3-01-landscape" src="http://gadgets.coolman.ca/wp-content/uploads/2013/03/NokiaC3-01-landscape-300x133.png" alt="" width="300" height="133" /></a></p>
<p>Nokia C3-01 is one of Nokia&#8217;s &#8220;Type and touch&#8221; models, it features both a numeric keypad and resistive touch screen. A couple surprising bonus features &#8211; it has WLAN B/G/N and a 1Ghz (model RM-776) or 680Mhz (model RM-640) processor .  Nokia S40 OS 6th edition, feature pack 1, 320&#215;240 resolution, 167ppi pixel density, 2.4&#8243; resistive touch screen, 128M/64M RAM (I recently picked up the RM-640 model for $25).</p>
<p>[<a title="Download Nokia C3-01 skin" href="http://c1-vase.googlecode.com/files/NokiaC3-01.skin">Download Nokia C3-01 skin</a>]</p>
<h2>Apple IOS Simulators</h2>
<p><a href="http://gadgets.coolman.ca/wp-content/uploads/2013/03/AppleIPadMini.png"><img class="alignnone size-medium wp-image-904" title="AppleIPadMini" src="http://gadgets.coolman.ca/wp-content/uploads/2013/03/AppleIPadMini-205x300.png" alt="" width="205" height="300" /></a><a href="http://gadgets.coolman.ca/wp-content/uploads/2013/03/AppleIPadMini-landscape.png"><img class="alignnone size-medium wp-image-905" title="AppleIPadMini-landscape" src="http://gadgets.coolman.ca/wp-content/uploads/2013/03/AppleIPadMini-landscape-300x199.png" alt="" width="300" height="199" /></a></p>
<p>Apple&#8217;s first 7&#8243; tablet, the IPad Mini, IOS 6, 1024&#215;768 resolution, 163 ppi pixel density, 7.9&#8243; diagonal, Dual-core 1 GHz Cortex-A9 processor, 512M RAM</p>
<p>[<a title="Download Apple IPad Mini skin" href="http://c1-vase.googlecode.com/files/AppleIPadMini.skin">Download Apple IPad Mini skin</a>]</p>
<h2>Windows Phone 8 Simulators</h2>
<p><a href="http://gadgets.coolman.ca/wp-content/uploads/2013/03/NokiaLumia920.png"><img class="alignnone size-medium wp-image-907" title="NokiaLumia920" src="http://gadgets.coolman.ca/wp-content/uploads/2013/03/NokiaLumia920-165x300.png" alt="" width="165" height="300" /></a><a href="http://gadgets.coolman.ca/wp-content/uploads/2013/03/NokiaLumia920-landscape.png"><img class="alignnone size-medium wp-image-908" title="NokiaLumia920-landscape" src="http://gadgets.coolman.ca/wp-content/uploads/2013/03/NokiaLumia920-landscape-300x163.png" alt="" width="300" height="163" /></a></p>
<p>Nokia Lumia 920, their current flagship Windows 8 phone, 768&#215;1280 resolution, 332ppi pixel density, 4.5&#8243; diagonal, dual core 1.5Ghz Snapdragon S4 CPU, 1G RAM.</p>
<p>[<a title="Download Nokia Lumia 920 skin" href="http://c1-vase.googlecode.com/files/NokiaLumia920.skin">Download Nokia Lumia 920 skin</a>]</p>
<h2>Other custom skins</h2>
<p>Check out the earlier two posts for previously released skins <a title="More Mobile Device Simulator Skins…" href="http://gadgets.coolman.ca/more_codename_one_simulator_skins/">here</a> and <a title="Create your own device simulator skin using Gimp" href="http://gadgets.coolman.ca/create-your-own-device-simulator-skin-using-gimp/">here</a>.  The full list of skin downloads can be found <a title="List of skin downloads." href="http://code.google.com/p/c1-vase/downloads/list">here</a>.</p>
<h3>Like this post?</h3>
<p>If you like this blog posting, please don&#8217;t forget to click the Like buttons. Also, you can send comments to the <a title="Codename One Discussion Topic for this entry" href="http://www.codenameone.com/discussion-forum.html?place=topic%2Fcodenameone-discussions%2FPWWnXSss1xI%2Fdiscussion">Codename One Discussion Forums</a>, I check there fairly regularly.</p>
<p><a href="http://gadgets.coolman.ca/new-device-simulator-skins-201303/">New Device Simulator skins</a></p><img src="http://feeds.feedburner.com/~r/GadgetReviewsFromCoolmanca/~4/xQyuKOtFp_4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://gadgets.coolman.ca/new-device-simulator-skins-201303/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://gadgets.coolman.ca/new-device-simulator-skins-201303/</feedburner:origLink></item>
		<item>
		<title>R.I.P. Symbian – 1998 – 2013</title>
		<link>http://feedproxy.google.com/~r/GadgetReviewsFromCoolmanca/~3/yq9MRF9lm2Q/</link>
		<comments>http://gadgets.coolman.ca/r-i-p-symbian-1998-2013/#comments</comments>
		<pubDate>Thu, 24 Jan 2013 20:49:16 +0000</pubDate>
		<dc:creator>Eric Coolman</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Nokia]]></category>
		<category><![CDATA[Symbian]]></category>
		<category><![CDATA[Windows Phone]]></category>

		<guid isPermaLink="false">http://gadgets.coolman.ca/?p=876</guid>
		<description><![CDATA[<p><p><a href="http://gadgets.coolman.ca/r-i-p-symbian-1998-2013/">R.I.P. Symbian &#8211; 1998 &#8211; 2013</a></p><p>Nokia finally announced the death of Symbian today&#8230; my last smartphone was a Symbian S60 based Nokia E71.  I was very fond of it, and still use it for development today.  A few things that surprised me from today&#8217;s articles (such as this one): Symbian wasn&#8217;t already dead S40 is not a Symbian-based OS (Symbian [...]</p></p><p><a href="http://gadgets.coolman.ca/r-i-p-symbian-1998-2013/">R.I.P. Symbian &#8211; 1998 &#8211; 2013</a></p>]]></description>
			<content:encoded><![CDATA[<p><a href="http://gadgets.coolman.ca/r-i-p-symbian-1998-2013/">R.I.P. Symbian &#8211; 1998 &#8211; 2013</a></p><div class='wpfblike' style='float:left'><fb:like href='http://gadgets.coolman.ca/r-i-p-symbian-1998-2013/' layout='button_count' show_faces='true' width='100' action='like' colorscheme='light' send='false' /></div><p><img class="alignnone" src="http://www.pakzilla.com/wp-content/upload/rip_symbian.jpg" alt="" width="112" height="110" />Nokia finally announced the death of Symbian today&#8230; my last smartphone was a Symbian S60 based Nokia E71.  I was very fond of it, and still use it for development today.  A few things that surprised me from today&#8217;s articles (such as <a href="http://www.zdnet.com/the-great-asha-mystery-why-is-nokia-playing-dumb-on-smartphones-7000010273/">this one</a>):</p>
<ol>
<li>Symbian wasn&#8217;t already dead</li>
<li>S40 is not a Symbian-based OS (Symbian S60 caused this confusion for me).</li>
<li>The last Symbian device released (808 PureView) had a whopping 41 megapixel camera</li>
<li>Nokia shipped 80 million (!!) S40-based devices in Q4 of 2012</li>
<li>Nokia shipped 9.3 million Asha S40 devices in Q4 of 2012, which is twice as many Lumia devices shipped in the same quarter (4.4 million).</li>
</ol>
<p><a href="http://gadgets.coolman.ca/r-i-p-symbian-1998-2013/">R.I.P. Symbian &#8211; 1998 &#8211; 2013</a></p><img src="http://feeds.feedburner.com/~r/GadgetReviewsFromCoolmanca/~4/yq9MRF9lm2Q" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://gadgets.coolman.ca/r-i-p-symbian-1998-2013/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://gadgets.coolman.ca/r-i-p-symbian-1998-2013/</feedburner:origLink></item>
		<item>
		<title>Create KML documents using Google Maps</title>
		<link>http://feedproxy.google.com/~r/GadgetReviewsFromCoolmanca/~3/pMt69xwpxmI/</link>
		<comments>http://gadgets.coolman.ca/create-kml-documents-using-google-maps/#comments</comments>
		<pubDate>Thu, 24 May 2012 16:26:16 +0000</pubDate>
		<dc:creator>Eric Coolman</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Tips & Tricks]]></category>
		<category><![CDATA[Google Maps]]></category>
		<category><![CDATA[KML]]></category>

		<guid isPermaLink="false">http://gadgets.coolman.ca/?p=862</guid>
		<description><![CDATA[<p><p><a href="http://gadgets.coolman.ca/create-kml-documents-using-google-maps/">Create KML documents using Google Maps</a></p><p>In the previous post, the sample KML document was one I edited by hand.  I could have saved some time by using Google Maps to generate the KML for me.  Here&#8217;s a quick guide on how to use Google Maps to generate a KML document very similar to the one in the previous demo. Point [...]</p></p><p><a href="http://gadgets.coolman.ca/create-kml-documents-using-google-maps/">Create KML documents using Google Maps</a></p>]]></description>
			<content:encoded><![CDATA[<p><a href="http://gadgets.coolman.ca/create-kml-documents-using-google-maps/">Create KML documents using Google Maps</a></p><div class='wpfblike' style='float:left'><fb:like href='http://gadgets.coolman.ca/create-kml-documents-using-google-maps/' layout='button_count' show_faces='true' width='100' action='like' colorscheme='light' send='false' /></div><p>In the <a title="Mobile Mapping with Keyhole Markup Language (KML)" href="http://gadgets.coolman.ca/mobile-mapping-keyhole-markup-language-kml/">previous post</a>, the sample KML document was one I edited by hand.  I could have saved some time by using Google Maps to generate the KML for me.  Here&#8217;s a quick guide on how to use Google Maps to generate a KML document very similar to the one in the previous demo.<span id="more-862"></span></p>
<ol>
<li>Point your browser to <strong>http://maps.google.com</strong>, and search for some location.  Below, I searched for the <strong>city hall</strong> in <strong>London, Ontario</strong>.  Click the marker on the left hand side, google maps will open a &#8216;bubble&#8217; above the location on the map.  Click the <strong>Save to Map</strong> link, then click the <strong>Save</strong> button.<br />
<a href="http://gadgets.coolman.ca/wp-content/uploads/2012/05/google-maps-save-to-map-dialog.png"><br />
<img class="alignnone size-medium wp-image-866" title="google-maps-save-to-map-dialog" src="http://gadgets.coolman.ca/wp-content/uploads/2012/05/google-maps-save-to-map-dialog-300x190.png" alt="Google Maps Search Result Save To Map Dialog" width="300" height="190" /></a></li>
<li>Next, click the <strong>Search Nearby</strong> link, and search for <strong>restaurants</strong> near the city hall.  As in step 1, repeat the steps of clicking some markers in the left, then save the markers to your map.  Do the same for nearby <strong>hotels</strong>.<br />
<a href="http://gadgets.coolman.ca/wp-content/uploads/2012/05/google-maps-search-nearby-dialog.png"><img class="alignnone size-medium wp-image-867" title="google-maps-search-nearby-dialog" src="http://gadgets.coolman.ca/wp-content/uploads/2012/05/google-maps-search-nearby-dialog-300x281.png" alt="Google Maps Search Nearby Dialog" width="300" height="281" /></a></li>
<li>Once you have a list of markers saved to your map, click the <strong>My Places</strong> button on the left of the screen, then click the <strong>Maps</strong> button below it, and finally click the <strong>My Saved Places</strong> link (assuming you kept the default map name).<br />
<a href="http://gadgets.coolman.ca/wp-content/uploads/2012/05/google-maps-my-saved-places-list.png"><img class="alignnone size-medium wp-image-864" title="google-maps-my-saved-places-list" src="http://gadgets.coolman.ca/wp-content/uploads/2012/05/google-maps-my-saved-places-list-300x269.png" alt="Google Maps My Maps List" width="300" height="269" /></a></li>
<li>You should see the list of markers you selected in steps 1 and 2 above.  Click on the <strong>KML</strong> link to save the markers to KML format.  A dialog will appear to save to the local filesystem.<br />
<a href="http://gadgets.coolman.ca/wp-content/uploads/2012/05/google-maps-my-saved-places.png"><img class="alignnone size-medium wp-image-863" title="google-maps-my-saved-places" src="http://gadgets.coolman.ca/wp-content/uploads/2012/05/google-maps-my-saved-places-300x283.png" alt="Google Maps My Saved Places" width="300" height="283" /></a><a href="http://gadgets.coolman.ca/wp-content/uploads/2012/05/google-maps-save-kml-dialog.png"><img class="alignnone size-medium wp-image-865" title="google-maps-save-kml-dialog" src="http://gadgets.coolman.ca/wp-content/uploads/2012/05/google-maps-save-kml-dialog-300x206.png" alt="Google Maps Save KML Dialog" width="300" height="206" /></a></li>
</ol>
<h3>Want more?</h3>
<p>If you poke around the Google Maps interface, you&#8217;ll notice that you can share your maps publicly.  The share button will pop up a dialog giving a link to your public map.  If you append <strong>&#8216;&amp;output=kml</strong>&#8216; to that URL, the map will be returned as a KML.  You could use this URL as an hosted map for the <a title="Mobile Mapping with Keyhole Markup Language (KML)" href="http://gadgets.coolman.ca/mobile-mapping-keyhole-markup-language-kml/">KMLPointsLayer</a>, rather than downloading the KML to file.</p>
<p>In a future post, I&#8217;ll explore dynamically generating KML map data on demand using the Google Map APIs to feed the KMLPointsLayer component.</p>
<h3>Like this post?</h3>
<p>If you like this blog posting, please don&#8217;t forget to click the Like buttons. Also, you can send comments to the <a title="Codename One Discussion topic for this post" href="http://www.codenameone.com/discussion-forum.html?place=topic%2Fcodenameone-discussions%2F5Z1phL2VnWo%2Fdiscussion">Codename One Discussion Forums</a>, I check there fairly regularly.</p>
<p>&nbsp;</p>
<p><a href="http://gadgets.coolman.ca/create-kml-documents-using-google-maps/">Create KML documents using Google Maps</a></p><img src="http://feeds.feedburner.com/~r/GadgetReviewsFromCoolmanca/~4/pMt69xwpxmI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://gadgets.coolman.ca/create-kml-documents-using-google-maps/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://gadgets.coolman.ca/create-kml-documents-using-google-maps/</feedburner:origLink></item>
		<item>
		<title>Mobile Mapping with Keyhole Markup Language (KML)</title>
		<link>http://feedproxy.google.com/~r/GadgetReviewsFromCoolmanca/~3/RnXKB7so_sA/</link>
		<comments>http://gadgets.coolman.ca/mobile-mapping-keyhole-markup-language-kml/#comments</comments>
		<pubDate>Thu, 24 May 2012 10:46:45 +0000</pubDate>
		<dc:creator>Eric Coolman</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Tips & Tricks]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Blackberry]]></category>
		<category><![CDATA[CodenameOne]]></category>
		<category><![CDATA[Cross-platform]]></category>
		<category><![CDATA[Google Mapmaker]]></category>
		<category><![CDATA[Google Maps]]></category>
		<category><![CDATA[GPS]]></category>
		<category><![CDATA[IOS]]></category>
		<category><![CDATA[J2ME]]></category>
		<category><![CDATA[KML]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[OpenStreetmap]]></category>
		<category><![CDATA[Symbian]]></category>
		<category><![CDATA[Windows Phone]]></category>

		<guid isPermaLink="false">http://gadgets.coolman.ca/?p=849</guid>
		<description><![CDATA[<p><p><a href="http://gadgets.coolman.ca/mobile-mapping-keyhole-markup-language-kml/">Mobile Mapping with Keyhole Markup Language (KML)</a></p><p>I&#8217;ve added an implementation of a Codename One mapping points layer to the Vase API for populating a map using data from a Keyhole Markup Language (KML) file. Currently only basic KML support is implemented, but I will add better support over time.  Play the video below to see some of the supported features in [...]</p></p><p><a href="http://gadgets.coolman.ca/mobile-mapping-keyhole-markup-language-kml/">Mobile Mapping with Keyhole Markup Language (KML)</a></p>]]></description>
			<content:encoded><![CDATA[<p><a href="http://gadgets.coolman.ca/mobile-mapping-keyhole-markup-language-kml/">Mobile Mapping with Keyhole Markup Language (KML)</a></p><div class='wpfblike' style='float:left'><fb:like href='http://gadgets.coolman.ca/mobile-mapping-keyhole-markup-language-kml/' layout='button_count' show_faces='true' width='100' action='like' colorscheme='light' send='false' /></div><p>I&#8217;ve added an implementation of a <a title="Codename One Home" href="http://www.codenameone.cm">Codename One</a> mapping points layer to the <a title="Introducing Vase API 1.0" href="http://gadgets.coolman.ca/codename-one-value-added-services/">Vase API</a> for populating a map using data from a <a title="Googles Keyhole Markup Language (KML) documentation" href="https://developers.google.com/kml/documentation/">Keyhole Markup Language (KML)</a> file. Currently only basic KML support is implemented, but I will add better support over time.  Play the video below to see some of the supported features in action.<br />
<iframe src="http://www.youtube.com/embed/A0_3-hlk3Uk" frameborder="0" width="420" height="315"></iframe><span id="more-849"></span></p>
<p>Using the KMLPointsLayer is quite simple:</p>
<pre class="brush: java; title: ; notranslate">
MapComponent map = new MapComponent();
// input can be an inputstream or a local file path
PointsLayer kml = new KMLPointsLayer(input);
map.addLayer(kml);
map.zoomToLayers();
</pre>
<p>The map in the video was created using <a title="Sample Keyhole Markup Language (KML) File" href="http://gadgets.coolman.ca/sample-keyhole-markup-language-kml-file/">this KML document</a>.</p>
<h3>Like this post?</h3>
<p>If you like this blog posting, please don&#8217;t forget to click the Like buttons. Also, you can send comments to the <a title="Codename One Discussion topic for this post" href="http://www.codenameone.com/discussion-forum.html?place=topic%2Fcodenameone-discussions%2F5Z1phL2VnWo%2Fdiscussion">Codename One Discussion Forums</a>, I check there fairly regularly.</p>
<h3>Further Reading</h3>
<p>The following is a decent reference guide for the KML format. (Disclosure, this is an affiliate link, I do own a copy of this book).</p>
<p><iframe style="width: 120px; height: 240px;" src="http://rcm.amazon.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=httpgadgetsco-20&amp;o=1&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=ss_til&amp;asins=0321525590" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" width="320" height="240"></iframe></p>
<p><a href="http://gadgets.coolman.ca/mobile-mapping-keyhole-markup-language-kml/">Mobile Mapping with Keyhole Markup Language (KML)</a></p><img src="http://feeds.feedburner.com/~r/GadgetReviewsFromCoolmanca/~4/RnXKB7so_sA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://gadgets.coolman.ca/mobile-mapping-keyhole-markup-language-kml/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://gadgets.coolman.ca/mobile-mapping-keyhole-markup-language-kml/</feedburner:origLink></item>
		<item>
		<title>Open Navigation</title>
		<link>http://feedproxy.google.com/~r/GadgetReviewsFromCoolmanca/~3/bPZANFnjyIQ/</link>
		<comments>http://gadgets.coolman.ca/opensource_navigation_gps_tracking/#comments</comments>
		<pubDate>Thu, 10 May 2012 17:23:41 +0000</pubDate>
		<dc:creator>Eric Coolman</dc:creator>
				<category><![CDATA[Product Reviews]]></category>
		<category><![CDATA[Tips & Tricks]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Google Mapmaker]]></category>
		<category><![CDATA[Google Maps]]></category>
		<category><![CDATA[GPS]]></category>
		<category><![CDATA[GPS Traces]]></category>
		<category><![CDATA[KML]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[NavFree]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[OpenStreetmap]]></category>
		<category><![CDATA[OSM]]></category>

		<guid isPermaLink="false">http://gadgets.coolman.ca/?p=822</guid>
		<description><![CDATA[<p><p><a href="http://gadgets.coolman.ca/opensource_navigation_gps_tracking/">Open Navigation</a></p><p>I recently installed some free GPS apps on my Android device, because I wanted offline maps when I&#8217;m out of the country.  The roaming data charges from my mobile service provider are killer!.  Namely, the apps I installed are NavFree world, and NavFree USA edition (I don&#8217;t understand the separation).  The software is quite impressive, [...]</p></p><p><a href="http://gadgets.coolman.ca/opensource_navigation_gps_tracking/">Open Navigation</a></p>]]></description>
			<content:encoded><![CDATA[<p><a href="http://gadgets.coolman.ca/opensource_navigation_gps_tracking/">Open Navigation</a></p><div class='wpfblike' style='float:left'><fb:like href='http://gadgets.coolman.ca/opensource_navigation_gps_tracking/' layout='button_count' show_faces='true' width='100' action='like' colorscheme='light' send='false' /></div><p>I recently installed some free GPS apps on my Android device, because I wanted offline maps when I&#8217;m out of the country.  The roaming data charges from my mobile service provider are killer!.  Namely, the apps I installed are <a title="NavFree homepage" href="http://www.navmii.com/navfree/">NavFree world</a>, and NavFree USA edition (I don&#8217;t understand the separation).  The software is quite impressive, and very professional.  My main complaint with NavFree is all the teaser features &#8211; where you click a button and it says &#8216;that&#8217;s coming in the next release&#8217;. If they were to remove those, the app would appear very feature complete.<span id="more-822"></span></p>
<h1>OpenStreetmaps</h1>
<p>The NavFree software uses map data from <a title="OpenStreetmap home" href="http://www.openstreetmap.org/">OpenStreetmap</a> (OSM).  I hadn&#8217;t checked out OSM for a few years, and it&#8217;s come a long way.  Here in Ontario Canada, so far most areas I&#8217;ve checked out are covered.  I&#8217;ve also found several areas that are missing large chunks of data as well.  One thing that caught me by surprise though, is when I drove into a small private campground in the middle of nowhere with my GPS turned on, and to my surprise, the campground had all of it&#8217;s streets, along with streetnames and directions, on both the Navfree app and Google Maps!  I asked the campground owner about how that was done, and he looked at me both confused and delighted, he had no idea how it got there.</p>
<h1>Contributing Map Data to online Map Service Providers</h1>
<p>So, I did a quick search of the Android Play store, and found a number of &#8216;GPS Tracker&#8217; tools for OpenStreetmaps,Google Maps, etc.  I installed one for OpenStreetmaps called <a title="OSMTracker" href="http://wiki.openstreetmap.org/wiki/OSMtracker">OSMTracker</a>.  It&#8217;s quite simple and works well.  You simply turn on GPS Tracking from the menu bar, drive/walk/bike/etc along the path where provider is missing map data, then turn off and save the tracking from the menu bar.  When you view the saved track, you can export it as a GPX file, and <a title="OpenStreetmap Trace Upload Page" href="http://www.openstreetmap.org/traces">upload the file to OSM</a>.  After uploading the trace file, you can edit the street names, the direction for one way streets, speed limits, etc. from the OSM site.  Once everything is committed, then other uses can navigate to the newly added streets.  For google maps, this would happen automatically because the navigation uses live data.  For OpenStreetmaps, the user will see your contributions next time they update their map data.</p>
<p>Google also <a title="Google MapMaker home" href="http://www.google.com/mapmaker">provides tools</a> for updating google maps.  The idea is similar, you would need a KML tracing tool that operates similar to OSMTracker above, then you paste the KML data into the Google Mapmaker tool.</p>
<h3>Like this post?</h3>
<p>If you like this blog posting, please don&#8217;t forget to click the Like buttons.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><a href="http://gadgets.coolman.ca/opensource_navigation_gps_tracking/">Open Navigation</a></p><img src="http://feeds.feedburner.com/~r/GadgetReviewsFromCoolmanca/~4/bPZANFnjyIQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://gadgets.coolman.ca/opensource_navigation_gps_tracking/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://gadgets.coolman.ca/opensource_navigation_gps_tracking/</feedburner:origLink></item>
		<item>
		<title>More Mobile Device Simulator Skins…</title>
		<link>http://feedproxy.google.com/~r/GadgetReviewsFromCoolmanca/~3/pQx-VGmUqE8/</link>
		<comments>http://gadgets.coolman.ca/more_codename_one_simulator_skins/#comments</comments>
		<pubDate>Thu, 10 May 2012 04:20:16 +0000</pubDate>
		<dc:creator>Eric Coolman</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Tips & Tricks]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Blackberry]]></category>
		<category><![CDATA[CodenameOne]]></category>
		<category><![CDATA[Cross-platform]]></category>
		<category><![CDATA[Debugging]]></category>
		<category><![CDATA[IOS]]></category>
		<category><![CDATA[J2ME]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Symbian]]></category>
		<category><![CDATA[User Interface]]></category>
		<category><![CDATA[Vase]]></category>
		<category><![CDATA[Windows Phone]]></category>

		<guid isPermaLink="false">http://gadgets.coolman.ca/?p=791</guid>
		<description><![CDATA[<p><p><a href="http://gadgets.coolman.ca/more_codename_one_simulator_skins/">More Mobile Device Simulator Skins&#8230;</a></p><p>The simulator skins tutorial was quite popular, 57 likes on the first day, wow!  I finished up the rest of the skins mentioned in that post, and they can be found in the Vase API SVN.  Here&#8217;s the current full list, and some screenshot samples: BlackBerry Bold 9790 (I reviewed this physical device recently) Samsung [...]</p></p><p><a href="http://gadgets.coolman.ca/more_codename_one_simulator_skins/">More Mobile Device Simulator Skins&#8230;</a></p>]]></description>
			<content:encoded><![CDATA[<p><a href="http://gadgets.coolman.ca/more_codename_one_simulator_skins/">More Mobile Device Simulator Skins&#8230;</a></p><div class='wpfblike' style='float:left'><fb:like href='http://gadgets.coolman.ca/more_codename_one_simulator_skins/' layout='button_count' show_faces='true' width='100' action='like' colorscheme='light' send='false' /></div><p>The <a title="Create your own device simulator skin using Gimp" href="http://gadgets.coolman.ca/create-your-own-device-simulator-skin-using-gimp/">simulator skins tutorial</a> was quite popular, 57 likes on the first day, wow!  I finished up the rest of the skins mentioned in that post, and they can be found in the <a title="VASE API – Value Added SErvices for Codename One" href="http://gadgets.coolman.ca/vase/">Vase API SVN</a>.  Here&#8217;s the current full list, and some screenshot samples:</p>
<h1>BlackBerry Bold 9790</h1>
<p><em>(<a title="Gadget Review: Blackberry Bold 9790" href="http://gadgets.coolman.ca/blackberry-bold-9790-review/">I reviewed this physical device recently</a>)</em></p>
<div id="attachment_793" class="wp-caption alignnone" style="width: 310px"><a href="http://gadgets.coolman.ca/wp-content/uploads/2012/05/blackberry-bold-9790-codenameone-simulator-skin.png"><img class="size-medium wp-image-793 " title="blackberry-bold-9790-codenameone-simulator-skin" src="http://gadgets.coolman.ca/wp-content/uploads/2012/05/blackberry-bold-9790-codenameone-simulator-skin-300x174.png" alt="Blackberry Bold 9790 Simulator Skin for Codename One" width="300" height="174" /></a>f<p class="wp-caption-text">Touchscreen, QWERTY, 480x360, 2.45 inch display, ~245 ppi pixel density, BBOS 7.0, optical trackpad, physical back/menu buttons</p></div>
<h1><span id="more-791"></span>Samsung Galaxy Nexus</h1>
<p><em>(This is my current smartphone, love it, mostly (except the handsfree features))</em></p>
<div id="attachment_794" class="wp-caption alignnone" style="width: 310px"><a href="http://gadgets.coolman.ca/wp-content/uploads/2012/05/samsung-galaxy-nexus-codename-one-simulator-skin.png"><img class="size-medium wp-image-794 " title="samsung-galaxy-nexus-codename-one-simulator-skin" src="http://gadgets.coolman.ca/wp-content/uploads/2012/05/samsung-galaxy-nexus-codename-one-simulator-skin-300x171.png" alt="Samsung Galaxy Nexus Simulator Skin for Codename One" width="300" height="171" /></a><p class="wp-caption-text">Android 4.0 (Ice Cream Sandwich), 720x1280, 4.65 inch display, ~316 ppi pixel density, physical back/menu buttons</p></div>
<h1>Nokia 2760 Featurephone</h1>
<p><em>(What I used before my first smartphone)</em></p>
<div id="attachment_795" class="wp-caption alignnone" style="width: 101px"><a href="http://gadgets.coolman.ca/wp-content/uploads/2012/05/nokia-2760.png"><img class="size-medium wp-image-795" title="nokia-2760" src="http://gadgets.coolman.ca/wp-content/uploads/2012/05/nokia-2760-91x300.png" alt="Nokia 2760 Simulator Skin for Codename One" width="91" height="300" /></a><p class="wp-caption-text">Series 40 (S40), Numeric Keypad, non-touch, 128x160, 1.9 inch display, ~108 ppi pixel density, DPAD, 2 softkeys, 600kb heap</p></div>
<h1>LG Viewty KU990</h1>
<p><em>(My sister-in-law&#8217;s phone)</em></p>
<div id="attachment_796" class="wp-caption alignnone" style="width: 233px"><a href="http://gadgets.coolman.ca/wp-content/uploads/2012/05/LG-Viewty-KU990-CodenameOne-Simulator-skin.png"><img class="size-medium wp-image-796" title="LG-Viewty-KU990-CodenameOne-Simulator-skin" src="http://gadgets.coolman.ca/wp-content/uploads/2012/05/LG-Viewty-KU990-CodenameOne-Simulator-skin-223x300.png" alt="LG Viewty KU990 Simulator Skin for Codename One" width="223" height="300" /></a><p class="wp-caption-text">Symbian, Touchscreen, 240x400, 3 inch display, ~155 ppi pixel density, 1 softkey</p></div>
<h1>Motorola Dext (aka Cliq in US)</h1>
<p><em>(A friend&#8217;s son&#8217;s phone)</em></p>
<div id="attachment_797" class="wp-caption alignnone" style="width: 310px"><a href="http://gadgets.coolman.ca/wp-content/uploads/2012/05/Motorola-Dext_Cliq-Codename_One_Simulator_Skin.png"><img class="size-medium wp-image-797" title="Motorola-Dext_Cliq-Codename_One_Simulator_Skin" src="http://gadgets.coolman.ca/wp-content/uploads/2012/05/Motorola-Dext_Cliq-Codename_One_Simulator_Skin-300x256.png" alt="Motorola Dext/Cliq Simulator Skin for Codename One" width="300" height="256" /></a><p class="wp-caption-text">Android 1.5 (Cupcake)/2.3 (Gingerbread), touchscreen, QWERTY, 320x480, 3.1 inch display, ~186 ppi pixel density, physical menu/back/search buttons, DPAD</p></div>
<h1>Nokia E71</h1>
<p><em>(My previous smartphone, loved it)</em></p>
<div id="attachment_799" class="wp-caption alignnone" style="width: 192px"><a href="http://gadgets.coolman.ca/wp-content/uploads/2012/05/Nokia-E71-Codename_One-Simulator-skin.png"><img class="size-medium wp-image-799" title="Nokia-E71-Codename_One-Simulator-skin" src="http://gadgets.coolman.ca/wp-content/uploads/2012/05/Nokia-E71-Codename_One-Simulator-skin-182x300.png" alt="Nokia E71 Simulator Skin for Codename One" width="182" height="300" /></a><p class="wp-caption-text">Symbian S60, QWERTY, non-touch, 320x240, 2.36 inch display, ~169 ppi pixel density, DPAD, 2 softkeys</p></div>
<h1>Coby MID7012 Tablet</h1>
<p><em>(My tablet, I wish the touchscreen were capacitive and access to the full Android market, I&#8217;d use it more)</em></p>
<div id="attachment_801" class="wp-caption alignnone" style="width: 310px"><a href="http://gadgets.coolman.ca/wp-content/uploads/2012/05/Coby_MID7012_Codename_One_Simulator_Skin.png"><img class="size-medium wp-image-801" title="Coby_MID7012_Codename_One_Simulator_Skin" src="http://gadgets.coolman.ca/wp-content/uploads/2012/05/Coby_MID7012_Codename_One_Simulator_Skin-300x193.png" alt="Coby MID7012 Simulator Skin for Codename One" width="300" height="193" /></a><p class="wp-caption-text">Android 2.3 (Gingerbread), 800x480, 7 inch display, ~133 ppi pixel density, Resistive Touchscreen (budget tablet), physical menu/back/search buttons</p></div>
<h1>Samsung SGH-A747 Featurephone</h1>
<p><em>(A friend&#8217;s old phone)</em></p>
<div id="attachment_803" class="wp-caption alignnone" style="width: 310px"><a href="http://gadgets.coolman.ca/wp-content/uploads/2012/05/Samsung_SGH-A747-Codename-One-Simulator-Skin.png"><img class="size-medium wp-image-803" title="Samsung_SGH-A747-Codename-One-Simulator-Skin" src="http://gadgets.coolman.ca/wp-content/uploads/2012/05/Samsung_SGH-A747-Codename-One-Simulator-Skin-300x115.png" alt="Samsung SGH-A747 Simulator Skin for Codename One" width="300" height="115" /></a><p class="wp-caption-text">Symbian S40, 176 x 220, 2.2 inch display, ~128 ppi pixel density, non-touch, numeric keypad, DPAD, 2 softkeys</p></div>
<h1>Samsung Nexus S</h1>
<p><em>(Several friends have this phone, Google recently pushed Ice Cream Sandwich to it)</em></p>
<div id="attachment_811" class="wp-caption alignnone" style="width: 171px"><a href="http://gadgets.coolman.ca/wp-content/uploads/2012/05/SamsungNexusS-Codename-One-Simulator-Skin.png"><img class="size-medium wp-image-811" title="SamsungNexusS-Codename-One-Simulator-Skin" src="http://gadgets.coolman.ca/wp-content/uploads/2012/05/SamsungNexusS-Codename-One-Simulator-Skin-161x300.png" alt="Samsung Nexus S Simulator Skin for Codename One" width="161" height="300" /></a><p class="wp-caption-text">Android 2.3 (Gingerbread)/4.0 (Ice Cream Sandwich), 480x800, 4 inch display, ~233 ppi pixel density, physical back/menu/search buttons</p></div>
<h1>BlackBerry Curve 8320</h1>
<p><em>(I bought this solely for testing, this model has WiFi but not the GPS (8330))</em></p>
<div id="attachment_809" class="wp-caption alignnone" style="width: 183px"><a href="http://gadgets.coolman.ca/wp-content/uploads/2012/05/Blackberry_Curve_8320_Codename_One_Simulator_Skin.png"><img class="size-medium wp-image-809" title="BlackBerry_Curve_8320_Codename_One_Simulator_Skin" src="http://gadgets.coolman.ca/wp-content/uploads/2012/05/Blackberry_Curve_8320_Codename_One_Simulator_Skin-173x300.png" alt="BlackBerry Curve 8320 Simulator Skin for Codename One" width="173" height="300" /></a><p class="wp-caption-text">BBOS 4.6, 320 x 240, 2.5&quot; display, ~160 ppi pixel density,  non-touch, QWERTY keyboard, trackball, physical menu/back buttons, no softkeys</p></div>
<h3>Like this post?</h3>
<p>If you like this blog posting, please don&#8217;t forget to click the Like buttons. Also, you can send comments to the <a title="Codename One Discussion Topic for this entry" href="http://www.codenameone.com/discussion-forum.html?place=topic%2Fcodenameone-discussions%2FPWWnXSss1xI%2Fdiscussion">Codename One Discussion Forums</a>, I check there fairly regularly.</p>
<p><a href="http://gadgets.coolman.ca/more_codename_one_simulator_skins/">More Mobile Device Simulator Skins&#8230;</a></p><img src="http://feeds.feedburner.com/~r/GadgetReviewsFromCoolmanca/~4/pQx-VGmUqE8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://gadgets.coolman.ca/more_codename_one_simulator_skins/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://gadgets.coolman.ca/more_codename_one_simulator_skins/</feedburner:origLink></item>
		<item>
		<title>multipart/form-data: Uploading files from mobile devices to the cloud</title>
		<link>http://feedproxy.google.com/~r/GadgetReviewsFromCoolmanca/~3/Pn2Ra58MYEM/</link>
		<comments>http://gadgets.coolman.ca/mobile-upload-multipart-form-data/#comments</comments>
		<pubDate>Sun, 06 May 2012 05:09:52 +0000</pubDate>
		<dc:creator>Eric Coolman</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Tips & Tricks]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Blackberry]]></category>
		<category><![CDATA[Cloud Services]]></category>
		<category><![CDATA[CodenameOne]]></category>
		<category><![CDATA[Cross-platform]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[IOS]]></category>
		<category><![CDATA[J2ME]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Spring Roo]]></category>
		<category><![CDATA[Symbian]]></category>
		<category><![CDATA[Vase]]></category>
		<category><![CDATA[WebApps]]></category>
		<category><![CDATA[Webservices]]></category>
		<category><![CDATA[Windows Phone]]></category>

		<guid isPermaLink="false">http://gadgets.coolman.ca/?p=782</guid>
		<description><![CDATA[<p><p><a href="http://gadgets.coolman.ca/mobile-upload-multipart-form-data/">multipart/form-data: Uploading files from mobile devices to the cloud</a></p><p>Uploading files from mobile devices to the cloud requires only a few lines when using Codename One.  I&#8217;ll demonstrate here by uploading to the webapp created using Spring Roo in the previous post. The Mime-Types value seen on the webapp side are passed from the mobile app.  I&#8217;ve added a new MimeTypes utility the Vase [...]</p></p><p><a href="http://gadgets.coolman.ca/mobile-upload-multipart-form-data/">multipart/form-data: Uploading files from mobile devices to the cloud</a></p>]]></description>
			<content:encoded><![CDATA[<p><a href="http://gadgets.coolman.ca/mobile-upload-multipart-form-data/">multipart/form-data: Uploading files from mobile devices to the cloud</a></p><div class='wpfblike' style='float:left'><fb:like href='http://gadgets.coolman.ca/mobile-upload-multipart-form-data/' layout='button_count' show_faces='true' width='100' action='like' colorscheme='light' send='false' /></div><p>Uploading files from mobile devices to the cloud requires only a few lines when using <a title="Codename One home" href="http://www.codenameone.com">Codename One</a>.  I&#8217;ll demonstrate here by uploading to the webapp created using <a title="Spring Roo Home" href="http://www.springframework.org/spring-roo">Spring Roo</a> in the <a title="Accepting File Uploads in your WebApp in 10 Minutes or Less" href="http://gadgets.coolman.ca/multipart-file-upload-spring-roo/">previous post</a>.</p>
<p><object width="492" height="300" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://www.youtube.com/v/ENDshCnDouc?version=3&amp;feature=player_detailpage" /><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><embed width="492" height="300" type="application/x-shockwave-flash" src="http://www.youtube.com/v/ENDshCnDouc?version=3&amp;feature=player_detailpage" allowFullScreen="true" allowScriptAccess="always" allowfullscreen="true" allowscriptaccess="always" /></object></p>
<p>The Mime-Types value seen on the webapp side are passed from the mobile app.  I&#8217;ve added a new <a title="MimeTypes javadoc" href="http://coolman.ca/vase/api/ca/coolman/util/MimeTypes.html">MimeTypes</a> utility the <a title="VASE API – Value Added SErvices for Codename One" href="http://gadgets.coolman.ca/vase/">Vase API</a> to handle this. It uses the public domain <a title="Apache mime-type registry list" href="http://svn.apache.org/repos/asf/httpd/httpd/branches/1.3.x/conf/mime.types">mime-type registry hosted by the Apache httpd</a> project for mapping known file extensions to associated mime type ids.  For parsing the mime file, I also implemented a <a title="Javadoc for the BufferedReader implementation" href="http://coolman.ca/vase/api/ca/coolman/io/BufferedReader.html">BufferedReader</a> for the Vase API since it&#8217;s not available in J2ME.</p>
<p><span id="more-782"></span></p>
<h1>Implementing multipart/form-data file uploads from mobile</h1>
<p>There&#8217;s not much to the code for the mobile app in the video above.  Simply create a Codename One project using the Empty template, add the following code:</p>
<pre>    protected void doFileUploadDemo() {
        // This is the URL of the webapp from the previous blogpost, running on
        // the local network
        final String endpoint = "http://192.168.2.18:8080/MediaUploadDemo/mediauploads";
        Form f = new Form("Choose a file");
        f.setLayout(new BorderLayout());
        FileTree.setFolderIcon(theme.getImage("arrow-right.png"));
        FileTree.setFolderOpenIcon(theme.getImage("arrow-down.png"));
        FileTree.setNodeIcon(theme.getImage("Add_Zone.png"));
        FileTree ft = new FileTree();
        ft.addLeafListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                String filename = (String)evt.getSource();
                if (Dialog.show("Send file?", filename, "OK", "Cancel")) {
                    MultipartRequest req = new MultipartRequest();
                    req.setUrl(endpoint);
                    req.setPost(true);
                    InputStream is = null;
                    try {
                        is = FileSystemStorage.getInstance().openInputStream(filename);
                        req.addData("content", is, MimeTypes.getInstance().getMimeType(filename));
                        req.setFilename("content", filename);
                        NetworkManager.getInstance().addToQueue(req);
                    } catch (IOException ioe) {
                        ioe.printStackTrace();
                    }
                }
            }
        });
        f.addComponent(BorderLayout.CENTER, ft);
        f.show();
    }</pre>
<h3>Like this post?</h3>
<p>If you like this blog posting, please don&#8217;t forget to click the Like buttons. Also, you can send comments to the <a title="Codename One Discussion group topic for this post" href="http://www.codenameone.com/discussion-forum.html?place=topic%2Fcodenameone-discussions%2F42g3TdpoiSE%2Fdiscussion">Codename One Discussion Forums</a>, I check there fairly regularly.</p>
<p><a href="http://gadgets.coolman.ca/mobile-upload-multipart-form-data/">multipart/form-data: Uploading files from mobile devices to the cloud</a></p><img src="http://feeds.feedburner.com/~r/GadgetReviewsFromCoolmanca/~4/Pn2Ra58MYEM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://gadgets.coolman.ca/mobile-upload-multipart-form-data/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://gadgets.coolman.ca/mobile-upload-multipart-form-data/</feedburner:origLink></item>
		<item>
		<title>Accepting File Uploads in your WebApp in 10 Minutes or Less</title>
		<link>http://feedproxy.google.com/~r/GadgetReviewsFromCoolmanca/~3/0n8JEXiC2jw/</link>
		<comments>http://gadgets.coolman.ca/multipart-file-upload-spring-roo/#comments</comments>
		<pubDate>Fri, 04 May 2012 14:36:07 +0000</pubDate>
		<dc:creator>Eric Coolman</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Tips & Tricks]]></category>
		<category><![CDATA[Cloud Services]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Spring Framework]]></category>
		<category><![CDATA[Spring Roo]]></category>

		<guid isPermaLink="false">http://gadgets.coolman.ca/?p=742</guid>
		<description><![CDATA[<p><p><a href="http://gadgets.coolman.ca/multipart-file-upload-spring-roo/">Accepting File Uploads in your WebApp in 10 Minutes or Less</a></p><p>Preamble In a project I&#8217;m currently working on, I have a requirement for handling user-uploaded images.  The project uses Spring Roo for rapid development of the webapp, and the choice for cloud plaform service provider has been narrowed to either VMWare&#8217;s CloudFoundry, Amazon EC2, or Google App Engine.  The example in this post should run [...]</p></p><p><a href="http://gadgets.coolman.ca/multipart-file-upload-spring-roo/">Accepting File Uploads in your WebApp in 10 Minutes or Less</a></p>]]></description>
			<content:encoded><![CDATA[<p><a href="http://gadgets.coolman.ca/multipart-file-upload-spring-roo/">Accepting File Uploads in your WebApp in 10 Minutes or Less</a></p><div class='wpfblike' style='float:left'><fb:like href='http://gadgets.coolman.ca/multipart-file-upload-spring-roo/' layout='button_count' show_faces='true' width='100' action='like' colorscheme='light' send='false' /></div><h1>Preamble</h1>
<p>In a project I&#8217;m currently working on, I have a requirement for handling user-uploaded images.  The project uses <a title="Spring Roo Home" href="http://www.springframework.org/spring-roo">Spring Roo</a> for rapid development of the webapp, and the choice for cloud plaform service provider has been narrowed to either VMWare&#8217;s CloudFoundry, Amazon EC2, or Google App Engine.  The example in this post should run on CloudFoundry and EC2, but to run on AppEngine, there will be some tweaks required to prevent attempts to access the filesystem.  I may revisit this post later to discuss changes required for running on Google AppEngine in more detail.</p>
<h1>Prequisites</h1>
<p>In this post I will assume the reader is somewhat familiar with Spring Roo, so I won&#8217;t be explaining much about Roo itself.    To get up to speed, I suggest visiting the <a title="Spring Roo web site" href="http://www.springsource.org/spring-roo">Spring Roo website</a>.  If you&#8217;re already a Spring Roo user, please ensure you&#8217;re using the latest version, 1.2.1 at the time of this writing, because some of the features I discuss here where very recently added to Spring Roo.<span id="more-742"></span></p>
<h1>Demo: Adding File Upload support using Spring Roo and Spring MVC</h1>
<ol>
<li>Create a new Spring Roo project.
<ol style="list-style-type: lower-alpha;">
<li>If you&#8217;re using the Spring Tool Suite (STS), use File, New, Spring Roo Project.  Give your project a name, and a top level package name, then click finish.  After the project is created, you will see the Spring Roo console open, from this point you will follow the console instructions, not including the line below.</li>
<li>If you&#8217;re using the console, type
<pre>project --topLevelPackage ca.coolman.demo --projectName MediaUploadDemo --java 6 --packaging JAR</pre>
</li>
</ol>
<p>I will use the package <code>ca.coolman.demo for this post.</code></li>
<li>We&#8217;ll start by setting up persistence to store metadata about the uploaded image, which we&#8217;ll do in the Roo Shell. For this demo, I will use a Hypersonic embedded database for ease of setup.  In the Roo Shell, type the following:
<pre>jpa setup --database H2_IN_MEMORY --provider HIBERNATE</pre>
</li>
<li>Now, to create our model, we&#8217;ll run the following command in the Roo Shell.
<pre>entity jpa --class ~.model.MediaUpload
field string --fieldName filepath --notNull true --sizeMax 128
field number --type long --fieldName filesize --notNull true
field string --fieldName contentType --notNull true</pre>
</li>
<li>We need to modify the generated model code to add a transient content field. We&#8217;re making the field transient in the model only, the data is persisted to the filesystem within the controller, which passes the file path to the persistent filename field in the model.   With that said, edit the file <code>src/main/java/ca/coolman/demo/model/MediaUpload.java</code>, and add the following:
<pre>@Transient
private byte[] content;</pre>
</li>
<li>Now we&#8217;re ready to scaffold the CRUD views and controllers, by executing the following commands in the Roo Shell:
<pre>web mvc setup
web mvc all --package ~.web</pre>
</li>
<li>We&#8217;ll override the CREATE method of the generated controller, so that we can persist the uploaded file contents to the filesystem.  I simply pulled the code below from the generated controller ITD, and added the required code for capturing and moving the uploaded file.  (I also removed the generated test for bindingResult.hasErrors() because it will complain about our empty filepath, size, and contentType fields, which are marked in the model as notNull). When we re-save the controller, Spring Roo will automatically update the controller ITD, removing the generated CREATE method.
<pre>@RequestMapping(method = RequestMethod.POST, produces = "text/html")
public String create(@Valid MediaUpload mediaUpload, BindingResult bindingResult, Model uiModel,
       @RequestParam("content") CommonsMultipartFile content,
       HttpServletRequest httpServletRequest) {
   File dest = new File("/tmp/" + content.getOriginalFilename());
   try {
      content.transferTo(dest);
      mediaUpload.setFilesize(content.getSize());
      mediaUpload.setFilepath(dest.getAbsolutePath());
      mediaUpload.setContentType(content.getContentType());
   } catch (Exception e) {
      e.printStackTrace();
      return "mediauploads/create";
   }

   uiModel.asMap().clear();
   mediaUpload.persist();
   return "redirect:/mediauploads/" + encodeUrlPathSegment(mediaUpload.getId().toString(),
      httpServletRequest);
}</pre>
<p>In this demo, I&#8217;m sending all the files to the /tmp/ dir, you would normally define a location for uploaded files to be stored here.</li>
<li>Now, the CREATE view created by the scaffolding step will render editors for each of the fields of our model bean by default.  We don&#8217;t want to present these editors to the user, so, edit the file: <code>src/main/webapp/WEB-INF/views/mediauploads/create.jspx</code> and for each field under for form, add an attribute to the node: <strong>render=&#8221;false&#8221;</strong>.</li>
<li>To add an input for selecting the file from the local filesystem to upload, we have a few steps:
<ol>
<li>First we need to add the following field within the form:
<pre> &lt;field:input field="content" id="c_ca_coolman_demo_model_MediaUpload_content" required="true" type="file" z="user-managed"/&gt;</pre>
</li>
<li>Edit the file <code>/MediaUploadDemo/src/main/webapp/WEB-INF/i18n/application.properties</code>, add the line:
<pre>label_ca_coolman_demo_model_mediaupload_content=Content</pre>
</li>
<li>Now, this part is a bit of a hack <em>(I&#8217;m sure Spring Roo supports field of <strong>type=&#8221;file&#8221;</strong> out of the box, but I couldn&#8217;t find it)</em>, edit the tag file: <code>src/main/webapp/WEB-INF/tags/form/fields/input.tagx</code>, and look for the following:
<pre>&lt;c:when test="${type eq 'password'}"&gt;</pre>
<p>Right above this line, add the following code:</p>
<pre>&lt;c:when test="${type eq 'file'}"&gt;
   &lt;form:input type="file" id="_${sec_field}_id" path="${sec_field}" disabled="${disabled}" /&gt;
&lt;/c:when&gt;</pre>
</li>
</ol>
</li>
<li>Still in the CREATE view script, we need to set our form encoding to <strong>multipart/form-encoded</strong>.  We do this by adding the following attribute to the form node:  <strong>multipart=&#8221;true&#8221;</strong></li>
<li>Finally, we&#8217;ll enable multipart filtering using tools included with Spring Framework. This will automagically take care of the binding work that we&#8217;d normally be required to do manually. In your IDE, open the file <code>src/main/resources/META-INF/applicationContext.xml</code>. Add the following after the last &lt;bean&gt; node in the file:
<pre>&lt;bean id="multipartFilter" class="org.springframework.web.multipart.support.MultipartFilter"&gt;
   &lt;property name="multipartResolverBeanName" value="multipartResolver" /&gt;
&lt;/bean&gt;
&lt;bean id="multipartResolver"
   class="org.springframework.web.multipart.commons.CommonsMultipartResolver" /&gt;</pre>
</li>
<li>The multipart filtering added above has a dependency on Apache Commons IO, so open the pom.xml file and add the following under the dependencies node (or use the Maven POM editor, dependencies tab):
<pre>&lt;dependency&gt;
   &lt;groupId&gt;commons-io&lt;/groupId&gt;
   &lt;artifactId&gt;commons-io&lt;/artifactId&gt;
   &lt;version&gt;2.1&lt;/version&gt;
&lt;/dependency&gt;</pre>
</li>
<li>Now open the file <code>src/main/webapp/WEB-INF/web.xml</code>, and add the following in the <code>&lt;filters&gt;</code>section of the file:
<pre>&lt;filter&gt;
   &lt;filter-name&gt;multipartFilter&lt;/filter-name&gt;
   &lt;filter-class&gt;org.springframework.web.filter.DelegatingFilterProxy&lt;/filter-class&gt;
&lt;/filter&gt;
&lt;filter-mapping&gt;
   &lt;filter-name&gt;multipartFilter&lt;/filter-name&gt;
   &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
&lt;/filter-mapping&gt;</pre>
</li>
</ol>
<h1>Try it out</h1>
<p>Now, to fire up the app, drop to the terminal, go to the project root directory, and type: <code>mvn jetty:run</code>, then point your web browser to <code>http://localhost:8080</code>, click the context provided link, and you should see something that resembles the following:</p>
<p><a href="http://gadgets.coolman.ca/wp-content/uploads/2012/05/spring-roo-file-upload1.png"><img class="alignnone size-full wp-image-754" title="spring-roo-file-upload" src="http://gadgets.coolman.ca/wp-content/uploads/2012/05/spring-roo-file-upload1.png" alt="File Upload View in Spring Roo" width="804" height="229" /></a></p>
<p>Clicking on the content field will present the browse button to select a file.  When you click save, the file will be sent to your tmp/ directory, and you will be presented with the view of the file attributes.  I&#8217;ll leave the retrieval and display of the uploaded file contents as an exercise for the reader.</p>
<p><a href="http://gadgets.coolman.ca/wp-content/uploads/2012/05/spring-roo-file-upload-show.png"><img class="alignnone size-full wp-image-762" title="spring-roo-file-upload-show" src="http://gadgets.coolman.ca/wp-content/uploads/2012/05/spring-roo-file-upload-show.png" alt="Spring Roo File Upload Show Script" width="861" height="288" /></a></p>
<h1>Like this post?</h1>
<p>If you like this blog posting, please don&#8217;t forget to click the Like buttons.</p>
<h1>Further Reading</h1>
<p>As of this writing, a new Spring Roo book from Manning has just been released to the presses (April 2012), check it out:</p>
<div style="float: left;"><iframe style="width: 120px; height: 240px;" src="http://rcm.amazon.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=httpgadgetsco-20&amp;o=1&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=ss_til&amp;asins=193518296X" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" width="320" height="240"></iframe></div>
<div style="clear: left;"></div>
<div style="clear: left;">The following books are also on the shelves, and are relatively up to date as well:</div>
<div style="clear: left;"></div>
<div style="float: left;"><iframe style="width: 120px; height: 240px;" src="http://rcm.amazon.com/e/cm?t=httpgadgetsco-20&amp;o=1&amp;p=8&amp;l=as1&amp;asins=1449307906&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" width="320" height="240"></iframe></div>
<div style="float: left;"><iframe style="width: 120px; height: 240px;" src="http://rcm.amazon.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=httpgadgetsco-20&amp;o=1&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=ss_til&amp;asins=1849514585" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" width="320" height="240"></iframe></div>
<div style="clear: left;"></div>
<p><a href="http://gadgets.coolman.ca/multipart-file-upload-spring-roo/">Accepting File Uploads in your WebApp in 10 Minutes or Less</a></p><img src="http://feeds.feedburner.com/~r/GadgetReviewsFromCoolmanca/~4/0n8JEXiC2jw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://gadgets.coolman.ca/multipart-file-upload-spring-roo/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://gadgets.coolman.ca/multipart-file-upload-spring-roo/</feedburner:origLink></item>
		<item>
		<title>My story, and I’m sticking to it…</title>
		<link>http://feedproxy.google.com/~r/GadgetReviewsFromCoolmanca/~3/BDiMVjqHX9k/</link>
		<comments>http://gadgets.coolman.ca/cross-platform-strategy-story/#comments</comments>
		<pubDate>Tue, 01 May 2012 21:01:04 +0000</pubDate>
		<dc:creator>Eric Coolman</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Blackberry]]></category>
		<category><![CDATA[CodenameOne]]></category>
		<category><![CDATA[Cross-platform]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[IOS]]></category>
		<category><![CDATA[J2ME]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[LinkedIn]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Symbian]]></category>
		<category><![CDATA[Twitter]]></category>
		<category><![CDATA[User Interface]]></category>
		<category><![CDATA[Windows Phone]]></category>

		<guid isPermaLink="false">http://gadgets.coolman.ca/?p=725</guid>
		<description><![CDATA[<p><p><a href="http://gadgets.coolman.ca/cross-platform-strategy-story/">My story, and I&#8217;m sticking to it&#8230;</a></p><p>One of the Codename One guys, Shai Almog, recently posted a rebuttal to another posting on devzone, which he ended with the following: A friend recently told me: &#8220;The only reason anyone ever does cross platform is to save money&#8221;. Unfortunately that&#8217;s usually true, but my response was: &#8220;They shouldn&#8217;t. They should use cross platform [...]</p></p><p><a href="http://gadgets.coolman.ca/cross-platform-strategy-story/">My story, and I&#8217;m sticking to it&#8230;</a></p>]]></description>
			<content:encoded><![CDATA[<p><a href="http://gadgets.coolman.ca/cross-platform-strategy-story/">My story, and I&#8217;m sticking to it&#8230;</a></p><div class='wpfblike' style='float:left'><fb:like href='http://gadgets.coolman.ca/cross-platform-strategy-story/' layout='button_count' show_faces='true' width='100' action='like' colorscheme='light' send='false' /></div><p>One of the <a title="Codename One home" href="http://www.codenameone.com">Codename One</a> guys, Shai Almog, recently posted a <a title="Cross Platform Beats Native When Done Right" href="http://mobile.dzone.com/articles/cross-platform-beats-native">rebuttal to another posting on devzone</a>, which he ended with the following:</p>
<blockquote><p><em>A friend recently told me: &#8220;The only reason anyone ever does cross platform is to save money&#8221;.</em></p>
<p><em> Unfortunately that&#8217;s usually true, but my response was: &#8220;They shouldn&#8217;t. They should use cross platform to provide a distinct experience and more features.&#8221;.</em></p></blockquote>
<p>Why do I use Codename One for cross-platform development?  In a roundabout way, my story follows&#8230;<span id="more-725"></span></p>
<h1>The Facebook and Twitter effect</h1>
<p>Well, it all started with Facebook, and Twitter&#8230; but not at all how you&#8217;re thinking.  I&#8217;m not much of a Facebook kinda guy.  I use it to connect with family and old friends, minimally, and that&#8217;s about it.</p>
<p>But, I use Twitter, because I&#8217;m a huge fan of the sport of mixed martial arts, and Twitter is the best way to keep up with the quickly moving world of MMA. All the athletes, promoters, trainers, journalists&#8230; everyone involved in the sport is on there, it&#8217;s a great way to interact with them.</p>
<p>On my old <a title="Create your own device simulator skin using Gimp" href="http://gadgets.coolman.ca/create-your-own-device-simulator-skin-using-gimp/">Nokia E71</a> phone, I used a fantastic piece of software called <a title="Snaptu home" href="http://blog.snaptu.com/">Snaptu</a>, a cross-platform Java app that worked on any phone, for accessing Facebook, Twitter, LinkedIn, RSS feeds, and more.  It had an IPhone-like user interface, and they did some very intuitive things, for example, the actual app was extemely thin, and was updated on the fly from the server end (this plays a part later).  You never really updated the app. When it started (quickly at that), you had the latest features on the fly without really noticing it. This can be seen as a good user experience.. but also a very bad one <em>(Facebook Timelines as an example).</em></p>
<p>Last year, <a title="Facebook buys Snaptu" href="http://techcrunch.com/2011/03/20/facebook-reportedly-acquires-snaptu-for-an-estimated-60-70-million/">Facebook bought Snaptu for $60-$70 million</a>, and within a few months, they of course stripped all support for competing products such as Twitter and LinkedIn, thus rendering the software useless to me.   As mentioned earlier, this intuitive part of the software came back to bite me in the ass.</p>
<p>Anyways, I was intrigued by how well these guys were able to provide such a fine user experience on very limited devices, that in my eyes equaled the native offerings from Twitter and Facebook on the latest devices.  This heavily influenced my goal for mobile, to provide that consistent user experience, across the board.</p>
<p>I went on a hunt for what was available on the J2ME side, and stumbled on a list of about 30 rich UI frameworks, which I narrowed down to LWUIT, and <a title="J2ME Polish" href="http://www.j2mepolish.org/">J2MEPolish</a>.  After a short evaluation, I realized LWUIT had the vision that aligned with mine, and here they are today as <a title="Codename One home" href="http://www.codenameone.com">Codename One</a>, much further than what I anticipated, supporting the broad range of the most constrained devices to the latest gadgets.  No looking back, I believe I made the right choice <img src='http://gadgets.coolman.ca/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p>So that&#8217;s my story,  I have just one thing more to add.  My primary geographical targets for one particular project on the mobile side include, North America of course (I&#8217;m Canadian), but also Brazil and Japan,  The other day, I did a search for the current mobile trends in Brazil, and I <a title="Mobile Brazil" href="http://thenextweb.com/la/2011/08/22/smartphone-usage-in-brazil-why-youll-be-surprised/">stumbled on this article</a> from August 2011, which really opened my eyes, and I found it interesting that they mentioned the success of Facebook&#8217;s J2ME strategy (they don&#8217;t mention Snaptu by name).  In a nutshell, it appears Brazil is a very connected country, using a very broad range of devices, and they want content on those devices.  Perfect!</p>
<p>I have to wonder, with Codename One and Snaptu both coming out of Tel-Aviv&#8230; what the heck are they putting in the water over there?  <em>(It certainly isn&#8217;t snake oil!)</em></p>
<h3>Like this post?</h3>
<p>If you like this blog posting, please don&#8217;t forget to click the Like buttons. Also, you can send comments to the <a title="Codename One topic for this posting" href="http://www.codenameone.com/discussion-forum.html?place=topic%2Fcodenameone-discussions%2FpkAERt05g-Q%2Fdiscussion">Codename One Discussion Forums</a>, I check there fairly regularly.</p>
<h1>Futher Reading</h1>
<p>UPDATE: Here is the <strong>Startup Nation</strong> book Shai referred to in the comment section in response to my remark about the innovation coming from Israel:</p>
<div style="float: left;"><iframe style="width: 120px; height: 240px;" src="http://rcm.amazon.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=httpgadgetsco-20&amp;o=1&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=ss_til&amp;asins=044654146X" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" width="320" height="240"></iframe></div>
<div style="clear: left;"></div>
<p>You&#8217;ve probably noticed I&#8217;ve been doing a lot of <a title="My blog entries tagged with Twitter" href="http://gadgets.coolman.ca/tag/twitter/">Twitter development related articles</a> on this blog, and now you probably have a better understanding of why.  I personally get most of my social development related information from the sites provided by each <a title="Twitter Development site" href="https://dev.twitter.com/">Twitter</a>, <a title="Facebook Development Website" href="https://developers.facebook.com/">Facebook</a>, and <a title="LinkedIn development site" href="https://developer.linkedin.com/">LinkedIn</a>, they&#8217;ve all done a great job (part of their success i&#8217;m sure).</p>
<p>Also, here&#8217;s a few books related to development of social media related apps that should be good.  I don&#8217;t own any of these books, but I&#8217;ve selected ones are of high relevance with a decent customer rating (full disclosure: these are affiliate links):</p>
<div style="float: left;"><iframe style="width: 120px; height: 240px;" src="http://rcm.amazon.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=httpgadgetsco-20&amp;o=1&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=ss_til&amp;asins=B002PEP4OG" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" width="320" height="240"></iframe></div>
<div style="float: left;"><iframe style="width: 120px; height: 240px;" src="http://rcm.amazon.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=httpgadgetsco-20&amp;o=1&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=ss_til&amp;asins=0321680774" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" width="320" height="240"></iframe></div>
<div style="float: left;"><iframe style="width: 120px; height: 240px;" src="http://rcm.amazon.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=httpgadgetsco-20&amp;o=1&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=ss_til&amp;asins=0470768738" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" width="320" height="240"></iframe></div>
<div style="clear: left;">
<div style="float: left;"><iframe style="width: 120px; height: 240px;" src="http://rcm.amazon.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=httpgadgetsco-20&amp;o=1&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=ss_til&amp;asins=0470568623" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" width="320" height="240"></iframe></div>
<div style="float: left;"><iframe style="width: 120px; height: 240px;" src="http://rcm.amazon.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=httpgadgetsco-20&amp;o=1&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=ss_til&amp;asins=1449311601" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" width="320" height="240"></iframe></div>
<div style="float: left;"><iframe style="width: 120px; height: 240px;" src="http://rcm.amazon.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=httpgadgetsco-20&amp;o=1&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=ss_til&amp;asins=1449394914" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" width="320" height="240"></iframe></div>
<div style="clear: left;">
<p>BTW, don&#8217;t be ashamed to try the <em>&#8216;&#8230; for Dummies</em>&#8216; books for <strong>any</strong> subject. I always pick their books first when I study a new subject, and have always been pleased with the quality and presentation of their books.</p>
</div>
</div>
<p><a href="http://gadgets.coolman.ca/cross-platform-strategy-story/">My story, and I&#8217;m sticking to it&#8230;</a></p><img src="http://feeds.feedburner.com/~r/GadgetReviewsFromCoolmanca/~4/BDiMVjqHX9k" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://gadgets.coolman.ca/cross-platform-strategy-story/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://gadgets.coolman.ca/cross-platform-strategy-story/</feedburner:origLink></item>
		<item>
		<title>Create your own device simulator skin using Gimp</title>
		<link>http://feedproxy.google.com/~r/GadgetReviewsFromCoolmanca/~3/vNe69DHbUWk/</link>
		<comments>http://gadgets.coolman.ca/create-your-own-device-simulator-skin-using-gimp/#comments</comments>
		<pubDate>Sun, 29 Apr 2012 16:27:25 +0000</pubDate>
		<dc:creator>Eric Coolman</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Tips & Tricks]]></category>
		<category><![CDATA[CodenameOne]]></category>
		<category><![CDATA[Cross-platform]]></category>
		<category><![CDATA[Debugging]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[J2ME]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Netbeans]]></category>
		<category><![CDATA[Symbian]]></category>
		<category><![CDATA[User Interface]]></category>

		<guid isPermaLink="false">http://gadgets.coolman.ca/?p=676</guid>
		<description><![CDATA[<p><p><a href="http://gadgets.coolman.ca/create-your-own-device-simulator-skin-using-gimp/">Create your own device simulator skin using Gimp</a></p><p>Codename One has made it super easy to create your own device simulator, and I&#8217;ll demonstrate here using Gimp, the popular Open Source image editing software. Creating a Device Simulator Skin for a QWERTY Symbian Device I&#8217;m going to assume readers are familiar with the basic functions of an image editor so I don&#8217;t have [...]</p></p><p><a href="http://gadgets.coolman.ca/create-your-own-device-simulator-skin-using-gimp/">Create your own device simulator skin using Gimp</a></p>]]></description>
			<content:encoded><![CDATA[<p><a href="http://gadgets.coolman.ca/create-your-own-device-simulator-skin-using-gimp/">Create your own device simulator skin using Gimp</a></p><div class='wpfblike' style='float:left'><fb:like href='http://gadgets.coolman.ca/create-your-own-device-simulator-skin-using-gimp/' layout='button_count' show_faces='true' width='100' action='like' colorscheme='light' send='false' /></div><p><a title="Codename One home page" href="http://www.codenameone.com">Codename One</a> has made it super easy to create your own device simulator, and I&#8217;ll demonstrate here using <a title="Gimp home page" href="http://www.gimp.org/">Gimp</a>, the popular Open Source image editing software.</p>
<h1>Creating a Device Simulator Skin for a QWERTY Symbian Device</h1>
<p><object width="490" height="299" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://www.youtube.com/v/aryIzUfj7l4?version=3&amp;feature=player_detailpage" /><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><embed width="490" height="299" type="application/x-shockwave-flash" src="http://www.youtube.com/v/aryIzUfj7l4?version=3&amp;feature=player_detailpage" allowFullScreen="true" allowScriptAccess="always" allowfullscreen="true" allowscriptaccess="always" /></object><br />
<span id="more-676"></span>I&#8217;m going to assume readers are familiar with the basic functions of an image editor so I don&#8217;t have to explain too deeply. The key tools used in this demonstration are:</p>
<ul>
<li><a title="Google Images Home" href="http://images.google.com/">Google Image Search</a> to find the device to simulate</li>
<li>The Gimp XCF file format for saving layers</li>
<li>Image Layering</li>
<li>Free select tool, and Rectangle select tool</li>
<li>Flood fill</li>
<li>Crop selection (to remove elements within device image)</li>
<li>Crop-to-selection (to remove elements outside the device image)</li>
<li>Image Rotate</li>
</ul>
<p>With that information, you can probably figure out most of what you need to create your skin images.  Now I&#8217;ll quickly go through the complete steps.</p>
<ol>
<li>First, in your IDE, create a generic project.  We don&#8217;t need a Java project here, as all the binary code is provided by Codename One.</li>
<li>Create a <code>src/</code> folder, and create a plain text file within that folder named <code>skin.properties</code>.</li>
<li>Use <a title="Google Images Home" href="http://images.google.com/">Google Image Search</a> to find an image of the device you want to simulate.  Pick the largest, front facing image you can find. Save the image in the <code>src/</code> directory of your project.  For this demo, as seen in the video, I chose this image:<br />
<a href="http://gadgets.coolman.ca/wp-content/uploads/2012/04/nokia-e71.jpg"><img class="alignnone size-medium wp-image-694" title="nokia-e71" src="http://gadgets.coolman.ca/wp-content/uploads/2012/04/nokia-e71-300x300.jpg" alt="Nokia E71 Skin Original Image" width="300" height="300" /></a></li>
<li>Open the image using Gimp, and use the <strong>Rectangle select tool</strong> to highlight just the device, then click <strong>Image</strong>, <strong>Crop To Selection</strong> to remove everything else outside the device.</li>
<li>You&#8217;ll want an image at least <strong>400&#215;600</strong> or so in portrait mode (preferably even a bit larger) if you can find it.  To get the best representation of your app, the trick is, you want the viewport to be scaled to the resolution of the device screen. If your image is much smaller than that, use <strong>Image</strong>, <strong>Scale Image</strong> to bring it up to size (and hope it doesn&#8217;t get too pixelated).  Conversely, if the image is much larger, you&#8217;ll likely want to scale it down.  For example, the E71 viewport is 320&#215;240 including the statusbar, The image above was approximately 500&#215;500, and after cropping and rescaling, final skin image is 435&#215;800.</li>
<li>Save your image as <strong>skin.xcf</strong>. Gimp will detect from the file extension that you want to preserve layers.</li>
<li>Open the <strong>layering window</strong> by hitting CTRL+L, or selecting <strong>Windows</strong>, <strong>Dockable Dialogs</strong>, <strong>Layers</strong>.</li>
<li>Click the <strong>Add Layer</strong> button, and make sure new layer is <strong>above</strong> the image of the device by using the <em>Up</em> or <em>Down</em>buttons.  Make sure you have this new layer highlighted, this is the layer we want to draw on.   Also make sure you have a picture of an eyeball beside each layer &#8211; we want both layers visible at once.
<p><div id="attachment_695" class="wp-caption alignnone" style="width: 310px"><a href="http://gadgets.coolman.ca/wp-content/uploads/2012/04/gimp-layers.png"><img class="size-medium wp-image-695" title="gimp-layers" src="http://gadgets.coolman.ca/wp-content/uploads/2012/04/gimp-layers-300x237.png" alt="Gimp Layers Window" width="300" height="237" /></a><p class="wp-caption-text">Highlighting (gray bar) the new layer</p></div></li>
<li>Back on the image window, for each physical button on the device image, use one of the <strong>Select tools</strong> to select the button, then use the <strong>Flood Fill</strong> tool to color each button a different color.  You don&#8217;t need to get too fancy here, just get the general area of the button, but<span style="color: #0000ff;"><em> make sure every button has its own unique color</em></span>.  As you go along, make a note of the mapping between every color (take note of the hex value of the color when you are in the Color select dialog), and the button it maps to.<br />
<a href="http://gadgets.coolman.ca/wp-content/uploads/2012/04/gimp-toolbox-window.png"><img class="alignnone  wp-image-703" title="gimp-toolbox-window" src="http://gadgets.coolman.ca/wp-content/uploads/2012/04/gimp-toolbox-window-268x300.png" alt="Gimp tools to use for creating Codename One Device Simulator Skin" width="178" height="200" /></a></li>
<li>Now use the <strong>Rectangle select tool</strong>, and select the part of the device that will be the applications display canvas.  <strong>Flood Fill</strong> this area in <strong>black (hex#000000)</strong>.  The black area in the E71 skin has a dimension of 320&#215;240.  Here, we could optionally cut out the status bar, then place it in separate images  header.png and header_l.png.
<p><div id="attachment_716" class="wp-caption alignnone" style="width: 310px"><a href="http://gadgets.coolman.ca/wp-content/uploads/2012/04/nokia-e71-skin-layered1.png"><img class="size-medium wp-image-716" title="nokia-e71-skin-layered" src="http://gadgets.coolman.ca/wp-content/uploads/2012/04/nokia-e71-skin-layered1-300x276.png" alt="Nokia E71 Skin layers in Gimp" width="300" height="276" /></a><p class="wp-caption-text">There&#39;s actually 51 different colors on this skin (shades of yellow and red)</p></div></li>
<li>Save your <strong><em>skin.xcf</em></strong> file <em>(this is the last time you want to save the XCF file.  By keeping a copy at this state, it is easy to make adjustments to the skin, including image size, and re-save the 4 files below)</em>.</li>
</ol>
<p>Now, we will use the XCF file to create 4 PNG files.</p>
<ol>
<li>On the <strong>Layer screen</strong> opened in step 8, click the eyeball beside the layer that has your new color map.  It should disappear, and you should only see the device now.</li>
<li>Click the image window, then click <strong>File</strong>, <strong>Save A Copy</strong>), then name the file <strong>skin.png</strong></li>
<li>Now back on the layer window, click the eyeball beside the color map again, then click the eyeball beside the device image.  You should now see only the color map.</li>
<li>Click the image window, then click <strong>File</strong>, <strong>Save A Copy</strong>, then name the file<strong> skin_map.png</strong></li>
<li>Now, click <strong>Image</strong>, <strong>Transform</strong>, <strong>Rotate 90 degrees counter-clockwise</strong></li>
<li>Click <strong>File</strong>, <strong>Save A Copy</strong>, then name the file <strong>skin_map_l.png</strong></li>
<li>Finally, back in the layer window, click the eyeball beside the color map again, then click the eyeball beside the device image.  You should now see only the device image in landscape mode.</li>
<li>Click <strong>File</strong>, <strong>Save A Copy</strong>, then name the file <strong>skin_l.png</strong></li>
</ol>
<p>That&#8217;s it for the images, you can exit Gimp now.  Gimp will ask you if you want to save changes, choose to discard them, we want to preserve the XCF we saved in step 11 above.</p>
<p>Back in the IDE, open the <strong>skin.properties</strong> file, and edit it as appropriate for the device you are simulating.  For this demonstration I chose the Nokia E71 because Codename One does not include any simulators for any Symbian S60 or QWERTY devices at this time.</p>
<pre>#-- skin.properties for Nokia E71
touch=false
smallFontSize=10
mediumFontSize=12
largeFontSize=14
systemFontFamily=Arial
proportionalFontFamily=SansSerif
monospaceFontFamily=Monospaced
# Valid values (from <a title="com.codenameone.ui.Display source" href="http://code.google.com/p/codenameone/source/browse/trunk/CodenameOne/src/com/codename1/ui/Display.java">com.codename1.ui.Display</a>)
# 0=UNKNOWN, 1=NUMERIC, 2=QWERTY, 3=VIRTUAL, 4=HALF_QWERTY
keyboardType=2
softbuttonCount=2
# This sets User-Agent (See <a href="http://code.google.com/p/codenameone/source/browse/trunk/Ports/JavaSE/src/com/codename1/impl/javase/JavaSEPort.java">com.codenameone.impl.javase.JavaSEPort</a>)
# Valid values: and, ios, rim, me
platformName=me
overrideNames=me,phone,symbian,s60
nativeThemeAttribute=codename1.j2me.nativeTheme
# color table mapping to key codes, each color starts with the letter c (lower case!) followed by the "web color"
# for hex values for keycode start with the lower case x.

# Use the app from the <a title="Finding Device Keycodes blog post" href="http://gadgets.coolman.ca/finding-device-key-codes">previous post</a> to help find keycodes for your device
# soft buttons, pickup, hangup
cff0000=-6
cff0001=-7
cff0002=-10
cff0003=-11

# home, calendar, addressbook, email
caa0000=-12
caa0001=-13
caa0002=-14
caa0003=-15

# dpad (north, east, south, west), gamefire
c770000=38
c770001=39
c770002=40
c770003=37
c770004=32

# Q W E R(1) T(2) Y(3) U(*) I(+) O P  
cffff00=113
cffff01=119
cffff02=101
cffff03=114
cffff04=116
cffff05=121
cffff06=117
cffff07=105
cffff08=111
cffff09=112

# A S D F(4) G(5) H(6) J(#) K(-) L BACKSPACE
cffff0a=97
cffff0b=115
cffff0c=100
cffff0d=102
cffff0e=103
cffff0f=104
cffff10=106
cffff11=107
cffff12=108
cffff13=-8

# Z X C V(7) B(8) N(9) M(0) ,(;) .(:) ENTER
cffff14=122
cffff15=120
cffff16=99
cffff17=118
cffff18=98
cffff19=110
cffff1a=109
cffff1b=44
cffff1c=46
cffff1d=10

# ALT SHIFT @(/) SPACE '(&amp;) ?(!) CHR(CTRL)
cffff1e=112
cffff1f=-50
cffff20=64
cffff21=32
cffff22=39
cffff23=63
cffff24=00</pre>
<h1>Building a loadable skin file</h1>
<p>A skin file is simply a zipfile with the extension of .skin.  The following is a simple Ant build file that will build the skin as the default target:</p>
<pre>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;project name="Nokia-E71" basedir="." default="skin"&gt;
&lt;target name="skin"&gt;
   &lt;zip destfile="bin/${ant.project.name}.skin"
      basedir="src"
      includes="**/*.png,**/*.ttf,**/skin.properties,**/*.res" /&gt;
&lt;/target&gt;
&lt;/project&gt;</pre>
<h1>Using the new skin</h1>
<p>Simply fire up the device simulator, click <strong>Skins</strong>, <strong>Add</strong>,and select your newly created skin.  The simulator will restart with your new skin loaded.</p>
<h1>Conclusion</h1>
<p>This demonstration includes about the bare minimum for a skin.  There are a few more files that can be included in a skin including a <strong>resource file</strong>, a <strong>header.png/header_l.png</strong> (the notification bar). and <strong>truetype font </strong>files.  To get a better idea of the properties available to the skin, see the <a title="JavaSEPort source" href="http://code.google.com/p/codenameone/source/browse/trunk/Ports/JavaSE/src/com/codename1/impl/javase/JavaSEPort.java"><code>com.codenameone.impl.javase.JavaSEPort</code></a> file from the <a title="Codename One Sources" href="http://www.codenameone.com/sources.html">Subversion repository</a>.  I hope to see some cool new device skins contributed to Codename One!</p>
<p>The Nokia E71 skin files from this demo can be found in the <a title="VASE API – Value Added SErvices for Codename One" href="http://gadgets.coolman.ca/vase/">Vase API</a>.</p>
<p style="padding-left: 30px;"><em><strong>UPDATE</strong>: I&#8217;ve added a bunch of new skins to the Vase API.  The full list now includes:<strong> </strong></em></p>
<ul>
<li><em><strong>Nokia E71</strong> (Symbian S60, non-touch, QWERTY, 320 x 240)</em><br />
<em><strong></strong></em></li>
<li><em><strong>Samsung Galaxy Nexus</strong> (Android ICS, 720 x 1280)</em></li>
<li><em><strong>Motorola Dext/Cliq</strong> (Android 1.5 QWERTY slider, 320 x 480)</em></li>
<li><em><strong>LG Viewty KU990</strong> (Symbian, touch, 240 x 400)</em></li>
<li><em><strong>Nokia 2760 featurephone</strong> (Symbian, flip, 128 x 160)</em></li>
<li><em><strong>Blackberry Bold 9790</strong> (BBOS7, touch, qwerty, 480 x 360) (not yet complete)<br />
</em></li>
<li><em><strong>Blackberry Curve 8320</strong> </em>(BBOS4, qwerty, 320 x 240) (not yet complete)<em></em></li>
<li><em><strong>Coby MID7012 </strong> (7&#8243; android 2.3 tablet, 480&#215;800) (not yet complete)</em></li>
<li><strong>Samsung Nexus S</strong> (Android 2.3/4.0, 480&#215;800) (not yet complete)</li>
<li><em><strong>Samsung SGH-A747 featurephone</strong> (Symbian S40, flipphone, 172 x 220) (not yet complete)</em></li>
</ul>
<h2>Disclaimer</h2>
<p>I am in no way affiliated with the Codename One project aside from being satisfied user.</p>
<h3>Like this post?</h3>
<p>If you like this blog posting, please don&#8217;t forget to click the Like buttons. Also, you can send comments to the <a title="Codename One Discussion Topic for this entry" href="http://www.codenameone.com/discussion-forum.html?place=topic%2Fcodenameone-discussions%2FPWWnXSss1xI%2Fdiscussion">Codename One Discussion Forums</a>, I check there fairly regularly.</p>
<h1>Futher Reading</h1>
<p>Take your Gimp skills to the next level with the following products:</p>
<div style="float: left;"><iframe style="width: 120px; height: 240px;" src="http://rcm.amazon.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=httpgadgetsco-20&amp;o=1&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=ss_til&amp;asins=1590595874" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" width="320" height="240"></iframe></div>
<div style="float: left;"><iframe style="width: 120px; height: 240px;" src="http://rcm.amazon.com/e/cm?t=httpgadgetsco-20&amp;o=1&amp;p=8&amp;l=as1&amp;asins=1933952490&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" width="320" height="240"></iframe></div>
<div style="float: left;"><iframe style="width: 120px; height: 240px;" src="http://rcm.amazon.com/e/cm?t=httpgadgetsco-20&amp;o=1&amp;p=8&amp;l=as1&amp;asins=0470523972&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" width="320" height="240"></iframe></div>
<div style="float: left;"><iframe style="width: 120px; height: 240px;" src="http://rcm.amazon.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=httpgadgetsco-20&amp;o=1&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=ss_til&amp;asins=1565927311" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" width="320" height="240"></iframe></div>
<div style="clear: left;"></div>
<p><a href="http://gadgets.coolman.ca/create-your-own-device-simulator-skin-using-gimp/">Create your own device simulator skin using Gimp</a></p><img src="http://feeds.feedburner.com/~r/GadgetReviewsFromCoolmanca/~4/vNe69DHbUWk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://gadgets.coolman.ca/create-your-own-device-simulator-skin-using-gimp/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://gadgets.coolman.ca/create-your-own-device-simulator-skin-using-gimp/</feedburner:origLink></item>
	</channel>
</rss>
