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

<channel>
	<title>Bryan Denny</title>
	<atom:link href="http://www.bryandenny.com/index.php/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.bryandenny.com</link>
	<description>The Life of a Programmer</description>
	<lastBuildDate>Tue, 06 Dec 2011 06:02:53 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>WISHLIST 2011</title>
		<link>http://www.bryandenny.com/index.php/2011/12/06/wishlist-2011/</link>
		<comments>http://www.bryandenny.com/index.php/2011/12/06/wishlist-2011/#comments</comments>
		<pubDate>Tue, 06 Dec 2011 06:02:53 +0000</pubDate>
		<dc:creator>mandlar</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.bryandenny.com/?p=1104</guid>
		<description><![CDATA[Here&#8217;s my annual birthday/Christmas wishlist. In no particular order.
Xbox 360 games:

Deus Ex: Human Revolution (~$35)
Star Wars: Force Unleashed 2 (~$20)
LA Noire (~$20)
Red Dead Redemption (~$50)

Books:

Neverwinter by RA Salvatore
These can be used:

Code Complete 2
The Mythical Man-Month
I have a list of a bunch of WW2/Europe history books if anyone needs more ideas  



Other:

Running shirts or other [...]]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s my annual birthday/Christmas wishlist. In no particular order.</p>
<p><strong>Xbox 360 games:</strong></p>
<ul>
<li><a href="http://www.amazon.com/Deus-Ex-Human-Revolution-Xbox-360/dp/B002I0JA7E/ref=sr_1_1?s=videogames&amp;ie=UTF8&amp;qid=1323148231&amp;sr=1-1" target="_blank">Deus Ex: Human Revolution</a> (~$35)</li>
<li><a href="http://www.amazon.com/Star-Wars-Force-Unleashed-Xbox-360/dp/B0030EU3TG/ref=sr_1_1?ie=UTF8&amp;qid=1289761629&amp;sr=8-1" target="_blank">Star Wars: Force Unleashed 2</a> (~$20)</li>
<li><a href="http://www.amazon.com/L-Noire-Xbox-360/dp/B002I0HBZW/ref=sr_1_59_title_0?s=videogames&amp;ie=UTF8&amp;qid=1323150892&amp;sr=1-59" target="_blank">LA Noire</a> (~$20)</li>
<li><a href="http://www.amazon.com/Red-Dead-Redemption-Xbox-360/dp/B001SH7YMG/ref=br_lf_m_1000629111_1_12_ttl?ie=UTF8&amp;m=ATVPDKIKX0DER&amp;s=videogames&amp;pf_rd_p=1280143442&amp;pf_rd_s=center-2&amp;pf_rd_t=1401&amp;pf_rd_i=1000629111&amp;pf_rd_m=ATVPDKIKX0DER&amp;pf_rd_r=0CNHW544DHT6P06Y4943" target="_blank">Red Dead Redemption</a> (~$50)</li>
</ul>
<p><strong>Books:</strong></p>
<ul>
<li><a href="http://www.amazon.com/Neverwinter-Saga-Book-II/dp/0786958421/ref=sr_1_1?ie=UTF8&amp;qid=1323149420&amp;sr=8-1">Neverwinter </a>by RA Salvatore</li>
<li>These can be used:
<ul>
<li><a href="http://www.amazon.com/Code-Complete-Practical-Handbook-Construction/dp/0735619670/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1259526389&amp;sr=1-1" target="_blank">Code Complete 2</a></li>
<li><a href="http://www.amazon.com/Mythical-Man-Month-Software-Engineering-Anniversary/dp/0201835959/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1259526324&amp;sr=1-1" target="_blank">The Mythical Man-Month</a></li>
<li>I have a list of a bunch of WW2/Europe history books if anyone needs more ideas <img src='http://www.bryandenny.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
</ul>
</li>
</ul>
<p><strong>Other:</strong></p>
<ul>
<li>Running shirts or other running gear (more socks or winter gear, such as wind breaker, running pants, etc.)</li>
<li>UNC shirts, etc.</li>
<li>a new Firefox shirt?  Android shirts?</li>
<li>polo shirts for work</li>
<li>giftcards</li>
<li>Galaxy Nexus accessories (if it ever will release, won&#8217;t know accessories until after Dec 9, maybe)</li>
<li>Any sort of French stuff, children/young adult reading level, videos, etc.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.bryandenny.com/index.php/2011/12/06/wishlist-2011/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CAR DASHBOARD RELEASED!</title>
		<link>http://www.bryandenny.com/index.php/2011/03/05/car-dashboard-released/</link>
		<comments>http://www.bryandenny.com/index.php/2011/03/05/car-dashboard-released/#comments</comments>
		<pubDate>Sat, 05 Mar 2011 06:42:15 +0000</pubDate>
		<dc:creator>mandlar</dc:creator>
				<category><![CDATA[android]]></category>

		<guid isPermaLink="false">http://www.bryandenny.com/?p=1095</guid>
		<description><![CDATA[After about 3-4 months of work, I&#8217;ve finally released my second application to the Android market!
Car Dashboard is both a speedometer and a Car Home dock replacement app.  Use this app to watch your speed and easily access 20 customizable  shortcuts!
The app automatically launches when placed in a car dock (that has a [...]]]></description>
			<content:encoded><![CDATA[<p>After about 3-4 months of work, I&#8217;ve finally released my second application to the Android market!</p>
<p>Car Dashboard is both a speedometer and a Car Home dock replacement app.  Use this app to watch your speed and easily access 20 customizable  shortcuts!</p>
<p>The app automatically launches when placed in a car dock (that has a magnet).</p>
<p><strong>Features include:</strong><br />
* Speedometer<br />
* Speed Alerts (fully customizable by speed, colors, flashing, and sounds)<br />
* Compass<br />
* Current location<br />
* Current temperature<br />
* Current altitude<br />
* Max speed<br />
* US and Metric units/speed alerts: knots, km/h or mph, Fahrenheit or Celsius, meters or feet<br />
* Custom text colors<br />
* 20 customizable shortcuts &#8211; launch favorite applications,  directly dial important numbers, navigate to common locations, and more!</p>
<p>Avoid getting a speeding ticket by keeping track and being alerted of your speed accurately via GPS!</p>
<p><strong>What&#8217;s supported?</strong> The application should run on Android 1.6+</p>
<p><strong>Download: </strong><strong> </strong>You can find the app in the market by scanning the following QR code or by visiting the following links:</p>
<p><img class="alignnone" title="QR Code" src="http://www.bryandenny.com/software/images/QRCodes/car_dashboard_qr_code.png" alt="" width="230" height="230" /></p>
<p><strong>Free:</strong> <a href="https://market.android.com/details?id=net.mandaria.cardashboardfree">https://market.android.com/details?id=net.mandaria.cardashboardfree</a></p>
<p><strong>Paid: </strong><a href="https://market.android.com/details?id=net.mandaria.cardashboardpro">https://market.android.com/details?id=net.mandaria.cardashboardpro</a></p>
<p><strong>Screenshots:</strong></p>
<p><a href="http://www.bryandenny.com/software/images/Screenshots/CarDashboard/cardashboard1.png" rel="lightbox"><img class="thumb" src="http://www.bryandenny.com/software/images/Screenshots/CarDashboard/cardashboard1_thumb.png" alt="" /></a><a href="http://www.bryandenny.com/software/images/Screenshots/CarDashboard/cardashboard2.png"> <img class="thumb" src="http://www.bryandenny.com/software/images/Screenshots/CarDashboard/cardashboard2_thumb.png" alt="" /></a><a href="http://www.bryandenny.com/software/images/Screenshots/CarDashboard/cardashboard3.png"> <img class="thumb" src="http://www.bryandenny.com/software/images/Screenshots/CarDashboard/cardashboard3_thumb.png" alt="" /></a><a href="http://www.bryandenny.com/software/images/Screenshots/CarDashboard/cardashboard4.png"> <img class="thumb" src="http://www.bryandenny.com/software/images/Screenshots/CarDashboard/cardashboard4_thumb.png" alt="" /></a><a href="http://www.bryandenny.com/software/images/Screenshots/CarDashboard/cardashboard5.png"> <img class="thumb" src="http://www.bryandenny.com/software/images/Screenshots/CarDashboard/cardashboard5_thumb.png" alt="" /></a><a href="http://www.bryandenny.com/software/images/Screenshots/CarDashboard/cardashboard6.png"> <img class="thumb" src="http://www.bryandenny.com/software/images/Screenshots/CarDashboard/cardashboard6_thumb.png" alt="" /></a></p>
<p>I also released a <strong>new marketing website</strong> for all of my applications. <a href="http://www.mandaria.net">You can find it here</a>.</p>
<p><strong>What&#8217;s next?</strong> I have another application already in the pipe line to start working on (more details later). I also have quite a few features that I plan on adding to Car Dashboard.  The first additional feature will most likely be music controls via emulating head set controls.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bryandenny.com/index.php/2011/03/05/car-dashboard-released/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>ANDROID 2.3 GINGERBREAD SDK, ADB, AND DDMS</title>
		<link>http://www.bryandenny.com/index.php/2010/12/07/android-2-3-gingerbread-sdk-adb-and-ddms/</link>
		<comments>http://www.bryandenny.com/index.php/2010/12/07/android-2-3-gingerbread-sdk-adb-and-ddms/#comments</comments>
		<pubDate>Tue, 07 Dec 2010 15:51:17 +0000</pubDate>
		<dc:creator>mandlar</dc:creator>
				<category><![CDATA[android]]></category>

		<guid isPermaLink="false">http://www.bryandenny.com/?p=1092</guid>
		<description><![CDATA[The Android 2.3 Gingerbread SDK was released yesterday!
The first problem I encountered is the fact that adb.exe was moved to the /platform-tools/ folder.  So every time I tried to run DDMS I received the following error message:
Failed to get adb version: Cannot run program &#8220;adb&#8221;: CreateProcess error=2, The system cannot find the file specified.
I managed [...]]]></description>
			<content:encoded><![CDATA[<p><a href="The Android 2.3 Gingerbread SDK was released yesterday!">The Android 2.3 Gingerbread SDK was released yesterday!</a></p>
<p>The first problem I encountered is the fact that adb.exe was moved to the /platform-tools/ folder.  So every time I tried to run DDMS I received the following error message:</p>
<blockquote><p>Failed to get adb version: Cannot run program &#8220;adb&#8221;: CreateProcess error=2, The system cannot find the file specified.</p></blockquote>
<p>I managed to fix this by adding the platform-tools folder to my <a rel="nofollow" href="http://geekswithblogs.net/renso/archive/2009/10/21/how-to-set-the-windows-path-in-windows-7.aspx">PATH in my Environment Variables</a>.</p>
<blockquote></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.bryandenny.com/index.php/2010/12/07/android-2-3-gingerbread-sdk-adb-and-ddms/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>WISHLIST</title>
		<link>http://www.bryandenny.com/index.php/2010/11/21/wishlist-2/</link>
		<comments>http://www.bryandenny.com/index.php/2010/11/21/wishlist-2/#comments</comments>
		<pubDate>Sun, 21 Nov 2010 18:46:36 +0000</pubDate>
		<dc:creator>mandlar</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.bryandenny.com/?p=1081</guid>
		<description><![CDATA[Since I&#8217;ve been asked to make a wishlist for my birthday/Christmas, here it is.  Nothing is really in any sort of particular order.  I listed cheaper games separately because I&#8217;m fine with getting more of older, cheaper games, than one or two newer games.  Prices fluctuate a lot, so be sure to actually check out [...]]]></description>
			<content:encoded><![CDATA[<p>Since I&#8217;ve been asked to make a wishlist for my birthday/Christmas, here it is.  Nothing is really in any sort of particular order.  I listed cheaper games separately because I&#8217;m fine with getting more of older, cheaper games, than one or two newer games.  Prices fluctuate a lot, so be sure to actually check out the links.</p>
<p><strong>Xbox 360 games:</strong></p>
<ul>
<li><a href="http://www.amazon.com/Rock-Band-3-Xbox-360/dp/B003RS8HG6/ref=br_lf_m_1000629111_1_5_ttl?ie=UTF8&amp;m=ATVPDKIKX0DER&amp;s=videogames&amp;pf_rd_p=1280143442&amp;pf_rd_s=center-2&amp;pf_rd_t=1401&amp;pf_rd_i=1000629111&amp;pf_rd_m=ATVPDKIKX0DER&amp;pf_rd_r=0CNHW544DHT6P06Y4943" target="_blank">Rock Band 3</a> (Need Keytar too)</li>
<li><a href="http://www.amazon.com/Battlefield-Bad-Company-2-Xbox-360/dp/B001QXNBJM/ref=sr_1_1?s=videogames&amp;ie=UTF8&amp;qid=1289761967&amp;sr=1-1" target="_blank">Battlefield: Bad Company 2</a> (~$40)</li>
<li><a href="http://www.amazon.com/Fable-III-Xbox-360/dp/B002I0JGDM/ref=br_lf_m_1000629111_1_3_ttl?ie=UTF8&amp;m=ATVPDKIKX0DER&amp;s=videogames&amp;pf_rd_p=1280143442&amp;pf_rd_s=center-2&amp;pf_rd_t=1401&amp;pf_rd_i=1000629111&amp;pf_rd_m=ATVPDKIKX0DER&amp;pf_rd_r=0CNHW544DHT6P06Y4943" target="_blank">Fable III</a> (~$55)</li>
<li><a href="http://www.amazon.com/Red-Dead-Redemption-Xbox-360/dp/B001SH7YMG/ref=br_lf_m_1000629111_1_12_ttl?ie=UTF8&amp;m=ATVPDKIKX0DER&amp;s=videogames&amp;pf_rd_p=1280143442&amp;pf_rd_s=center-2&amp;pf_rd_t=1401&amp;pf_rd_i=1000629111&amp;pf_rd_m=ATVPDKIKX0DER&amp;pf_rd_r=0CNHW544DHT6P06Y4943" target="_blank">Red Dead Redemption</a> (~$40)</li>
<li><a href="http://www.amazon.com/Star-Wars-Force-Unleashed-Xbox-360/dp/B0030EU3TG/ref=sr_1_1?ie=UTF8&amp;qid=1289761629&amp;sr=8-1" target="_blank">Star Wars: Force Unleashed 2</a> (~$60)</li>
<li><a href="http://www.amazon.com/Medal-Honor-Xbox-360/dp/B000TI836G/ref=br_lf_m_1000629111_1_10_ttl?ie=UTF8&amp;m=ATVPDKIKX0DER&amp;s=videogames&amp;pf_rd_p=1280143442&amp;pf_rd_s=center-2&amp;pf_rd_t=1401&amp;pf_rd_i=1000629111&amp;pf_rd_m=ATVPDKIKX0DER&amp;pf_rd_r=0CNHW544DHT6P06Y4943" target="_blank">Medal Of Honor</a> (~$50)</li>
<li><a href="http://www.amazon.com/Castlevania-Lords-Shadow-Xbox-360/dp/B002GPPPS4/ref=br_lf_m_1000629111_1_24_ttl?ie=UTF8&amp;m=ATVPDKIKX0DER&amp;s=videogames&amp;pf_rd_p=1280143442&amp;pf_rd_s=center-2&amp;pf_rd_t=1401&amp;pf_rd_i=1000629111&amp;pf_rd_m=ATVPDKIKX0DER&amp;pf_rd_r=0CNHW544DHT6P06Y4943" target="_blank">Castlevania: Lords of Shadow</a> (~$60)</li>
</ul>
<p><strong>CHEAP Xbox 360 games:</strong></p>
<ul>
<li><a href="http://www.amazon.com/Green-Day-Rock-Band-Xbox-360/dp/B0039RFIQM/ref=sr_1_3?ie=UTF8&amp;qid=1289762757&amp;sr=8-3" target="_blank">Green Day: Rock Band</a> (~$35)</li>
<li><a href="http://www.amazon.com/Assassins-Creed-Xbox-360/dp/B000P46NMK/ref=sr_1_2?ie=UTF8&amp;s=videogames&amp;qid=1259458816&amp;sr=1-2" target="_blank">Assassins Creed 1</a> (~$20)</li>
<li><a href="http://www.amazon.com/Assassins-Creed-II-Xbox-360/dp/B00269DXCK/ref=sr_1_3?ie=UTF8&amp;s=videogames&amp;qid=1259458816&amp;sr=1-3" target="_blank">Assassins Creed 2</a> (~$20)</li>
<li><a href="http://www.amazon.com/Batman-Arkham-Asylum-Xbox-360/dp/B001E8VB3C/ref=sr_1_1?ie=UTF8&amp;s=videogames&amp;qid=1259458781&amp;sr=1-1" target="_blank">Batman: Arkham Asylum</a> (~$30)</li>
<li><a href="http://www.amazon.com/Mass-Effect-Xbox-360/dp/B000OLXX86/ref=br_lf_m_1000629111_2_35_ttl?ie=UTF8&amp;m=ATVPDKIKX0DER&amp;s=videogames&amp;pf_rd_p=1280143442&amp;pf_rd_s=center-2&amp;pf_rd_t=1401&amp;pf_rd_i=1000629111&amp;pf_rd_m=ATVPDKIKX0DER&amp;pf_rd_r=0AN75VSDJ5F6JR1M564G" target="_blank">Mass Effect 1</a> (~$20)</li>
<li><a href="http://www.amazon.com/Mass-Effect-2-Xbox-360/dp/B001TORSII/ref=br_lf_m_1000629111_1_15_ttl?ie=UTF8&amp;m=ATVPDKIKX0DER&amp;s=videogames&amp;pf_rd_p=1280143442&amp;pf_rd_s=center-2&amp;pf_rd_t=1401&amp;pf_rd_i=1000629111&amp;pf_rd_m=ATVPDKIKX0DER&amp;pf_rd_r=0CNHW544DHT6P06Y4943" target="_blank">Mass Effect 2</a> (~$20)</li>
<li><a href="http://www.amazon.com/BioShock-xbox-360/dp/B000MKA60W/ref=br_lf_m_1000629111_3_69_ttl?ie=UTF8&amp;m=ATVPDKIKX0DER&amp;s=videogames&amp;pf_rd_p=1280143442&amp;pf_rd_s=center-2&amp;pf_rd_t=1401&amp;pf_rd_i=1000629111&amp;pf_rd_m=ATVPDKIKX0DER&amp;pf_rd_r=16ZNSQHCNWH7F6E3NTZ8" target="_blank">BioShock 1</a> (~$20)</li>
<li><a href="http://www.amazon.com/Bioshock-2-Xbox-360/dp/B0016BVYA2/ref=br_lf_m_1000629111_2_47_ttl?ie=UTF8&amp;m=ATVPDKIKX0DER&amp;s=videogames&amp;pf_rd_p=1280143442&amp;pf_rd_s=center-2&amp;pf_rd_t=1401&amp;pf_rd_i=1000629111&amp;pf_rd_m=ATVPDKIKX0DER&amp;pf_rd_r=0DPAPWV9B8VXRBC6P7Z5" target="_blank">BioShock 2</a> (~$25)</li>
<li><a href="http://www.amazon.com/Borderlands-Xbox-360/dp/B000WMEEB2/ref=sr_1_1?ie=UTF8&amp;s=videogames&amp;qid=1259524966&amp;sr=8-1" target="_blank">Borderlands</a> (~$30)</li>
</ul>
<p><strong>Books:</strong></p>
<ul>
<li><a href="http://www.amazon.com/Gauntlgrym-Neverwinter-Book-R-Salvatore/dp/0786955007/ref=sr_1_1?ie=UTF8&amp;qid=1289761391&amp;sr=8-1" target="_blank">Gauntlgrym</a> by RA Salvatore</li>
<li>These can be used:
<ul>
<li><a href="http://www.amazon.com/My-Century-Novel-Gunter-Grass/dp/015100496X/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1259526463&amp;sr=1-1" target="_blank">My Century</a> by Gunter Grass</li>
<li><a href="http://www.amazon.com/Code-Complete-Practical-Handbook-Construction/dp/0735619670/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1259526389&amp;sr=1-1" target="_blank">Code Complete 2</a></li>
<li><a href="http://www.amazon.com/Peeling-Onion-Gunter-Grass/dp/0156035340/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1259526488&amp;sr=1-1" target="_blank">Peeling the Onion</a> by Gunter Grass</li>
<li><a href="http://www.amazon.com/Mythical-Man-Month-Software-Engineering-Anniversary/dp/0201835959/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1259526324&amp;sr=1-1" target="_blank">The Mythical Man-Month</a></li>
<li><a href="http://www.amazon.com/Pragmatic-Programmer-Journeyman-Master/dp/020161622X/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1259526273&amp;sr=1-1" target="_blank">The Pragmatic Programmer</a></li>
<li>I have a list of a bunch of WW2/Europe history books if anyone needs more ideas <img src='http://www.bryandenny.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
</ul>
</li>
</ul>
<p><strong>Other:</strong></p>
<ul>
<li>UNC shirts, etc.</li>
<li>a new Firefox shirt?  Android shirts?</li>
<li>polo shirts for work</li>
<li>giftcards</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.bryandenny.com/index.php/2010/11/21/wishlist-2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>ROOTING AND FLASHING CYANOGEN MOD ON MY PHONE</title>
		<link>http://www.bryandenny.com/index.php/2010/09/19/rooting-and-flashing-cyanogen-mod-on-my-phone/</link>
		<comments>http://www.bryandenny.com/index.php/2010/09/19/rooting-and-flashing-cyanogen-mod-on-my-phone/#comments</comments>
		<pubDate>Sun, 19 Sep 2010 19:50:02 +0000</pubDate>
		<dc:creator>mandlar</dc:creator>
				<category><![CDATA[android]]></category>

		<guid isPermaLink="false">http://www.bryandenny.com/?p=1077</guid>
		<description><![CDATA[Well, I finally got around to rooting my phone (Motorola Droid) last month using the Easy Root method.  I was quite content with sticking the stock 2.2 Froyo ROM since all I really wanted was some basic under/over clocking and Wifi tethering.
Then this month a new OTA update for Froyo came out and the Easy [...]]]></description>
			<content:encoded><![CDATA[<p>Well, I finally got around to rooting my phone (Motorola Droid) last month using the <a href="http://www.unstableapps.com/">Easy Root</a> method.  I was quite content with sticking the stock 2.2 Froyo ROM since all I really wanted was some basic under/over clocking and Wifi tethering.</p>
<p>Then this month a new OTA update for Froyo came out and the Easy Root method no longer works for it.  So I was stuck at Froyo build FRG01B and kept getting the dialog that I had an OTA update ready to install.  You can ignore it, but it keeps coming back every few hours. Needless to say that gets annoying fast.</p>
<p>Yesterday I finally said to hell with it and installed <a href="http://www.appbrain.com/search?q=rom+manager">ROM Manager</a>.  I made an immediate backup of my phone and then promptly installed <a href="http://www.cyanogenmod.com/">CyanogenMod 6</a> (including a wipe of all data from the phone, but I backed up everything with <a href="http://www.appbrain.com/app/com.keramidas.TitaniumBackup">Titanium Backup</a>. Hands down an amazing backup utility).  That went quite successfully other than having to flash a lower version of Clockwork Recovery and then back to the latest version of it (the recovery was refusing to flash the ROM).</p>
<p>Now I&#8217;ve been playing with <a href="http://www.droidforums.net/forum/chevyno1/">ChevyNo1&#8217;s kernels</a> (found in the premium version of ROM Manager).  So far I&#8217;ve gotten my phone to work with the Low Voltage 1ghz kernel and the Ultra Low Voltage 0.8 Ghz kernel.  Going to see how high of a clock speed I can push it up on the ultra low voltage and keep things stable.</p>
<p>Android has most certainly been one of my biggest passions this past year since I received my phone last November. <a href="http://code.google.com/p/tippytipper/">I love programming for it</a> (I have another app in the works too).  I love the <a href="http://www.forceclose.com/users/194/bryan-denny">communities</a> I <a href="http://www.reddit.com/r/Android/">am</a> a part <a href="http://android.stackexchange.com/users/10/bryan-denny">of</a>.  I wrote a couple of questions and answers to the Android StackExchange (it&#8217;s currently in private beta) about <a href="http://android.stackexchange.com/questions/1184/how-do-i-root-my-phone">rooting</a> and <a href="http://android.stackexchange.com/questions/1/ive-rooted-my-phone-now-what/13#13">what to do after rooting</a>.  I&#8217;ll cross post them here when that StackExchange goes public.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bryandenny.com/index.php/2010/09/19/rooting-and-flashing-cyanogen-mod-on-my-phone/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HOW TO ACCESS VERIZON TOWERS WITH MOTOROLA DROID (FOR FORMER ALLTEL CUSTOMERS)</title>
		<link>http://www.bryandenny.com/index.php/2010/09/19/how-to-access-verizon-towers-with-motorola-droid-for-former-alltel-customers/</link>
		<comments>http://www.bryandenny.com/index.php/2010/09/19/how-to-access-verizon-towers-with-motorola-droid-for-former-alltel-customers/#comments</comments>
		<pubDate>Sun, 19 Sep 2010 17:02:38 +0000</pubDate>
		<dc:creator>mandlar</dc:creator>
				<category><![CDATA[android]]></category>

		<guid isPermaLink="false">http://www.bryandenny.com/?p=1053</guid>
		<description><![CDATA[Note: I had written this a few months ago but just now got around to finally posting it.
So I had a weird problem in Mt Airy with my Motorola Droid. I could only receive 1x data signal. Well, at first I didn&#8217;t realize it was a problem because I knew that Verizon didn&#8217;t have any [...]]]></description>
			<content:encoded><![CDATA[<p><em>Note:</em> I had written this a few months ago but just now got around to finally posting it.</p>
<p>So I had a weird problem in Mt Airy with my Motorola Droid. I could only receive 1x data signal. Well, at first I didn&#8217;t realize it was a problem because I knew that Verizon didn&#8217;t have any towers in Mt Airy. But the weird thing was that my coworker (who also has a Motorola Droid) wasn&#8217;t even getting a data signal, period. He tried getting this problem explained to Verizon customer service, but they didn&#8217;t seem to understand his problem.</p>
<p>Now our IT guy also has a Motorola Droid. He told us that we needed to enable data roaming. This should be fine without incurring any charges so long as we remain in the US. My coworker did this and instantly went from no data signal to 3G. I did it and&#8230;. I was stuck at 1x still!  Wtf, right?</p>
<p>Well the only reason I could explain this is that my coworker has always been a Verizon customer and I used to be an Alltel customer who was merged over to Verizon. I still have an old grandfathered (and cheaper) Alltel plan (with the old MyCircle). But I&#8217;m a Verizon customer now so I should get access to all Verizon towers, right? Well I sent an email to Verizon customer service asking if this was the case with me being on an Alltel plan. I never heard back and didn&#8217;t feel like calling them either.</p>
<p>There was also no way I was going to pay more for a plan with more unnecessary minutes AND less features (cheapest Verizon plan doesn&#8217;t include Friends and Family). My brother then passed along some information from his coworker (who also owns a Motorola Droid) about PRLs.  PRLs are the lists of roaming towers that your phone knows about and connect to. Usually you can dial *228 to update your PRL.  Well, I look up my PRL number on my phone (Settings &gt; About Phone &gt; Status &gt; PRL Version), and sure enough it is a 3XXXX number (an Alltel PRL). I ask my coworker to look up his and it was a 5XXXX number (a Verizon PRL). So this explains it! My phone doesn&#8217;t have the Verizon towers in its PRL!</p>
<p>Unfortunately, dialing *228 kept my PRL in the 3XXXX range, so updating my towers via that method wasn&#8217;t going to work. But my brother&#8217;s coworker also shared a link to a tutorial to both backup a PRL on a phone and flash a new one onto it: <a href="http://www.droidforums.net/forum/rescue-squad-guides/40348-howto-flash-droid-any-network-prl.html">Flash the Droid to any network</a>.</p>
<p>Following that tutorial I found a 5XXXX PRL, flashed it on my phone, and then finally received 3G data in Mt Airy! Hooray!</p>
<p>So if you are a former Alltel customer and think you could be getting a better roaming data signal, then give this tutorial a whirl and see if it helps you out.  You&#8217;ll have to find your own PRL file because they are different for different regions of the United States.</p>
<p><strong>Disclaimer: try this at your own risk. I am not responsible for any damage you may do to your phone.</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.bryandenny.com/index.php/2010/09/19/how-to-access-verizon-towers-with-motorola-droid-for-former-alltel-customers/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>BOWMAN GRAY STADIUM RADIO FREQUENCIES FOR DRIVERS</title>
		<link>http://www.bryandenny.com/index.php/2010/08/26/bowman-gray-stadium-radio-frequencies-for-drivers/</link>
		<comments>http://www.bryandenny.com/index.php/2010/08/26/bowman-gray-stadium-radio-frequencies-for-drivers/#comments</comments>
		<pubDate>Fri, 27 Aug 2010 01:01:26 +0000</pubDate>
		<dc:creator>mandlar</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.bryandenny.com/?p=1070</guid>
		<description><![CDATA[My brother, his wife and I have been going to a lot of Bowman Gray Races this year.  Towards the end of the season, he started using his scanner to pick up on the chatter that the drivers and their spotters were having during the races.  So I ordered myself a scanner too, a Uniden [...]]]></description>
			<content:encoded><![CDATA[<p>My brother, his wife and I have been going to a lot of <a href="http://www.bowmangrayracing.com/">Bowman Gray Races</a> this year.  Towards the end of the season, he started using his scanner to pick up on the chatter that the drivers and their spotters were having during the races.  So I ordered myself a scanner too, a <a href="http://www.amazon.com/Uniden-BC72XLT-Handheld-Scanner-Black/dp/B0002QIBNK/ref=cm_cr_pr_product_top">Uniden BC72XLT</a>, which has an awesome close call capture feature that will pick up radio frequencies within about line of sight distance.  That feature alone beats scanning a frequency range if you are close enough to the action.</p>
<p>We&#8217;ve started compiling a list of drivers and their frequencies in a Google document that you can find here: <a href="http://www.bowmangrayfrequencies.com ">http://www.bowmangrayfrequencies.com</a> which is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/">Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License</a>.  That means you can use it, share it, do whatever you want with it so long as you attribute Scott Denny and don&#8217;t sell it.</p>
<p>You can also find my bank setup for my scanner here: <a href="http://bit.ly/BryansScanner">http://bit.ly/BryansScanner</a> which includes local radio frequencies for Stokes, Surry and Forsyth county, as well as the frequencies of the  Bowman Gray drivers broken down by both banks and sorted by driver number.  The spread sheet document is separated into three separate sheets called Local (banks for Stokes, Surry and Forsyth), Bowman Gray (banks for Officials, Stadium Stock, Street Stock, Sportsman, my favorites, and Modifieds) and Drivers (list of drivers and their frequencies sort by their car number for quick look-ups at the track).  My spread sheet document is also licensed under the same <a href="http://creativecommons.org/licenses/by-nc-sa/3.0/">Creative Commons license</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bryandenny.com/index.php/2010/08/26/bowman-gray-stadium-radio-frequencies-for-drivers/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>HOW TO NOT HANDLE EXCEPTIONS: GDI+ GENERIC EXCEPTION</title>
		<link>http://www.bryandenny.com/index.php/2010/06/09/how-to-not-handle-exceptions-gdi-generic-exception/</link>
		<comments>http://www.bryandenny.com/index.php/2010/06/09/how-to-not-handle-exceptions-gdi-generic-exception/#comments</comments>
		<pubDate>Wed, 09 Jun 2010 18:13:21 +0000</pubDate>
		<dc:creator>mandlar</dc:creator>
				<category><![CDATA[computers]]></category>

		<guid isPermaLink="false">http://www.bryandenny.com/index.php/2010/06/09/how-to-not-handle-exceptions-gdi-generic-exception/</guid>
		<description><![CDATA[A few months ago at work, I came across the worst possible exception I have ever seen thrown by a program:

A generic error occurred in GDI+

For those who don&#8217;t know, GDI+ is the graphics library for Windows that  is supported in .NET via the System.Drawing namespace.
So, what is so bad about this?  It doesn&#8217;t [...]]]></description>
			<content:encoded><![CDATA[<p>A few months ago at work, I came across the worst possible exception I have ever seen thrown by a program:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">A generic error occurred in GDI<span style="color: #339933;">+</span></pre></div></div>

<p>For those who don&#8217;t know, GDI+ is the graphics library for Windows that  is supported in .NET via the <em>System.Drawing </em>namespace.</p>
<p>So, what is so bad about this?  <strong>It doesn&#8217;t tell me why this error occurred!</strong>  There is no inner exception passed along.  If I don&#8217;t know the source of the problem that is causing the exception, then how can I prevent the exception from being thrown?  Heck, how can I even catch this exception and know what to do with it? Did the memory get full?  Was a file not found? Is a file being used by another process? Did the world blow up?  WHAT THE HELL HAPPENED?</p>
<p>After a <a href="http://stackoverflow.com/search?q=generic+excpetion+occurred+gdi">quick search</a> on <a href="http://stackoverflow.com/">StackOverflow</a> I came up with a number of <em>possible</em> sources of the problem, but at best <strong>we are guessing</strong> because the exception tell us <strong>absolutely nothing!</strong></p>
<ul>
<li><a href="http://stackoverflow.com/questions/1772083/when-drawing-an-image-system-runtime-interopservices-externalexception-a-generi">The stream or file used for the image or bitmap cannot be closed before the image or bitmap is closed</a> due to a <a href="http://support.microsoft.com/Default.aspx?id=814675">dependency between the image/bitmap and the stream/file that it was constructed from</a></li>
<li><a href="http://stackoverflow.com/questions/2259958/please-help-me-find-a-solution-for-a-generic-error-occurred-in-gdi">There could be a read/write permission failure on the directory that you saving the image to </a></li>
<li><a href="http://stackoverflow.com/questions/997902/a-generic-error-occurred-in-gdi-when-saving-bitmap-object-as-jpeg-c">Bitmap doesn&#8217;t support 8-bit grayscale</a></li>
<li><a href="http://stackoverflow.com/questions/1044085/a-generic-error-occurred-in-gdi">It could be some sort of File IO underlying exception being thrown</a></li>
</ul>
<p>And the list goes on and on with further suggestions.  The thing that baffled me is that my GDI+ exception occurs <em>randomly</em>.  It doesn&#8217;t happen every single time I run my GDI+ functions.  I <strong>think</strong> it has to do with some sort of file lock going on, but honestly, <strong>I have no idea because the GDI+ generic exception is a worthless piece of information.</strong>  I re-wrote my code to ensure that all file handles are closed after being used.  I even tried copying the bitmap created from a file into a <strong>NEW </strong>bitmap to remove the dependency between the bitmap and the original file.  Nothing.</p>
<p>Personally, I would love to meet the developer who thought swallowing up the inner exceptions was a fabulous idea and reprimand the hell out of him or her. And why hasn&#8217;t Microsoft updated the library with better exceptions?</p>
<p>So, the moral of the story folks is to don&#8217;t write code like this:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">try</span>
<span style="color: #009900;">&#123;</span>
     <span style="color: #666666; font-style: italic;">// one or a million lines of code</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">Exception</span> ex<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
     <span style="color: #000000; font-weight: bold;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Exception</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;A generic error occured in [program name]!&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.bryandenny.com/index.php/2010/06/09/how-to-not-handle-exceptions-gdi-generic-exception/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>WHAT I LEARNED FROM WRITING MY FIRST ANDROID APPLICATION</title>
		<link>http://www.bryandenny.com/index.php/2010/05/25/what-i-learned-from-writing-my-first-android-application/</link>
		<comments>http://www.bryandenny.com/index.php/2010/05/25/what-i-learned-from-writing-my-first-android-application/#comments</comments>
		<pubDate>Tue, 25 May 2010 06:48:24 +0000</pubDate>
		<dc:creator>mandlar</dc:creator>
				<category><![CDATA[android]]></category>

		<guid isPermaLink="false">http://www.bryandenny.com/index.php/2010/05/25/what-i-learned-from-writing-my-first-android-application/</guid>
		<description><![CDATA[I just recently released my first Android application, Tippy Tipper, a tipping calculator.  From writing this app I learned a number of things as a new Android developer and decided that I should write down and share some of these tips and tricks for other new Android developers who might come across them.  [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.bryandenny.com/index.php/2010/05/24/tippy-tipper-the-tip-calculator-released/">I just recently released my first Android application</a>, Tippy Tipper, a tipping calculator.  From writing this app I learned a number of things as a new Android developer and decided that I should write down and share some of these tips and tricks for other new Android developers who might come across them.  My application is open source and you can find the source code at its Google Code project site <a href="http://code.google.com/p/tippytipper/">here</a>.  My hope is that someone else can benefit and learn from what I have gone through these past couple of months.</p>
<p><strong>Choosing an application to build<br />
</strong></p>
<p>What should you write?  Well, that is up to you, but if this is your first Android application then my recommendation is to choose something <strong>simple</strong>. You may know Java, but you do not know the Android framework.  Gently ease yourself into the Android framework instead of creating a lot of frustration and headaches as you attempt to do something overly complex when you do not even grasp how layouts work.  I recommend creating an application that you should be able to complete within a month or two at most, because once you complete this simple application you will have a sense of accomplishment which will encourage you to build something even more difficult and challenging.  This positive reinforcement will keep you from burning out early in frustration. You essentially want to aim your application a couple of notches beyond the <a href="http://developer.android.com/guide/tutorials/hello-world.html">Hello World app</a>.</p>
<p>Personally, I chose a tip calculator for a few key reasons:</p>
<ul>
<li>Tip calculators are common, so there are a lot of examples out there.  I can learn from other people&#8217;s UIs and see how I can make mine <em>better</em></li>
<li>I wasn&#8217;t happy with any of the available tip calculators on the market</li>
<li>I can use it, nearly every day.  Therefore, I can <a href="http://www.joelonsoftware.com/articles/fog0000000012.html">dog food</a> my app</li>
<li>It is <strong>simple</strong> and covers most of the Android basics: 20 buttons (event handling), preference, multiple activities, etc.</li>
</ul>
<p><strong>How I designed my application</strong></p>
<p>My approach to my Android app was to try and fit it into a MVC (Model-View-Controller) design pattern. In Android, the <strong>Activity </strong>classes act as both the View and the Controller.  It behaves as a View because it renders the layouts to the screen and it behaves as a Controller by adding event handlers (onClick(), etc.) to objects in the View.  The last piece is the Model, which in my case is a completely independent service (not an Android service, I simply am calling it a service in general) that provides functions to access and manipulate data (calculate tip, get the tip amount, split the bill, etc.).  My service is stand alone and therefore easily unit tested by <a href="http://www.junit.org/">JUnit</a>.  For the most part, the UI of my app simply calls functions found in my service and then updates the View with new information from my service.</p>
<p><strong>MVC Example</strong></p>
<p>On the first main activity of the application (the keypad screen) we have an EditBox that shows the current entered BillAmount and some buttons (0-9) to append to the BillAmount, delete the last digit of the BillAmount, or to continue to the next Activity.</p>
<p><img src="http://sphotos.ak.fbcdn.net/hphotos-ak-ash1/hs529.ash1/31063_811375040778_2717476_46077650_2014248_n.jpg" alt="" height="360" width="202"/></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre class="java" style="font-family:monospace;">...
<span style="color: #339933;">&lt;</span>EditText
     android<span style="color: #339933;">:</span>id<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;@+id/txt_amount&quot;</span>
     style<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;@style/BillAmountEditText&quot;</span><span style="color: #339933;">/&gt;</span>
...
<span style="color: #339933;">&lt;</span>Button
     android<span style="color: #339933;">:</span>id<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;@+id/btn_five&quot;</span>
     style<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;@style/CalculatorButton&quot;</span>
     android<span style="color: #339933;">:</span>text<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;5&quot;</span> <span style="color: #339933;">/&gt;</span>
...</pre></td></tr></table></div>

<p>When you click the &#8220;5&#8243; button, the following event handler is called:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> onCreate<span style="color: #009900;">&#40;</span>Bundle savedInstanceState<span style="color: #009900;">&#41;</span> 
<span style="color: #009900;">&#123;</span>
...
     <span style="color: #003399;">View</span> btn_five <span style="color: #339933;">=</span> findViewById<span style="color: #009900;">&#40;</span>R.<span style="color: #006633;">id</span>.<span style="color: #006633;">btn_five</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
     btn_five.<span style="color: #006633;">setOnClickListener</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> OnClickListener<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
     <span style="color: #009900;">&#123;</span>
          <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> onClick<span style="color: #009900;">&#40;</span><span style="color: #003399;">View</span> v<span style="color: #009900;">&#41;</span>
          <span style="color: #009900;">&#123;</span>
               AddBillAmount<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;5&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
          <span style="color: #009900;">&#125;</span>
     <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
...
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">void</span> AddBillAmount<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> number<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
     TippyTipperApplication appState <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>TippyTipperApplication<span style="color: #009900;">&#41;</span><span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">getApplication</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
     appState.<span style="color: #006633;">service</span>.<span style="color: #006633;">AppendNumberToBillAmount</span><span style="color: #009900;">&#40;</span>number<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
     BindData<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>The AddBillAmount gets the instance of the service (more about this below, see <strong>Global Singleton</strong>) and calls the service&#8217;s AppendNumberToBillAmount():</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> AppendNumberToBillAmount<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> number<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
     <span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>BillEntry.<span style="color: #006633;">length</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&lt;</span> <span style="color: #cc66cc;">15</span><span style="color: #009900;">&#41;</span>
     <span style="color: #009900;">&#123;</span>
          BillEntry <span style="color: #339933;">=</span> BillEntry <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;&quot;</span> <span style="color: #339933;">+</span> number<span style="color: #339933;">;</span>
     <span style="color: #009900;">&#125;</span>
     <span style="color: #000066; font-weight: bold;">double</span> amount <span style="color: #339933;">=</span> <span style="color: #003399;">Double</span>.<span style="color: #006633;">valueOf</span><span style="color: #009900;">&#40;</span>BillEntry<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
     amount <span style="color: #339933;">=</span> amount <span style="color: #339933;">/</span> <span style="color: #cc66cc;">100</span><span style="color: #339933;">;</span>
&nbsp;
     BillAmount <span style="color: #339933;">=</span> amount<span style="color: #339933;">;</span>
     BillAmountBeforeTax <span style="color: #339933;">=</span> BillAmount<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Which appends the number to the end of our service&#8217;s BillEntry string and then converts it into a double amount which is saved to BillAmount and BillAmountBeforeTax.  Now the Controller will call BindData (ASP.NET term; I&#8217;m a C#/ASP.NET developer by day) which will refresh our View with the service&#8217;s updated BillAmount:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">void</span> BindData<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
      TippyTipperApplication appState <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>TippyTipperApplication<span style="color: #009900;">&#41;</span><span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">getApplication</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      EditText txt_amount <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>EditText<span style="color: #009900;">&#41;</span>findViewById<span style="color: #009900;">&#40;</span>R.<span style="color: #006633;">id</span>.<span style="color: #006633;">txt_amount</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      txt_amount.<span style="color: #006633;">setText</span><span style="color: #009900;">&#40;</span>appState.<span style="color: #006633;">service</span>.<span style="color: #006633;">GetBillAmount</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Viola! A simple MVC pattern put to good use.  Now we can easily take out Model/service and apply unit testing to it:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="java" style="font-family:monospace;">@Test <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> AppendNumberToBillAmount<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
     TipCalculatorService service <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> TipCalculatorService<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
     service.<span style="color: #006633;">AppendNumberToBillAmount</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;1&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
     assertTrue<span style="color: #009900;">&#40;</span>service.<span style="color: #006633;">GetBillAmount</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">equals</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;$0.01&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p><strong>Global Singleton</strong></p>
<p>One of the first problems I had with my Model was always having a singleton of it available.  An important thing to note with Activities is that <strong>they are destroyed and re-created </strong>whenever the user rotates their phone from vertical to landscape or vice-versa.  Therefore, if you declare a singleton inside of you Activity, then it will be gone when the Activity is re-created. The workaround for this is to instead create the singleton at the Application layer, making it globally accessible to ALL activities.</p>
<p>First you have to create a class that extends Application and contains your singleton:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> TippyTipperApplication <span style="color: #000000; font-weight: bold;">extends</span> Application 
<span style="color: #009900;">&#123;</span>     
      <span style="color: #000000; font-weight: bold;">public</span> TipCalculatorService service <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> TipCalculatorService<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>As seen earlier, you now simply have to get an instance of the Application in order to access your service:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="java" style="font-family:monospace;">TippyTipperApplication appState <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>TippyTipperApplication<span style="color: #009900;">&#41;</span><span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">getApplication</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
appState.<span style="color: #006633;">service</span>.<span style="color: #006633;">AppendNumberToBillAmount</span><span style="color: #009900;">&#40;</span>number<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p><strong>Using Preferences</strong></p>
<p>Creating the preference activity is perhaps one of the easiest things to do in Android.  You simply have to create a <a href="http://code.google.com/p/tippytipper/source/browse/trunk/Tippy%20Tipper/res/xml/settings.xml">layout</a> and attach the Layout to a class that extends PreferenceActivity:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Settings <span style="color: #000000; font-weight: bold;">extends</span> PreferenceActivity
<span style="color: #009900;">&#123;</span>
     @Override
     <span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000066; font-weight: bold;">void</span> onCreate<span style="color: #009900;">&#40;</span>Bundle savedInstanceState<span style="color: #009900;">&#41;</span>
     <span style="color: #009900;">&#123;</span>
          <span style="color: #000000; font-weight: bold;">super</span>.<span style="color: #006633;">onCreate</span><span style="color: #009900;">&#40;</span>savedInstanceState<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
          addPreferencesFromResource<span style="color: #009900;">&#40;</span>R.<span style="color: #006633;">xml</span>.<span style="color: #006633;">settings</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
     <span style="color: #009900;">&#125;</span>
&nbsp;
     <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">int</span> getDefaultTipPercentage<span style="color: #009900;">&#40;</span><span style="color: #003399;">Context</span> context<span style="color: #009900;">&#41;</span>
     <span style="color: #009900;">&#123;</span>
          <span style="color: #000000; font-weight: bold;">return</span> PreferenceManager.<span style="color: #006633;">getDefaultSharedPreferences</span><span style="color: #009900;">&#40;</span>context<span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getInt</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;default_tip_percentage&quot;</span>, <span style="color: #cc66cc;">15</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
     <span style="color: #009900;">&#125;</span>
....
&nbsp;
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>So long as you don&#8217;t need a custom dialog, then Android handles the saving/loading of dialog values for you in the background.  In order to retrieve the preference value:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">double</span> defaultTipPercentage <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">double</span><span style="color: #009900;">&#41;</span>Settings.<span style="color: #006633;">getDefaultTipPercentage</span><span style="color: #009900;">&#40;</span>getBaseContext<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>But what if you do need to have a custom preference dialog?</p>
<p><strong>Creating and using a custom preference dialog</strong></p>
<p>For setting the default tip percentage values, I wanted to use the SeekBar similar to how it is done on the Activity in which you choose a tip percentage:  </p>
<p><img src="http://sphotos.ak.fbcdn.net/hphotos-ak-ash1/hs529.ash1/31063_811375050758_2717476_46077652_2033629_n.jpg" alt="" height="360" width="202" /></p>
<p>No such thing exists in the Android SDK so I either had to create my own or see if someone had already made their own.  Thankfully, <a href="http://android.hlidskialf.com/blog/code/android-seekbar-preference">someone had already made a SeekBar preference</a>.</p>
<p>The key important thing to rolling your own custom preference dialog is knowing how to get your stored value:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>shouldPersist<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
     mValue <span style="color: #339933;">=</span> getPersistedInt<span style="color: #009900;">&#40;</span>mDefault<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>And updating your stored value:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>shouldPersist<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
      persistInt<span style="color: #009900;">&#40;</span>value <span style="color: #339933;">+</span> mMin<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p><strong>Extending preference with min value (How to add attributes to your widgets)</strong></p>
<p>When I originally used the SeekBarPreference, I was also using it for the preference dialog of setting the default number of people to split the bill by. This means that the SeekBar has to go from 2 to max_value, instead of 0 to max_value. So I had to extend the SeekBarPreference to allow this.  My first problem was that the Android name space does not have an android:min defined, only an android:max.</p>
<p>I have to create a min attribute in a res/values/attr.xml file:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>resources<span style="color: #339933;">&gt;</span>
     <span style="color: #339933;">&lt;</span>declare<span style="color: #339933;">-</span>styleable name<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;SeekBarPreference&quot;</span><span style="color: #339933;">&gt;</span>
          <span style="color: #339933;">&lt;</span>attr name<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;min&quot;</span> format<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;string&quot;</span> <span style="color: #339933;">&gt;</span>
     <span style="color: #339933;">&lt;/</span>declare<span style="color: #339933;">-</span>styleable<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;/</span>resources<span style="color: #339933;">&gt;</span></pre></td></tr></table></div>

<p>Then I have to reference the namespace in the Preference layout:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>PreferenceScreenxmlns<span style="color: #339933;">:</span>android<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;http://schemas.android.com/apk/res/android&quot;</span>
xmlns<span style="color: #339933;">:</span>app<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;http://schemas.android.com/apk/res/net.mandaria.tippytipper&quot;</span><span style="color: #339933;">&gt;</span>
     <span style="color: #339933;">&lt;</span>PreferenceCategory android<span style="color: #339933;">:</span>title<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;Tipping Options&quot;</span><span style="color: #339933;">&gt;</span>
          <span style="color: #339933;">&lt;</span>net.<span style="color: #006633;">mandaria</span>.<span style="color: #006633;">tippytipper</span>.<span style="color: #006633;">preferences</span>.<span style="color: #006633;">SeekBarPreference</span>
          android<span style="color: #339933;">:</span>key<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;default_tip_percentage&quot;</span>
          android<span style="color: #339933;">:</span>title<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;Default Tip Percentage&quot;</span>
          android<span style="color: #339933;">:</span>summary<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;Percentage to tip by default&quot;</span>
          android<span style="color: #339933;">:</span>dialogMessage<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;Percentage to tip by default&quot;</span>
          android<span style="color: #339933;">:</span>defaultValue<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;15&quot;</span>
          android<span style="color: #339933;">:</span>text<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;%&quot;</span>
          android<span style="color: #339933;">:</span>max<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;40&quot;</span>
          app<span style="color: #339933;">:</span>min<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;0&quot;</span>
     <span style="color: #339933;">/&gt;</span>
...</pre></td></tr></table></div>

<p>Finally, to get the min value programmatically:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">String</span> appns<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;http://schemas.android.com/apk/res/net.mandaria.tippytipper&quot;</span><span style="color: #339933;">;</span>
TypedArray a <span style="color: #339933;">=</span> context.<span style="color: #006633;">obtainStyledAttributes</span><span style="color: #009900;">&#40;</span>attrs, R.<span style="color: #006633;">styleable</span>.<span style="color: #006633;">SeekBarPreference</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
mMin <span style="color: #339933;">=</span> a.<span style="color: #006633;">getInt</span><span style="color: #009900;">&#40;</span>R.<span style="color: #006633;">styleable</span>.<span style="color: #006633;">SeekBarPreference_min</span>, <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Note the usage of the TypedArray against the attrs.xml file created above.  This is different than grabbing android:max programmatically (I could simply be missing something above, but it works):</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">String</span> androidns<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;http://schemas.android.com/apk/res/android&quot;</span><span style="color: #339933;">;</span>
mMax <span style="color: #339933;">=</span> attrs.<span style="color: #006633;">getAttributeIntValue</span><span style="color: #009900;">&#40;</span>androidns,<span style="color: #0000ff;">&quot;max&quot;</span>, <span style="color: #cc66cc;">100</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p><strong>Android is missing the NumberPicker widget in the SDK</strong></p>
<p>For whatever reason, the NumberPicker widget is not publicly available to developers.  It is there, but it is hidden in the internals of Android and I didn&#8217;t want to access private APIs by finding it by reflection.  Instead I found it in the Android source code and was about to pull it out when I found that <a href="http://www.quietlycoding.com/?p=5">someone else had already beat me to it</a>.</p>
<p>I really do not understand why this widget is not publicly available, because forcing a user to only select an integer value is very nice (with the ability to enter the integer with the +/- buttons or typing it in).</p>
<p>I used the NumberPicker in my own custom dialog preference called <a href="http://code.google.com/p/tippytipper/source/browse/trunk/Tippy%20Tipper/src/net/mandaria/tippytipper/preferences/DecimalPreference.java">DecimalPreference</a>:</p>
<p><img src="http://sphotos.ak.fbcdn.net/hphotos-ak-snc3/hs589.snc3/31063_812098451058_2717476_46111927_877009_n.jpg" /></p>
<p><strong>Using LDPI, MDPI, and HDPI with Android 1.5+ (How to set a min API and have a higher target API)</strong></p>
<p>In order to get my app&#8217;s launcher icon to work with multiple DPIs (LDPI, MDPI, and HDPI), a feature of Android 1.6+, and to have my app still work on Android 1.5 phones, I had to set the app&#8217;s minSDK value to 1.5 and set the targetSDK to 1.6:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>uses<span style="color: #339933;">-</span>sdk android<span style="color: #339933;">:</span>minSdkVersion<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;3&quot;</span>  android<span style="color: #339933;">:</span>targetSdkVersion<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;4&quot;</span> <span style="color: #339933;">/&gt;</span></pre></td></tr></table></div>

<p><strong><br />
Applications with multiple versions (free / paid / donate)</strong></p>
<p>If you plan on having more than one version of your app, then it must be noted that they MUST have different package names on the Android Market.  I did not realize this until I was ready to release and had to spend about an hour or so creating a Donate branch in my SVN and renaming the package references everywhere from &#8220;net.mandaria.*&#8221; to &#8220;net.mandaria.tippytipper.*&#8221; and &#8220;net.mandaria.tippytipperdonate.*&#8221;</p>
<p>I feel like my Donate branch isn&#8217;t the best idea.  For every release I will have to merge the trunk into the Donate branch and rename the package from &#8220;net.mandaria.tippytipper.*&#8221; to &#8220;net.mandaria.tippytipperdonate.*&#8221; and I cannot think of a better way to do it.  Any suggestions?</p>
<p><strong>Reporting error handling</strong></p>
<p>One thing I have yet to implement is reporting any errors thrown in the app by users to me.  The <a href="http://code.google.com/p/android-remote-stacktrace/">Android Remote Stacktrace</a> project looks promising, but I would have to enable internet privileges in my app when it does not need them otherwise (how acceptable is that?).  Or I could create an e-mail intent on errors (but that is less anonymous and they may be less willing to submit the report).  Any thoughts on this?</p>
<p><strong>PayPal API == Better way to donate?</strong></p>
<p>PayPal just recently <a href="https://www.x.com/community/ppx/xspaces/mobile/mep">released</a> an Android API for making PayPal transactions inside of apps.  This could be an alternative way to collect donations for an open source app instead of (or in addition to) dealing with a second donate version of the app.  But it could also potentially break the Developer&#8217;s Distribution Agreement:</p>
<blockquote><p>3.3  You may also choose to distribute Products for free.  If the  Product is free, you will not be charged a Transaction Fee.  You may not  collect future charges from users for copies of the Products that those  users were initially allowed to download for free.  This is not  intended to prevent distribution of free trial versions of the Product  with an “upsell” option to obtain the full version of the Product:  Such  free trials for Products are encouraged.  However, if you want to  collect fees after the free trial expires, <strong>you must collect all fees for  the full version of the Product through the Payment Processor on the  Market</strong>.  In this Agreement, “free” means there are no charges or fees of  any kind for use of the Product.   All fees received by Developers for  Products distributed via the Market must be processed by the Market’s  Payment Processor.</p></blockquote>
<p>Technically, the donation is not required for use of the Product as it is still provided 100% free.  But it isn&#8217;t being processed by Google&#8217;s Payment Processor.  So I do not know whether or not to explore this route.</p>
<p><strong>Conclusion</strong></p>
<p>I&#8217;m very excited about Android.  I&#8217;m very happy to now be a part of its developer community.  I&#8217;m still very new at it and am learning something new every day.  I hope that these comments of mine help someone else, or if any of them are totally wrong, please feel free to correct me.  I appreciate all the constructive criticism I can get to improve both my application and myself as a developer.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bryandenny.com/index.php/2010/05/25/what-i-learned-from-writing-my-first-android-application/feed/</wfw:commentRss>
		<slash:comments>23</slash:comments>
		</item>
		<item>
		<title>TIPPY TIPPER: THE TIP CALCULATOR RELEASED</title>
		<link>http://www.bryandenny.com/index.php/2010/05/24/tippy-tipper-the-tip-calculator-released/</link>
		<comments>http://www.bryandenny.com/index.php/2010/05/24/tippy-tipper-the-tip-calculator-released/#comments</comments>
		<pubDate>Tue, 25 May 2010 01:01:23 +0000</pubDate>
		<dc:creator>mandlar</dc:creator>
				<category><![CDATA[android]]></category>

		<guid isPermaLink="false">http://www.bryandenny.com/index.php/2010/05/24/tippy-tipper-the-tip-calculator-released/</guid>
		<description><![CDATA[After a couple of months of diving into the programming world of Android, I have finally released my first Android phone application! Tippy Tipper is a simple and open source Android Tipping Calculator. It is the result of my first experience with learning Android and I have made it an open source project so that [...]]]></description>
			<content:encoded><![CDATA[<p>After a couple of months of diving into the programming world of Android, I have finally released my first Android phone application! Tippy Tipper is a simple and <strong>open source </strong>Android Tipping Calculator. It is the result of my first experience with learning Android and I have made it an open source project so that hopefully other new Android programmers can use it as an example application to learn from. Since it is open source, it is completely <strong>free </strong>(no ads) and donations are always welcome (although I honestly do not expect many).</p>
<p>Some <strong>features </strong>of Tippy Tipper include:</p>
<ul>
<li>Enter bill via custom keypad</li>
<li>Select tip by slider or  three configurable buttons</li>
<li>Real time calculations</li>
<li>Round  up or down by tip or total</li>
<li>Can split the bill</li>
<li>Can  optionally exclude a tax rate from the bill</li>
</ul>
<p>I still have a <a href="http://code.google.com/p/tippytipper/issues/list">list of things to do</a> with the app, so I will continue to work on it as time allows (but I am planning on starting another app soon, most likely a game).  I am also open for any new feature requests and I am sure there will also be bug reports.</p>
<p><strong>Supported:</strong> The app is built against the 1.6 API, but should run on any phone with Android 1.5 or greater.  I primarily tested the app on my Motorola Droid, but I also tested it against other resolutions and DPIs using the Android emulator.</p>
<p><strong>Why:</strong> I made this app because I did not want to get in over my head with an impossible first project while learning Android. I wanted something simple that I know I could do in my spare time.  That and I thought I could make a better tipping calculator than the other ones on the Android Market.  Plus, I plan on using it when I go out to eat. <a href="http://www.joelonsoftware.com/articles/fog0000000012.html">Dog fooding</a> at its finest!</p>
<p><strong>Download: </strong>You can find the app in the market by scanning the following QR code or you can obtain the source code from the <a href="http://code.google.com/p/tippytipper/">project&#8217;s Google Code site</a>.</p>
<p><img src="http://sphotos.ak.fbcdn.net/hphotos-ak-snc3/hs569.snc3/31063_811446901768_2717476_46081594_613147_n.jpg" /></p>
<p><strong>Screenshots:</strong></p>
<p>Vertical layouts:</p>
<p><img src="http://sphotos.ak.fbcdn.net/hphotos-ak-ash1/hs529.ash1/31063_811375040778_2717476_46077650_2014248_n.jpg" height="360" width="202" /> <img src="http://sphotos.ak.fbcdn.net/hphotos-ak-ash1/hs529.ash1/31063_811375050758_2717476_46077652_2033629_n.jpg" height="360" width="202" /> <img src="http://hphotos-snc3.fbcdn.net/hs569.snc3/31063_811375065728_2717476_46077654_4298708_n.jpg" height="360" width="202" /> <img src="http://hphotos-snc3.fbcdn.net/hs589.snc3/31063_811375070718_2717476_46077655_2076851_n.jpg" height="360" width="202" /></p>
<p>Horizontal layouts:</p>
<p><img src="http://sphotos.ak.fbcdn.net/hphotos-ak-ash1/hs529.ash1/31063_811375035788_2717476_46077649_3715423_n.jpg" height="202" width="360" /> <img src="http://sphotos.ak.fbcdn.net/hphotos-ak-snc3/hs589.snc3/31063_811375045768_2717476_46077651_3200234_n.jpg" height="202" width="360" /> <img src="http://sphotos.ak.fbcdn.net/hphotos-ak-ash1/hs529.ash1/31063_811375055748_2717476_46077653_2449769_n.jpg" height="202" width="360" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.bryandenny.com/index.php/2010/05/24/tippy-tipper-the-tip-calculator-released/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

