<?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:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-5645807251540741658</atom:id><lastBuildDate>Thu, 15 Jul 2010 14:06:18 +0000</lastBuildDate><title>&gt;140</title><description>For &amp;lt;=140 see twitter.com/burnayev</description><link>http://blog.burnayev.com/</link><managingEditor>noreply@blogger.com (Borys Burnayev)</managingEditor><generator>Blogger</generator><openSearch:totalResults>122</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/burnayev" /><feedburner:info uri="burnayev" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>burnayev</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5645807251540741658.post-280354971100677756</guid><pubDate>Fri, 02 Jul 2010 12:34:00 +0000</pubDate><atom:updated>2010-07-02T09:13:35.272-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">android</category><title>EVO vs Droid Becomes Sprint vs Verizon (and Verizon Wins)</title><description>... And the day came when I found myself without any kind of mobile connectivity, unable to make a simple phone call. For those who wonder, it feels like being out without glasses. Or pants.&lt;br /&gt;&lt;br /&gt;The long story short, by noon I was signing papers at a Verizon Wireless joint in a mall.&lt;br /&gt;&lt;br /&gt;During the months that preceded such an unprecedented event I periodically harassed Verizon and Sprint representatives that can be found in quantities in my whereabouts. I would routinely shake one of my Google-dispensed phones before their faces and ask them for the best deal in town.&lt;br /&gt;&lt;br /&gt;Surprisingly, it didn't play out with Sprint. Wherever I went I got the same lame answer - Google or Shmoogle, you need a 2-year contract with us.&lt;br /&gt;&lt;br /&gt;It was hard for me to imagine myself having quite a few free and unlocked phones and being on a long term contract with a carrier at the same time.&lt;br /&gt;&lt;br /&gt;Two weeks forward. I'm enjoying my good ol' Droid and writing this blog post. I'm on month-to-month contract with Verizon free to leave any time. My Picasa Web Albums are in the gallery again and I can reliably type complex passwords.&lt;br /&gt;&lt;br /&gt;Is EVO better than Droid? In &lt;a href="http://blog.burnayev.com/2010/06/evo-vs-droid.html"&gt;some respects&lt;/a&gt;. Is it worth the 2-year commitment to Sprint provided you have options? I don't think so.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5645807251540741658-280354971100677756?l=blog.burnayev.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/burnayev/~4/dvhycJ_An3Y" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/burnayev/~3/dvhycJ_An3Y/evo-vs-droid-becomes-sprint-vs-verizon.html</link><author>noreply@blogger.com (Borys Burnayev)</author><thr:total>1</thr:total><feedburner:origLink>http://blog.burnayev.com/2010/07/evo-vs-droid-becomes-sprint-vs-verizon.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5645807251540741658.post-7307914151228771698</guid><pubDate>Thu, 03 Jun 2010 17:10:00 +0000</pubDate><atom:updated>2010-06-03T15:25:22.540-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">android</category><title>EVO vs Droid</title><description>For the past few weeks I've been enjoying HTC EVO 4G that Google lightheartedly passed out to all 5000+ participants of Google I/O &lt;span style="font-style: italic;"&gt;during&lt;/span&gt; the conference.  I've been comparing it with Motorola Droid that Google carelessly passed out to all 5000+ participants of Google I/O &lt;span style="font-style: italic;"&gt;before&lt;/span&gt; the conference.&lt;br /&gt;&lt;br /&gt;For those who reads the news from the bottom, I'm strongly considering the switch to Sprint.&lt;br /&gt;&lt;br /&gt;The nitty-gritty comparison details are below.&lt;br /&gt;&lt;br /&gt;Call Quality&lt;br /&gt;I use Google Voice and it works well on both phones.&lt;br /&gt;&lt;br /&gt;Coverage&lt;br /&gt;No substantial difference in the parts of Washington, DC area where I dwell.&lt;br /&gt;&lt;br /&gt;4G&lt;br /&gt;For many, me included, it's a marketing gimmick as 4G coverage is not widely available yet.&lt;br /&gt;&lt;br /&gt;3G&lt;br /&gt;Same speed on average.&lt;br /&gt;&lt;br /&gt;Operating System and User Interface&lt;br /&gt;Droid comes with a stock 2.1 Android while EVO rocks HTC Sense. I found Sense to be buggy(er) that the stock version. The most annoying thing is EVO routinely "forgets" it has an SD card, the only workaround being to reboot the phone.&lt;br /&gt;&lt;br /&gt;The stock Android 2.1 Gallery application comes with Picasa integration baked in so that you can access your Picasa albums right from the Gallery. Sense's gallery replaces that with Flickr and kinda breaks the smooth Google experience.&lt;br /&gt;&lt;br /&gt;The built-in Sense widgets look nice and work as expected most of the time. Some of them, such as Weather widget, lack functionality while others, like Calendar, don't behave as expected.&lt;br /&gt;&lt;br /&gt;The integrated Clock application that includes the timer and the stopwatch among other things is definitely a plus.&lt;br /&gt;&lt;br /&gt;7 home screens of Sense are something that I've yet to feel a need for but the home screen overview via pinch zoom-out is a nifty feature that I use a lot for no reason.&lt;br /&gt;&lt;br /&gt;More often than not I wish I could replace Sense with the stock Android and remove much of the bloatware that comes pre-installed on the phone.&lt;br /&gt;&lt;br /&gt;Hardware&lt;br /&gt;Even through EVO boasts 1GHz processor (vs Droid's 600 MHz one) I don't see eye-popping difference in the performance of the two phones under my typical usage pattern.&lt;br /&gt;&lt;br /&gt;8 megapixel camera with 720p recording works as advertised and is probably the best camera I've seen on a smartphone. Auto-focus is fast and in many cases &lt;a href="http://picasaweb.google.com/lh/photo/S_ahbmUEJKR_nL_i7ocJYg?feat=directlink"&gt;focuses correctly&lt;/a&gt; in a wide range of distances. With my Droid I have to manually select macro mode for close-ups.&lt;br /&gt;&lt;br /&gt;720p video &lt;a href="http://www.youtube.com/watch?v=En0oFEu_S9M"&gt;looks good&lt;/a&gt; for a smartphone and can be viewed in HD on YouTube with a fair amount of pleasure. The 3gp format is problematic for non-linear editing but QuickTime Pro does the basic job of cutting and gluing.&lt;br /&gt;&lt;br /&gt;Overall I find the camera to be one of the most compelling reasons for using EVO.&lt;br /&gt;&lt;br /&gt;Screen&lt;br /&gt;EVO's 4.3" screen is gorgeous. Large and clear. Easy to tap on correctly. You'll enjoy it.&lt;br /&gt;&lt;br /&gt;Keyboard&lt;br /&gt;We all know that EVO doesn't have a physical keyboard. It happened to be less of a problem than I originally thought though. One of the side advantages of a big screen is you can tap-type on it with fewer mistakes reasonably fast. The virtual keyboard that comes with Sense is tangibly better that the stock Android one. Auto-correction works well in many cases. You have to look at what you "typed" though - sometimes you are up to surprises.&lt;br /&gt;&lt;br /&gt;The auto-correction somehow does not apply to search and some other input-heavy areas and there I found a lot of room for improvement of my thumb-typing skills.&lt;br /&gt;&lt;br /&gt;The Looks&lt;br /&gt;EVO is an eye-candy. Designed after iPhone, it's basically perfect.&lt;br /&gt;&lt;br /&gt;Conclusion&lt;br /&gt;I'm sitting on the fence and looking at EVO's territory. Two more weeks to go before the final decision is to be made.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5645807251540741658-7307914151228771698?l=blog.burnayev.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/burnayev/~4/ipnPUdYMM_o" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/burnayev/~3/ipnPUdYMM_o/evo-vs-droid.html</link><author>noreply@blogger.com (Borys Burnayev)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.burnayev.com/2010/06/evo-vs-droid.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5645807251540741658.post-2568632690273067985</guid><pubDate>Mon, 24 May 2010 22:39:00 +0000</pubDate><atom:updated>2010-05-24T18:39:00.287-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">google</category><category domain="http://www.blogger.com/atom/ns#">android</category><title>Google I/O Aftermath</title><description>Last week I was fortunate to attend the Google I/O event in San Fransisco. Now when the emotions are settled down there's a chance to have a sober look at what happened and what effect it might have on us and the software industry.&lt;br /&gt;&lt;br /&gt;The central place at the conference - its "booth" was located right in the middle of the second floor - took Android. Coincidentally the pivot of the second day keynote was also Android. At 100,000 new device activations a day the platform is no longer something to sneeze at. Android 2.2 Froyo was one of the few things that were announced &lt;span style="font-style: italic;"&gt;and &lt;/span&gt;released during the event.&lt;br /&gt;&lt;br /&gt;Another manifestation of the growing strength of Android is the fact that Google bets its new Google TV initiative on it. Yes, all those computers that we customarily call TVs are going to run the operating system with the green robot logo.&lt;br /&gt;&lt;br /&gt;What was strangely missing from the keynotes was Chrome OS. My reading is either it's totally not ready for anything (though they did screw up the Google TV demo with a straight face no problem) or there's a change in the wind blowing high in the executive ranks. After Google Phone initiative was suddenly dropped I wouldn't be too surprised to see Chrome OS going out of business and Android taking its place.&lt;br /&gt;&lt;br /&gt;Quirky and fragmented as it is, Android is making its way into our lives. If you are a developer you might want to jump on the bandwagon - there's still room and it's going to get big.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5645807251540741658-2568632690273067985?l=blog.burnayev.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/burnayev/~4/yQOA28sZhD0" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/burnayev/~3/yQOA28sZhD0/google-io-aftermath.html</link><author>noreply@blogger.com (Borys Burnayev)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.burnayev.com/2010/05/google-io-aftermath.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5645807251540741658.post-1886465494473620857</guid><pubDate>Fri, 09 Apr 2010 16:51:00 +0000</pubDate><atom:updated>2010-04-09T13:53:47.967-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">java</category><category domain="http://www.blogger.com/atom/ns#">spring</category><title>How to Upgrade Spring Security 2 to Spring Security 3</title><description>The short answer is you have to plunge into it head first.&lt;br /&gt;&lt;br /&gt;The Problem&lt;br /&gt;You have a working Spring Security 2.0.x setup and want to upgrade to the latest as of the time of this writing version 3.0.x. You did a (re)search on the Internet and found basically nothing. You are puzzled.&lt;br /&gt;&lt;br /&gt;The Solution&lt;br /&gt;You are not gonna like it but you have to get your hands dirty, figuratively speaking, and make it happen the hard way.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Remove the old libraries and drop in the new ones. You gotta get a lot of red in your IDE.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Make the red go away. The 3.x distro contains a file named class_mapping_from_2.0.x.txt. It can save you a search or two.&lt;/li&gt;&lt;li&gt;Update your Spring Security config files so that the schemaLocation ends with spring-security-3.0.xsd. If you have a validating XML editor you'll get a fair amount of red wavy lines right away.&lt;/li&gt;&lt;li&gt;Make the red go away. Refer to &lt;a href="file:///C:/spring-security-3.0.2.RELEASE/docs/reference/ns-config.html"&gt;Security Namespace Configuration&lt;/a&gt; section of &lt;span style="font-style: italic;"&gt;&lt;a href="file:///C:/spring-security-3.0.2.RELEASE/docs/reference/springsecurity.html"&gt;the&lt;/a&gt; &lt;/span&gt;manual.&lt;/li&gt;&lt;li&gt;If you happen to use an IDE that understands Java code in JSP pages, such as &lt;a href="http://myeclipseide.com/"&gt;MyEclipse&lt;/a&gt;, hunt for the red there and exterminate it. Otherwise proceed to the next step.&lt;/li&gt;&lt;li&gt;Deploy your application. It'll blow up. That's OK. Have a look at the log. There was a lot of shuffling of the properties (defaultTargetUrl etc) among various classes between versions 2 and 3.  Move the offending properties in your SS config file as needed.&lt;/li&gt;&lt;li&gt;Your application should now deploy fine. Run it and see if it bombs. It it is it may be because you didn't do a good job at step 5. Now you should have a good indication of where to look at. Have a look and resolve.&lt;/li&gt;&lt;li&gt;If you made it this far you are done. Congratulations!&lt;/li&gt;&lt;/ol&gt;The Rhetoric&lt;br /&gt;Now when I'm done with the upgrade I keep asking myself the same question. How comes the supposedly best-of-breed enterprise-class software breaks backward compatibility in such an intricate, outrageous, in-your-face way?&lt;br /&gt;&lt;br /&gt;Understandably Spring Security is the only game in town for the security-heavy shops on the EJB-less enterprise bandwagon. This is a classic vendor lock-in scenario in its uglier manifestation. A (re)design decision made by a few talanted developers is going to reverberate in the enterprise for years.&lt;br /&gt;&lt;br /&gt;The enterprise is obsessed with compatibility and continuity. How can I recommend Spring Security to my next enterprise client with a straight face?&lt;br /&gt;&lt;ol&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5645807251540741658-1886465494473620857?l=blog.burnayev.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/burnayev/~4/RiusKNq4Q0I" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/burnayev/~3/RiusKNq4Q0I/how-to-upgrade-spring-security-2-to.html</link><author>noreply@blogger.com (Borys Burnayev)</author><thr:total>2</thr:total><feedburner:origLink>http://blog.burnayev.com/2010/04/how-to-upgrade-spring-security-2-to.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5645807251540741658.post-6459843801816036723</guid><pubDate>Thu, 08 Apr 2010 23:43:00 +0000</pubDate><atom:updated>2010-04-08T19:43:00.410-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">android</category><title>Don't Look a Gift Horse in the Mouth</title><description>In the rightful effort to disseminate the up-to-date Android technology Google has embarked on something officially called "device seeding program for top Android Market developers".&lt;br /&gt;&lt;br /&gt;&lt;a href="http://actioncomplete.com"&gt;ActionComplete&lt;/a&gt; has been steadily approaching the 50000 downloads mark and has an average rating of 3.97 so here I am playing with a new toy.&lt;br /&gt;&lt;br /&gt;Google couldn't go the straight way and decided to introduce an element of surprise by pseudo-randomly sending out Nexuses and Droids. It feels like developers in the US got Droids while other developers got Nexuses.&lt;br /&gt;&lt;br /&gt;The Droid I got came with a complimentary one month of free Verizon service, both voice and data. A very smart move as that was the only way for them to make me try the Verizon network.&lt;br /&gt;&lt;br /&gt;By now I've already used around 10 days of that free month and can report the initial findings.&lt;br /&gt;&lt;br /&gt;The Phone&lt;br /&gt;Fast. Functional. I always try to come up to a triad... This time it's going to be a dynamic duo.&lt;br /&gt;&lt;br /&gt;I realized why it has that sunken chin. That's the only place where you can safely hold the phone in landscape without hitting the touch-sensitive buttons. Even with that in mind I still touch them a lot in very inappropriate moments. I'm yet to figure out why I keep sending empty emails now and then.&lt;br /&gt;&lt;br /&gt;Oddly enough, the keyboard is less convenient than that on G1. The upper row is quite close to the slid-out top of the phone and you end up touching it a lot with your thumbs. The buttons are almost flat and the press response is minimal.&lt;br /&gt;&lt;br /&gt;The good part is the phone is fast. And very functional. You can actually do what you are supposed to be able to and it usually works as advertised. You can get the directions to your lunch destination before you arrive there. You can view house prices in Zillow application for Android while driving at 40 mph. Believe it or not, but Droid in fact Does.&lt;br /&gt;&lt;br /&gt;Which logically brings us to the the next review item - the network.&lt;br /&gt;&lt;br /&gt;Verizon touts itself as the best network in the States (who doesn't?). Here in DC it might well be the case. The data network is always in 3G mode wherever I am. The connection is fast and reliable. The maps load promptly as you drive, voice-assisted navigation works well most of the time.&lt;br /&gt;&lt;br /&gt;To keep its network fast Verizon puts some restrictions in place that are not typically found on other networks. You can't upload a video over 3G - it'll sit in the queue until you get a Wi-Fi connection.&lt;br /&gt;&lt;br /&gt;The Conclusion&lt;br /&gt;I found my attraction to the phone growing with every single day. Maybe it'll even become my primary phone after the free honeymoon is over. Who knows?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5645807251540741658-6459843801816036723?l=blog.burnayev.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/burnayev/~4/9tYuoRZGXD0" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/burnayev/~3/9tYuoRZGXD0/dont-look-gift-horse-in-mouth.html</link><author>noreply@blogger.com (Borys Burnayev)</author><thr:total>1</thr:total><feedburner:origLink>http://blog.burnayev.com/2010/04/dont-look-gift-horse-in-mouth.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5645807251540741658.post-3687262219551330298</guid><pubDate>Tue, 06 Apr 2010 12:50:00 +0000</pubDate><atom:updated>2010-04-06T09:42:59.783-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">apple</category><title>iPad First (and Last) Impression</title><description>In this post entitled starting with a lower case letter I'll talk about my first impression about the device that purportedly is the future of computing - iPad.&lt;br /&gt;&lt;br /&gt;The best way to get a hands-on experience with the new Apple toy is to head to one of your local Best Buys as they tend to be less crowded than Apple Stores.&lt;br /&gt;&lt;br /&gt;In my mind I was picturing an iPad as a laptop-screen-size device so it took me a while to find the demo stand featuring those puny things. The tablet is smaller that you might think it is.&lt;br /&gt;&lt;br /&gt;But hey - it's not something to be upset about. It weighs way more than you expect! Take a 700-page book and you know what an iPad feels like in your hands.&lt;br /&gt;&lt;br /&gt;The browser seems to be fairly limited even for what it officially supports, which does not include Flash.&lt;br /&gt;&lt;br /&gt;The screen has a netbook-like resolution of 1024 x 768, which sits somewhere on the border  between a smartphone and a computer, and does not always displays web applications correctly. Native applications have a clear edge over web applications on iPad - they generally look nicer and perform better.&lt;br /&gt;&lt;br /&gt;I had high hopes that iPad would be a great device to run rich Internet applications... I have high hopes Chrome OS will give rise to great devices to run rich Internet applications.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5645807251540741658-3687262219551330298?l=blog.burnayev.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/burnayev/~4/dRX6H6es7pk" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/burnayev/~3/dRX6H6es7pk/ipad-first-and-last-impression.html</link><author>noreply@blogger.com (Borys Burnayev)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.burnayev.com/2010/04/ipad-first-and-last-impression.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5645807251540741658.post-3814124142207950978</guid><pubDate>Thu, 25 Mar 2010 14:34:00 +0000</pubDate><atom:updated>2010-03-25T12:24:07.440-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">android</category><title>Sexier than iPhone, Tougher than Droid</title><description>This year's &lt;a href="http://daily.ctia.org/wireless2010/"&gt;CTIA Wireless trade show&lt;/a&gt; saw not one but two smartphones poised to eclipse the current market leader iPhone.&lt;br /&gt;&lt;br /&gt;Both &lt;a href="http://www.phonearena.com/htmls/Samsung-Galaxy-S-phone-p_4522.html"&gt;Samsung Galaxy S&lt;/a&gt; and &lt;a href="http://www.phonearena.com/htmls/HTC-EVO-4G-phone-p_4382.html"&gt;HTC Evo 4G&lt;/a&gt; are beautifully designed devices harnessing the full power of Android 2.1 platform. The design of both phones is clearly inspired by the target rival, which is &lt;span style="font-style: italic;"&gt;just fine&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Hardware of either device is top-notch and beats iPhone hands down. 720p HD recording, front-facing camera, 1GHz processor... You name it and it's likely there.&lt;br /&gt;&lt;br /&gt;On the software front both Samsung and HTC decided to go with a custom user interface overlay on top of a stock Android. The customizations seem to be well thought out and add to the charm of the devices. The downside is most likely you'll have to forget about upgrading to the latest Android versions when they become available.&lt;br /&gt;&lt;br /&gt;Integration with major social networks such as Facebook and Twitter is baked into either device.&lt;br /&gt;&lt;br /&gt;Both phones seem to be "Google experience" devices meaning that all the good stuff from Google you come to expect from an Android phone such as Google Maps/Navigation, Gmail, Calendar, and the like is going to be at your fingertips.&lt;br /&gt;&lt;br /&gt;Android Market is the source of more than 30,000 applications that can augment the out-of-the-box experience for either phone. A number of useful apps come preinstalled. Galaxy S features &lt;a href="http://www.swypeinc.com/"&gt;Swype&lt;/a&gt; - a soft keyboard input accelerator for smartphones.&lt;br /&gt;&lt;br /&gt;The phones will be available later this year, presumably before the next-gen iPhone is announced, and the price is currently unknown. HTC Evo 4G is going to be offered by Sprint while Galaxy S is currently not tagged with a carrier. As it's a GSM phone it's reasonable to expect it to be available from either AT&amp;amp;T or T-Mobile in the US.&lt;br /&gt;&lt;br /&gt;If you don't have a smartphone or your iPhone contract is about to expire you might want to have a long and close look at these devices. This is the first time I recommend an Android phone over an iPhone to a friend.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5645807251540741658-3814124142207950978?l=blog.burnayev.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/burnayev/~4/uAgDYcAp7Hk" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/burnayev/~3/uAgDYcAp7Hk/sexier-than-iphone-tougher-than-droid.html</link><author>noreply@blogger.com (Borys Burnayev)</author><thr:total>2</thr:total><feedburner:origLink>http://blog.burnayev.com/2010/03/sexier-than-iphone-tougher-than-droid.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5645807251540741658.post-5152929249747869170</guid><pubDate>Wed, 24 Feb 2010 18:26:00 +0000</pubDate><atom:updated>2010-03-30T08:05:43.092-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">android</category><title>The Second Life of my G1</title><description>Over the past month I've been enjoying the Indian summer of my Android phone. Long story short - it got a new battery. Not just a new battery - a &lt;a href="http://www.amazon.com/2200mAh-Replacement-Extended-Battery-T-Mobile/dp/B001PRCU0U"&gt;2200 mAh one&lt;/a&gt;. That's about twice the capacity of a stock G1 unit (1150 mAh).&lt;br /&gt;&lt;br /&gt;The catch? The phone got fatter by a quarter of an inch or so. Now I can feel and appreciate the thing.&lt;br /&gt;&lt;br /&gt;Most importantly though I can &lt;span style="font-style: italic;"&gt;use&lt;/span&gt; it. &lt;a href="http://www.cyrket.com/p/android/com.cyxb.fishin2go/"&gt;Fishin' 2 Go&lt;/a&gt;, Google Navigation, the whole nine yards. A day or two without a recharge. That's a terrific improvement over 4 something hours the old faithful could squeeze out of itself before.&lt;br /&gt;&lt;br /&gt;If you happen to have the first Android phone and are contemplating a replacement device that is about to be released "soon", 20 bucks can be the bridge financing you are looking for.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5645807251540741658-5152929249747869170?l=blog.burnayev.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/burnayev/~4/4ND-z90SisQ" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/burnayev/~3/4ND-z90SisQ/second-life-of-my-g1.html</link><author>noreply@blogger.com (Borys Burnayev)</author><thr:total>1</thr:total><feedburner:origLink>http://blog.burnayev.com/2010/02/second-life-of-my-g1.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5645807251540741658.post-5070085155119068679</guid><pubDate>Sat, 20 Feb 2010 16:09:00 +0000</pubDate><atom:updated>2010-02-20T11:14:11.216-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">gae</category><title>GAE Developer Tip: Updating Database Schema</title><description>The backend of Google App Engine is not relational. One of the implications is different records in the same table can have different number of columns. Sometimes it's just fine, other times you want it the conventional way - all rows having the same columns.&lt;br /&gt;&lt;br /&gt;The practical consequence of such a design is that a field added to a domain object will only appear in objects of this type created after the structure of the object was modified. All the objects created before the change will happily live with the old structure.&lt;br /&gt;&lt;br /&gt;Before you know it you'll want to filter or sort on the newly added attributes. What happens next is you realize your queries totally ignore your good ol' buddies without the new attributes. Which makes you wanting desperately to bring your schema to order and add the missing columns to all the records of your table so to speak.&lt;br /&gt;&lt;br /&gt;Here comes a surprise. You &lt;a href="http://groups.google.com/group/google-appengine-java/browse_thread/thread/d8d51bc3eef30d14/ba33980729d444ff?lnk=gst&amp;q=jdo+missing+properties#ba33980729d444ff"&gt;can't really do that easily&lt;/a&gt;. What you need to do is to fetch ALL the objects and re-save them. You might have thought that the new columns are there and you can query for something like "myNewColumn == null". No such luck. GAE makes a stark distinction between null and missing columns. Until you explicitly set your newly added columns to null they are non-existent in the eyes of our beloved App Engine.&lt;br /&gt;&lt;br /&gt;Back to the show. You need to fetch ALL the objects and re-save them. While not a problem per se, the approach faces a number of technical challenges due to another design feature of App Engine - the limitation on the number of results the query can return and on the duration of a single request. Currently a query is restricted to 1000 results and a single request can't take longer than a certain number of milliseconds. Meaning you have to batch up your work.&lt;br /&gt;&lt;br /&gt;Batching up the to-be updated objects can become a non-trivial task and will likely be a one-off solution for every schema update. This is not optimal as what you want is to think once and run everywhere.&lt;br /&gt;&lt;br /&gt;If you made it to this point we are on the same page. Now bear with me.&lt;br /&gt;&lt;br /&gt;For our batching effort to succeed we need something that we can query reliably to figure out what needs to be updated. To this end we create a special attribute called, say, schemaVersion.&lt;br /&gt;&lt;br /&gt;We created schemaVersion attribute for ALL our entities and assign it a default value. From now on all our objects are versioned in a database sense.&lt;br /&gt;&lt;br /&gt;Fast forward into the future. Having been in production for a few months we realize we need another attribute on that entity. What do we do?&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Add the new attribute to the entity&lt;/li&gt;&lt;li&gt;Increase the default value of schemaVersion&lt;/li&gt;&lt;li&gt;Create a finder method in your DAO tier to retrieve a fixed number of entities whose version number is below current&lt;/li&gt;&lt;li&gt;Create a cron job to retrieve the outdated objects and update them as needed based on their version and the current schema version for the entity in question&lt;/li&gt;&lt;/ol&gt;Rejoice - you are in control of your database schema again.&lt;br /&gt;&lt;br /&gt;The code snippets below illustrate the approach.&lt;br /&gt;&lt;br /&gt;In your domain object:&lt;br /&gt;&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; public class Action implements Serializable {  &lt;br /&gt;    @Persistent  &lt;br /&gt;    private Integer deleted = 0;  &lt;br /&gt;    @Persistent  &lt;br /&gt;    private Integer schemaVersion = 1;  &lt;br /&gt; }  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Somewhere in your DAO layer:&lt;br /&gt;&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt;    PersistenceManager pm = PMF.get().getPersistenceManager();  &lt;br /&gt;    try {  &lt;br /&gt;       Query query = pm.newQuery(Action.class);  &lt;br /&gt;       query.setFilter("schemaVersion &amp;lt; :schemaVersion");  &lt;br /&gt;       query.setRange(0, 100);  &lt;br /&gt;       actions.addAll(pm.detachCopyAll((Collection&amp;lt;Action&amp;gt;) query.execute(currentVersion)));  &lt;br /&gt;    } finally {  &lt;br /&gt;       DAOUtil.closePM(pm, logger);  &lt;br /&gt;    }  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;In your batch job:&lt;br /&gt;&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt;    List&amp;lt;Action&amp;gt; actions = actionDAO.findForSchemaUpdate(1);  &lt;br /&gt;    for (Action action : actions) {  &lt;br /&gt;       int currentVersion = action.getSchemaVersion();  &lt;br /&gt;       switch (currentVersion) {  &lt;br /&gt;       case 0:  &lt;br /&gt;          action.setDeleted(0);  &lt;br /&gt;       default:  &lt;br /&gt;          break;  &lt;br /&gt;       }  &lt;br /&gt;       action.setSchemaVersion(1);  &lt;br /&gt;       actionDAO.save(action);  &lt;br /&gt;    }  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5645807251540741658-5070085155119068679?l=blog.burnayev.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/burnayev/~4/M1X1t-uuOAg" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/burnayev/~3/M1X1t-uuOAg/gae-developer-tip-updating-database.html</link><author>noreply@blogger.com (Borys Burnayev)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.burnayev.com/2010/02/gae-developer-tip-updating-database.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5645807251540741658.post-714594048020703457</guid><pubDate>Fri, 12 Feb 2010 01:19:00 +0000</pubDate><atom:updated>2010-02-11T20:54:31.420-05:00</atom:updated><title>Cleaning up Indexes in Google App Engine/Java</title><description>This is so peculiar I still can't decide if I should laugh or cry...&lt;br /&gt;&lt;br /&gt;In short, if you use GAE Java SDK you can't delete indexes in your App Engine application.&lt;br /&gt;&lt;br /&gt;To give you some context, indexes is GAE's only way of executing queries against the data store and a single query can use a maximum of 1 (one) index. For the things to be entertaining there is a free quota of 100 indexes per application. Before you know it the indexes quota goes in the red area on the dashboard and your next deployment fails.&lt;br /&gt;&lt;br /&gt;At this point you realize a good deal of the indexes out there are not relevant any more and should be disposed of. You head to the dashboard and verify that it is the case indeed. You look for Delete button. For Remove button. For Purge button. For any button... No such luck. There are no buttons on Datastore Indexes page of GAE Dashboard.&lt;br /&gt;&lt;br /&gt;Alright, you think. There must be a utility of some kind to get those darn indexes out of sight. And yes there sure is one! In GAE Python SDK...&lt;br /&gt;&lt;br /&gt;This is the hilarious part. You program in Java and you use Python to "vacuum" your indexes. Isn't that intuitive?&lt;br /&gt;&lt;br /&gt;This must be one of their April Fools jokes that slipped through the fingers. To remind the fine folks at Google we are not there yet star &lt;a href="http://code.google.com/p/googleappengine/issues/detail?id=1893"&gt;this issue&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5645807251540741658-714594048020703457?l=blog.burnayev.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/burnayev/~4/j8LmximGAJE" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/burnayev/~3/j8LmximGAJE/cleaning-up-indexes-in-google-app.html</link><author>noreply@blogger.com (Borys Burnayev)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.burnayev.com/2010/02/cleaning-up-indexes-in-google-app.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5645807251540741658.post-6626879512935875480</guid><pubDate>Fri, 29 Jan 2010 11:27:00 +0000</pubDate><atom:updated>2010-01-29T06:29:34.116-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">web 2.0</category><category domain="http://www.blogger.com/atom/ns#">apple</category><title>On iPad and Business Opportunity</title><description>Like it or not - iPad is there to be unleashed on the consumer in less than 60 days.&lt;br /&gt;&lt;br /&gt;Will it outsell its older diminutive cousins? Probably not. Will it sell in quantities? Likely so. Which leaves me wondering what kind of business opportunity lies behind the polish and gloss of Apple's latest brainchild.&lt;br /&gt;&lt;br /&gt;iPad has a modestly good screen resolution of 1024 x 768 pixels and sports a screaming-fast browser. All that makes it a good candidate for running &lt;span style="font-style: italic;"&gt;web applications&lt;/span&gt;. While "native" apps will definitely run better and look nicer on the tablet, the web applications on iPad should be quite usable as compared to the experience on other mobile i devices.&lt;br /&gt;&lt;br /&gt;Now imagine you have a web application...&lt;br /&gt;&lt;br /&gt;All of a sudden your user base might expand into the segments you'd never thought of as your "customers". Those people are likely going to be less computer-savvy than you might imagine. Yet iPad will make it ridiculously easy for them to access your web application.&lt;br /&gt;&lt;br /&gt;The moral? If you are a web application... Look good at 1024 x 768. Be utterly intuitive - no iPad user is going to read the manual.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5645807251540741658-6626879512935875480?l=blog.burnayev.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/burnayev/~4/xNWZPHV8ft4" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/burnayev/~3/xNWZPHV8ft4/on-ipad-and-business-opportunity.html</link><author>noreply@blogger.com (Borys Burnayev)</author><thr:total>2</thr:total><feedburner:origLink>http://blog.burnayev.com/2010/01/on-ipad-and-business-opportunity.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5645807251540741658.post-5894629764853666583</guid><pubDate>Thu, 14 Jan 2010 23:45:00 +0000</pubDate><atom:updated>2010-01-14T18:45:00.239-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">smartphones</category><category domain="http://www.blogger.com/atom/ns#">android</category><title>Looks Matter. Even If You Are a Smartphone</title><description>It must have been the thousandth time I saw a Nexus One ad for the past week. And every singly time I see it I ask myself the same question: why that trackball thingy panel?&lt;br /&gt;&lt;br /&gt;Since the first time I saw the phone a few month ago when it was still called HTC Passion I couldn't grasp the grand idea behind the exterior design of the device. It must have been something beyond the design realm that prompted the lower panel. They must have desperately needed that space to ensure proper cooling or something.&lt;br /&gt;&lt;br /&gt;One of iPhone appeals is its symmetric design. Somehow Android phone manufacturers at large try to "differentiate" themselves with chins, hips, and other nonsense. Motorola CLIQ comes closest to an eye-pleasing design. If it had decent hardware and software I could have bought it.&lt;br /&gt;&lt;br /&gt;Apple figured out the optimal exterior design of a smartphone and Microsoft understands it. That's why Windows Mobile &lt;a href="http://www.mobiledia.com/phones/htc/hd2.html"&gt;flagship device&lt;/a&gt; looks remarkably familiar. When it hits the market, preceded by a monumental marketing push from Redmond, the consumer will go for it.&lt;br /&gt;&lt;br /&gt;Google's experimental approach to everything works great with gratis online services. Unless the plan is to give Android phones away, it might make sense to build something that not only works but also looks great. Or just photoshop those ads...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5645807251540741658-5894629764853666583?l=blog.burnayev.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/burnayev/~4/rmqwu_2onK8" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/burnayev/~3/rmqwu_2onK8/looks-matter-even-if-you-are-smartphone.html</link><author>noreply@blogger.com (Borys Burnayev)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.burnayev.com/2010/01/looks-matter-even-if-you-are-smartphone.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5645807251540741658.post-2101400916359542499</guid><pubDate>Wed, 13 Jan 2010 01:22:00 +0000</pubDate><atom:updated>2010-01-12T20:22:00.173-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">google</category><category domain="http://www.blogger.com/atom/ns#">android</category><title>Google vs Android Developers</title><description>Android SDK 2.1 is &lt;a href="http://developer.android.com/sdk/android-2.1.html"&gt;out&lt;/a&gt; together with a number of questions I'd like to ask.&lt;br /&gt;&lt;br /&gt;The first device leveraging the platform was released a week ago. The developers were left in the dark till now. How comes?&lt;br /&gt;&lt;br /&gt;This release is yet another manifestation of the lack of well-thought policy over there at Google on what stands behind a version number.&lt;br /&gt;&lt;br /&gt;2.1 corresponds to API level 7 ("API level" is an internal SDK version identifier used by Android). It's interesting how 2.0 (API level 6) and 2.0.1 (API level 5) got moved to "Older Platforms" area of the &lt;a href="http://developer.android.com/sdk/index.html"&gt;Android developer site&lt;/a&gt; while Android 1.6 (API level 4) and 1.5 (API level 3) are still among the "current" platforms.&lt;br /&gt;&lt;br /&gt;Is any new Android SDK version going to deprecate it's highest ranked predecessor from now on? With great ancestors 1.5 and 1.6 staying there forever?&lt;br /&gt;&lt;br /&gt;Developers need clear version numbering that can be correlated to stability and longevity of the corresponding SDK. Preview and beta versions should be named as such. API-breaking versions should get an incremented minor version number (i.e. 2.o.1 shouldn't have existed, it should have been 2.1.0).&lt;br /&gt;&lt;br /&gt;While software versions have been increasingly used for marketing purposes, it's important to remember that they do have a meaning in software engineering.&lt;br /&gt;&lt;br /&gt;Here's a painfully true &lt;a href="http://www.techcrunch.com/2010/01/12/iphone-versus-nexus-one/"&gt;quote&lt;/a&gt; of MG Siegler of TechChrunch:&lt;br /&gt;&lt;blockquote&gt;Simply put, iPhone apps, as a whole, are &lt;em&gt;much, much better&lt;/em&gt; than Android apps. Maybe that’s because Android apps aren’t quite as mature yet. But I don’t know. The Android Market has been around for over a year now, and the fact that there still isn’t a Twitter app that’s as good as the top five iPhone Twitter apps is a bit odd to me.&lt;/blockquote&gt;Developers are the crucial part of Android ecosystem. Google has some thinking to do. Maybe eventually the horse will be put in front of the cart.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5645807251540741658-2101400916359542499?l=blog.burnayev.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/burnayev/~4/lJ5U9JLbt7E" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/burnayev/~3/lJ5U9JLbt7E/google-vs-android-developers.html</link><author>noreply@blogger.com (Borys Burnayev)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.burnayev.com/2010/01/google-vs-android-developers.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5645807251540741658.post-9182122046092043929</guid><pubDate>Tue, 12 Jan 2010 01:40:00 +0000</pubDate><atom:updated>2010-01-11T20:40:00.332-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">twitter</category><title>Twitter Lists are Great. Now I Want Twitter Categories</title><description>It's been quite a while since Twitter unleashed lists and I'm finding them quite useful for organizing the accounts and people I follow.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://twithive.com/"&gt;TwitHive&lt;/a&gt; - an excellent web application for Twitter - has been providing list-like functionality since long before lists came to be. Lists made it a commodity and as it stands now most Twitter clients allow us to access the content we care about naturally via channels.&lt;br /&gt;&lt;br /&gt;Which brings us to the current day and makes me think about something very similar to lists but serving a totally different purpose - the ability to split the content I create into separate slices, or &lt;span style="font-style: italic;"&gt;categories&lt;/span&gt;, so that the people following me can choose either to follow the stream in its entirety or to limit themselves to just a subset of it. In this setup when I configure a new service to auto-post my content to Twitter I'll choose whether I want to post to the "raw" stream or to a particular "category" so that only people following that category of mine will get the update. This way I'll be able to easily separate my lunch-time musings from Android developer tips and such.&lt;br /&gt;&lt;br /&gt;Wishful thinking? Sure enough. Yet we all know that Twitter growth has &lt;a href="http://www.techcrunch.com/2009/11/24/twitter-wordpress-blogging-vs-microblogging/"&gt;flattened&lt;/a&gt; recently and they must be on a desperate search of ways to turn the situation around. Categories might be a step in the right direction.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5645807251540741658-9182122046092043929?l=blog.burnayev.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/burnayev/~4/FBk2wtjalTU" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/burnayev/~3/FBk2wtjalTU/twitter-lists-are-great-now-i-want.html</link><author>noreply@blogger.com (Borys Burnayev)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.burnayev.com/2010/01/twitter-lists-are-great-now-i-want.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5645807251540741658.post-5621595810230474408</guid><pubDate>Fri, 08 Jan 2010 23:54:00 +0000</pubDate><atom:updated>2010-01-08T18:54:00.108-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">smartphones</category><category domain="http://www.blogger.com/atom/ns#">google</category><category domain="http://www.blogger.com/atom/ns#">android</category><title>The Perfect Android Phone</title><description>Different people choose &lt;a href="http://www.android.com/"&gt;Android&lt;/a&gt; to be the OS that powers their smartphone for different reasons. My reason is Android provides the best Java implementation in the mobile domain. Forget about Java ME. Android's Java is a real thing that in many respects is on par or better than its desktop counterpart.&lt;br /&gt;&lt;br /&gt;Your reason is probably different but you decided to be on the lookout... And found this post talking about my vision of a perfect Android phone.&lt;br /&gt;&lt;br /&gt;1. Affordability&lt;br /&gt;&lt;br /&gt;Mobile landscape evolves quickly. A smartphone has to be affordable. Affordable to me means less than $200. Enough said.&lt;br /&gt;&lt;br /&gt;2. &lt;a href="https://www.google.com/voice"&gt;Google Voice&lt;/a&gt; and Data-only Plan&lt;br /&gt;&lt;br /&gt;I don't mind if the phone's price tag is attached to a contract with a major carrier. The plot is to port my number to Google Voice and run away with a reasonably priced data-only plan.&lt;br /&gt;&lt;br /&gt;3. Upgradability&lt;br /&gt;&lt;br /&gt;The dictionaries don't know such a term but it's as simple as being able to upgrade your phone to the most recent version of Android. For better or worse Google produces new Android versions at mind-boggling pace and you want to stay on top on that. There are hardware limits to how far you can go with it but you should be able to have a reasonably recent version.&lt;br /&gt;&lt;br /&gt;4. A MID (Mobile Internet Device) Will Do&lt;br /&gt;&lt;br /&gt;Does it really have to be a phone? Not necessarily. An Android-based tablet a la yet-to-be-announced &lt;a href="http://www.dellstreak.com/"&gt;Dell Streak&lt;/a&gt; will do just fine. Tablets typically offer a slightly larger screen (5 inches is a good way of thinking about it) but are still highly pocketable. Due to the larger screen size the on-screen keyboard becomes quite usable and the lack of physical keyboard is less of an issue.&lt;br /&gt;&lt;br /&gt;Currently this fine strategy faces a number of obstacles.&lt;br /&gt;&lt;br /&gt;1. You can't really port your number to Google Voice (yet).&lt;br /&gt;&lt;br /&gt;2. Reasonably priced Android phones are outdated on arrival. I'm going to speculate that Google treats its partners as bad as it treats developers by not providing either with timely information and by frequently changing its plans, conventions, and intents without prior notice.&lt;br /&gt;&lt;br /&gt;The moral of the story is that if you are shooting for an Android phone, either as a user or a developer, you'd better look for a future Google-branded device. The odds are you are better off with a MID rather than a phone. If Google happens to plan to offer one that is.&lt;br /&gt;&lt;br /&gt;Android will take over the world in about 6 months. I've been saying that for the past year and half.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5645807251540741658-5621595810230474408?l=blog.burnayev.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/burnayev/~4/UE10e8kNB9w" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/burnayev/~3/UE10e8kNB9w/perfect-android-phone.html</link><author>noreply@blogger.com (Borys Burnayev)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.burnayev.com/2010/01/perfect-android-phone.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5645807251540741658.post-1448887844383672154</guid><pubDate>Fri, 08 Jan 2010 12:47:00 +0000</pubDate><atom:updated>2010-01-08T08:10:49.615-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">android</category><title>Another Day, Another Android AppStore</title><description>Yesterday at CES that's currently taking place in Las Vegas Lenovo announced its first Android phone - &lt;a href="http://www.engadget.com/2010/01/06/lenovo-announces-lephone-android-device-for-china/"&gt;LePhone&lt;/a&gt;. It's a nifty phone but that's not what I'm going to talk about. As I figured out Lenovo is working on its own Android AppStore.&lt;br /&gt;&lt;br /&gt;The phone is originally bound for China and Android Market is not accessible in that country. Understandably there needs to be an app distribution channel for the platform to be successful. However as far as I can tell there are other efforts in this direction by other Chinese companies. Barring the obvious option of Android Market as the preferred distribution mechanism, both consumers and developers want a single application distribution channel, at least per country.&lt;br /&gt;&lt;br /&gt;Hopefully Lenovo realizes what they are up to.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5645807251540741658-1448887844383672154?l=blog.burnayev.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/burnayev/~4/e4DLFaeHeKA" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/burnayev/~3/e4DLFaeHeKA/another-day-another-android-appstore.html</link><author>noreply@blogger.com (Borys Burnayev)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.burnayev.com/2010/01/another-day-another-android-appstore.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5645807251540741658.post-6743168992160017745</guid><pubDate>Thu, 07 Jan 2010 23:15:00 +0000</pubDate><atom:updated>2010-01-07T18:17:37.946-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">smartphones</category><title>Why Unlocked Phones Don't Matter in the US</title><description>This is the second post in a row with a title that start with "why". I wonder if it's due to Google Nexus One "why" moment.&lt;br /&gt;&lt;br /&gt;Anyway, as the title says unlocked phones don't matter in the US. Here's the reasoning that made me believe so.&lt;br /&gt;&lt;br /&gt;There are four major cellular network carriers in the states: Verizon, AT&amp;amp;T, Sprint, and T-Mobile. Verizon and Spring use CDMA technology that seem to be used primarily in USA while AT&amp;amp;T and T-Mobile employ a more recent GSM tech widely deployed worldwide.&lt;br /&gt;&lt;br /&gt;CDMA and GSM are not compatible at all which reduces the number of major networks an unlocked phone can be used on to just two. That means you can &lt;span style="font-style: italic;"&gt;potentially &lt;/span&gt;use your unlocked phone on either Verizon or Sprint or on either AT&amp;amp;T and T-Mo. They keyword here is "potentially".&lt;br /&gt;&lt;br /&gt;Further "research" &lt;a href="http://wiki.answers.com/Q/Are_sprint_phones_compatible_with_verizon"&gt;reveals&lt;/a&gt; that portability between the major US CDMA carriers Verizon and Sprint is not universally guaranteed and an arbitrary phone will unlikely to work on the other network even if unlocked.&lt;br /&gt;&lt;br /&gt;While GSM was designed for portability, there are still minutiae on the technical side that can prevent full compatibility on the &lt;span style="font-style: italic;"&gt;data&lt;/span&gt; side, which is essential for smartphones such as Nexus One. Specifically, different GSM carriers use different radio frequency bands for GSM 3G data transfer. It happens to be the case that AT&amp;amp;T and T-Mo are just such carriers meaning an unlocked Nexus One will only work on T-Mo's 3G network but not on AT&amp;amp;T's.&lt;br /&gt;&lt;br /&gt;Now I'll ask you a question. What is the point of buying a &lt;a href="http://www.google.com/phone"&gt;$530 unlocked phone&lt;/a&gt; if the only major network you can use it on is T-Mobile?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5645807251540741658-6743168992160017745?l=blog.burnayev.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/burnayev/~4/qK0YGENGBHk" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/burnayev/~3/qK0YGENGBHk/why-unlocked-phones-dont-matter-in-us.html</link><author>noreply@blogger.com (Borys Burnayev)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.burnayev.com/2010/01/why-unlocked-phones-dont-matter-in-us.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5645807251540741658.post-7221333200169339185</guid><pubDate>Tue, 05 Jan 2010 22:34:00 +0000</pubDate><atom:updated>2010-01-05T18:27:01.388-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">google</category><category domain="http://www.blogger.com/atom/ns#">android</category><title>Why I'm not Buying Nexus One</title><description>Today Google has officially become a hardware company with the debut of its Android-based smartphone called Nexus One, which is available via the only channel - &lt;a href="http://www.google.com/phone"&gt;online from Google&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;A lot has been said on how this thing is better than &lt;a href="http://www.techcrunch.com/2010/01/05/google-nexus-one-the-techcrunch-review/"&gt;iPhone and the sliced bread&lt;/a&gt;. However as the title says I'm not buying it and here's why.&lt;br /&gt;&lt;br /&gt;1. The Price&lt;br /&gt;&lt;br /&gt;$530 might sound great across the pond but here in the US folks "en masse" are not get used to swasting (swasting = (s)pending  + (wasting) - got it?) half a grand for a toy that's gonna become outdated in three weeks or so. That rules out the unlocked option.&lt;br /&gt;&lt;br /&gt;The other option allows you to have the phone for $180 with a 2-year T-Mobile contract on an $80/month plan. I've been with T-Mo for the past umpteen years and despite that can't just upgrade one of my phones. That pisses me off.&lt;br /&gt;&lt;br /&gt;2. Battery Life&lt;br /&gt;&lt;br /&gt;Good luck with a 1400 mAh battery on a beast with 1GHz processor... My biggest gripe about G1 is miserable battery life. To be usable a phone should survive a full day on a single charge while being used.&lt;br /&gt;&lt;br /&gt;3. Keyboard (or Rather the Absence Thereof)&lt;br /&gt;&lt;br /&gt;I use my smartphone primarily as a GTD system (ActionComplete). Keyboard is an essential element of a satisfying user experience in such a scenario.&lt;br /&gt;&lt;br /&gt;4. Design&lt;br /&gt;&lt;br /&gt;Some might find the lower panel with the lonely trackball attractive but I just don't like it.&lt;br /&gt;&lt;br /&gt;5. Google's Disrespect for Developers&lt;br /&gt;&lt;br /&gt;The new shiny thing runs Android 2.1. Where the heck is Android 2.1 SDK that I can use to make sure my applications work on the device?&lt;br /&gt;&lt;br /&gt;I'm not buying Nexus One.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5645807251540741658-7221333200169339185?l=blog.burnayev.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/burnayev/~4/mK-vlY5RxCI" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/burnayev/~3/mK-vlY5RxCI/why-im-not-buying-nexus-one.html</link><author>noreply@blogger.com (Borys Burnayev)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.burnayev.com/2010/01/why-im-not-buying-nexus-one.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5645807251540741658.post-5147028860326945772</guid><pubDate>Thu, 03 Dec 2009 23:06:00 +0000</pubDate><atom:updated>2009-12-03T20:49:41.431-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">google</category><category domain="http://www.blogger.com/atom/ns#">android</category><title>What's up with Android Guys at Google?</title><description>Today &lt;a href="http://android-developers.blogspot.com/2009/12/android-sdk-updates.html"&gt;witnessed&lt;/a&gt; the release of 2 (two) new versions of Android: 1.6, Release 2 and 2.0.1, Release 1.&lt;br /&gt;&lt;br /&gt;I'd like to know two things:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Who happened to come up to this horrendous versioning schema and&lt;/li&gt;&lt;li&gt;Where is Android 2.0, Release 1&lt;/li&gt;&lt;/ol&gt;Just in case the news went past the fine gentlemen at Google... Apache Software Foundation has for ages had written &lt;a href="http://commons.apache.org/releases/versioning.html"&gt;versioning guidelines&lt;/a&gt; that Java community came to respect and follow. While the desire to innovate is understandable, the developer community will highly appreciate sticking to the standard.&lt;br /&gt;&lt;br /&gt;Android 2.0 Platform is gone from the developer site. What does &lt;span style="font-style: italic;"&gt;that &lt;/span&gt;mean? Was it a royal screw-up that nobody wants to remember?&lt;br /&gt;&lt;br /&gt;Anyone has a plausible explanation?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5645807251540741658-5147028860326945772?l=blog.burnayev.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/burnayev/~4/_5ZCx7eXJeg" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/burnayev/~3/_5ZCx7eXJeg/whats-up-with-android-guys-at-google.html</link><author>noreply@blogger.com (Borys Burnayev)</author><thr:total>1</thr:total><feedburner:origLink>http://blog.burnayev.com/2009/12/whats-up-with-android-guys-at-google.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5645807251540741658.post-2081226862706865898</guid><pubDate>Mon, 30 Nov 2009 23:55:00 +0000</pubDate><atom:updated>2009-11-30T22:21:24.623-05:00</atom:updated><title>Android Developer Howto: Integration with Quick Search Box</title><description>Quick Search Box is a feature introduced in Android 1.6 that I lauded in a &lt;a href="http://blog.burnayev.com/2009/10/quick-search-box-makes-android.html"&gt;previous post&lt;/a&gt;. If you are an Android developer, the good news is you can make QSB suggest results &lt;span style="font-style: italic;"&gt;from within your application&lt;/span&gt;s.&lt;br /&gt;&lt;br /&gt;The purpose of this post is to provide a human-understandable overview of the process that will allow you to integrate your application with QSB quickly and painlessly.&lt;br /&gt;&lt;br /&gt;To get the job done you need to supply four things: an xml/searchable.xml file, a few entries in your manifest, a content provider that QSB will query for the data, and an activity to handle the taps on your suggestions. In addition to that you'll need to somehow communicate to your users that your application is searchable so that they enable it for search on their phones.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;searchable.xml&lt;br /&gt;&lt;br /&gt;This file, usually named as above and found in res/xml directory, seems to be the logical beginning of the story. It should look similar to this one:&lt;br /&gt;&lt;br /&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;searchable xmlns:android=&amp;quot;http://schemas.android.com/apk/res/android&amp;quot; android:label=&amp;quot;@string/search_label&amp;quot;&lt;br /&gt;    android:searchSettingsDescription=&amp;quot;@string/search_settings_description&amp;quot; android:includeInGlobalSearch=&amp;quot;true&amp;quot;&lt;br /&gt;    android:searchSuggestIntentData=&amp;quot;item&amp;quot; android:searchSuggestAuthority=&amp;quot;com.burnayev.actioncomplete.search&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;/searchable&amp;gt;&lt;br /&gt;&lt;br /&gt;android:label defines the text that a user will see as the name of your application under &lt;span style="font-style: italic;"&gt;More results...&lt;/span&gt; when QSB spews out its suggestions.&lt;br /&gt;&lt;br /&gt;android:searchSettingsDescription is used as the &lt;span style="font-style: italic;"&gt;description &lt;/span&gt;of your searchable items in &lt;span style="font-style: italic;"&gt;Settings/Search/Searchable items&lt;/span&gt; (this is the place where your users will need to navigate to enable your app for QSB suggestions). This is what goes into the &lt;span style="font-style: italic;"&gt;second &lt;/span&gt;line of the row. What goes into the first line (i.e. denotes the name of your application) you'll know in a moment.&lt;br /&gt;&lt;br /&gt;android:includeInGlobalSearch="true" is the magic word that makes QSB care about your efforts.&lt;br /&gt;&lt;br /&gt;android:searchSuggestAuthority tells "the system" what content provider to look for to get the search results from your application.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The Manifest Magic&lt;br /&gt;&lt;br /&gt;You application's manifest has to declare two things: the content provider and the activity that's going to handle the taps on your suggestions in QSB.&lt;br /&gt;&lt;br /&gt;The provider declaration looks like this:&lt;br /&gt;&lt;br /&gt;        &amp;lt;provider android:name=&amp;quot;.SearchProvider&amp;quot; android:authorities=&amp;quot;com.burnayev.actioncomplete.search&amp;quot;&lt;br /&gt;            android:syncable=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;&lt;br /&gt;and defines the provider class name (android:name) as well as the "authority" (android:authorities), which is an identifier that the system uses to figure out who provides what kind of data.&lt;br /&gt;&lt;br /&gt;        &amp;lt;activity android:name=&amp;quot;.activity.GlobalSearchHandler&amp;quot; android:label=&amp;quot;@string/app_name&amp;quot;&amp;gt;&lt;br /&gt;            &amp;lt;intent-filter&amp;gt;&lt;br /&gt;                &amp;lt;action android:name=&amp;quot;android.intent.action.SEARCH&amp;quot; /&amp;gt;&lt;br /&gt;                &amp;lt;category android:name=&amp;quot;android.intent.category.DEFAULT&amp;quot; /&amp;gt;&lt;br /&gt;            &amp;lt;/intent-filter&amp;gt;&lt;br /&gt;            &amp;lt;meta-data android:name=&amp;quot;android.app.searchable&amp;quot;&lt;br /&gt;                    android:resource=&amp;quot;@xml/searchable&amp;quot;/&amp;gt;&lt;br /&gt;        &amp;lt;/activity&amp;gt;&lt;br /&gt;&lt;br /&gt;The snippet above says that GlobalSearchHandler (android:name) is going to handle QSB suggestion taps (intent filter android.intent.action.SEARCH).&lt;br /&gt;&lt;br /&gt;Now the drum roll, please... android:label defines the name of your application in &lt;span style="font-style: italic;"&gt;Settings/Search/Searchable items&lt;/span&gt;. And you thought it wasn't straightforward...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The Content Provider&lt;br /&gt;&lt;br /&gt;This is the centerpiece of the story. It goes like this:&lt;br /&gt;&lt;br /&gt;public class SearchProvider extends ContentProvider {&lt;br /&gt;    public static final String AUTHORITY = &amp;quot;com.burnayev.actioncomplete.search&amp;quot;;&lt;br /&gt;&lt;br /&gt;    private static final String[] COLUMN_NAMES = new String[] { &amp;quot;_id&amp;quot;, SearchManager.SUGGEST_COLUMN_TEXT_1,&lt;br /&gt;            SearchManager.SUGGEST_COLUMN_TEXT_2, SearchManager.SUGGEST_COLUMN_INTENT_ACTION,&lt;br /&gt;            SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID };&lt;br /&gt;    private static final int SEARCH_SUGGEST = 0;&lt;br /&gt;&lt;br /&gt;    private static UriMatcher uriMatcher;&lt;br /&gt;    static {&lt;br /&gt;        uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);&lt;br /&gt;        uriMatcher.addURI(AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY, SEARCH_SUGGEST);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public boolean onCreate() {&lt;br /&gt;        searchDAO = new SearchDAO(getContext());&lt;br /&gt;        return true;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {&lt;br /&gt;        String searchString = uri.getLastPathSegment();&lt;br /&gt;        MatrixCursor cursor = new MatrixCursor(COLUMN_NAMES);&lt;br /&gt;        List&amp;lt;Action&amp;gt; actions = // get your stuff, e.g. query a database or something&lt;br /&gt;        for (Action action : actions) {&lt;br /&gt;            Object[] rowObject = new Object[] { action.getId(), action.getName(), action.getProjectName(),&lt;br /&gt;                    Constants.ACTION_ACTION_DETAILS, action.getId() };&lt;br /&gt;            cursor.addRow(rowObject);&lt;br /&gt;        }&lt;br /&gt;        return cursor;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public String getType(Uri uri) {&lt;br /&gt;        switch (uriMatcher.match(uri)) {&lt;br /&gt;        case SEARCH_SUGGEST:&lt;br /&gt;            return SearchManager.SUGGEST_MIME_TYPE;&lt;br /&gt;&lt;br /&gt;        default:&lt;br /&gt;            throw new IllegalArgumentException(&amp;quot;Unknown URI &amp;quot; + uri);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public Uri insert(Uri uri, ContentValues values) {&lt;br /&gt;        throw new UnsupportedOperationException();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {&lt;br /&gt;        throw new UnsupportedOperationException();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public int delete(Uri uri, String selection, String[] selectionArgs) {&lt;br /&gt;        throw new UnsupportedOperationException();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Notice the AUTHORITY constant. QSB looks at authorities in searchable.xml and queries a matching provider.&lt;br /&gt;&lt;br /&gt;COLUMN_NAMES array is used to define both the way your search suggestions are presented in QSB (SUGGEST_COLUMN_TEXT_1, SUGGEST_COLUMN_TEXT_2) and the manner a suggestion tap is processed by your application (SUGGEST_COLUMN_INTENT_ACTION, SUGGEST_COLUMN_INTENT_DATA_ID).&lt;br /&gt;&lt;br /&gt;The &lt;span style="font-style: italic;"&gt;query &lt;/span&gt;method is where you perform the real search within your application, build a Cursor, and return it for further processing by QSB.&lt;br /&gt;&lt;br /&gt;You gotta decide on a communication mechanism between your search provider and suggestion taps handler. In this example I use SUGGEST_COLUMN_INTENT_ACTION to specify the intent and SUGGEST_COLUMN_INTENT_DATA_ID to specify the particular item id.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Handling Suggestion Taps&lt;br /&gt;&lt;br /&gt;Last but not least you have to decide what to do with the taps on the QSB suggestions for your application. A possible approach is illustrated below:&lt;br /&gt;&lt;br /&gt;public class GlobalSearchHandler extends Activity {&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public void onCreate(Bundle savedInstanceState) {&lt;br /&gt;        super.onCreate(savedInstanceState);&lt;br /&gt;&lt;br /&gt;        Intent intent = getIntent();&lt;br /&gt;        String intentAction = intent.getAction();&lt;br /&gt;        Uri intentData = intent.getData();&lt;br /&gt;        Long id = null;&lt;br /&gt;        try {&lt;br /&gt;            id = intentData.getLastPathSegment() != null ? Long.valueOf(intentData.getLastPathSegment()) : null;&lt;br /&gt;        } catch (NumberFormatException e) {&lt;br /&gt;            // null id may be just fine or it may be not&lt;br /&gt;        }&lt;br /&gt;        if (id != null) {&lt;br /&gt;            Intent targetIntent = new Intent(intentAction);&lt;br /&gt;            // configure the intent based on the retrieved id&lt;br /&gt;            startActivity(targetIntent);&lt;br /&gt;        }&lt;br /&gt;        finish();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;The noteworthy part of the code snippet above is this:&lt;br /&gt;&lt;br /&gt;        String intentAction = intent.getAction();&lt;br /&gt;        Uri intentData = intent.getData();&lt;br /&gt;&lt;br /&gt;Both intent action and intent data are based on the cursor fields you set in your search provider. They allow you to properly delegate further processing to the appropriate part of your application.&lt;br /&gt;&lt;br /&gt;By now you should have a working prototype of your application nicely integrated with Android Quick Search Box. It's time to tell your users to go to &lt;span style="font-style: italic;"&gt;Settings/Search/Searchable items&lt;/span&gt; and enable your application for QSB search suggestions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5645807251540741658-2081226862706865898?l=blog.burnayev.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/burnayev/~4/d5tBQeDEpzY" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/burnayev/~3/d5tBQeDEpzY/android-developer-howto-integration.html</link><author>noreply@blogger.com (Borys Burnayev)</author><thr:total>1</thr:total><feedburner:origLink>http://blog.burnayev.com/2009/11/android-developer-howto-integration.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5645807251540741658.post-6784284438520329755</guid><pubDate>Fri, 27 Nov 2009 13:35:00 +0000</pubDate><atom:updated>2009-11-27T10:04:57.167-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">google</category><category domain="http://www.blogger.com/atom/ns#">android</category><title>Google Maps Navigation vs Garmin Nuvi 265WT</title><description>I've been pleasantly surprised by a recent &lt;a href="http://googlemobile.blogspot.com/2009/11/happy-thanksgiving-travels-google-maps.html"&gt;announcement&lt;/a&gt; about the back-port of Google Maps Navigation to Android 1.6, which all happy T-Mobile G1 owners are supposedly running.&lt;br /&gt;&lt;br /&gt;For the few days since the announcement I've been test-driving the new application to get a feel of whether it's an epochal event or a blip on the technology radar.&lt;br /&gt;&lt;br /&gt;I also happen to have &lt;a href="http://www.amazon.com/Garmin-265WT-Widescreen-Bluetooth-Navigator/dp/B001ELJ9QK/ref=sr_1_1?ie=UTF8&amp;amp;s=electronics&amp;amp;qid=1259329512&amp;amp;sr=8-1"&gt;Garmin Nuvi 265WT&lt;/a&gt; GPS unit at hand, which currently goes for $159.99 at Amazon, thus feeling to be in position to make comparisons and draw conclusions.&lt;br /&gt;&lt;br /&gt;Without further ado I'm going to present my humble findings to the avid reader.&lt;br /&gt;&lt;br /&gt;The best part of the deal with Google Maps Navigation is that it comes to your nearest Android phone at absolutely no cost, i.e. free no strings attached.&lt;br /&gt;&lt;br /&gt;The worst part of the deal with Google Maps Navigation is that you get pretty much what you paid for.&lt;br /&gt;&lt;br /&gt;Diving into the details now...&lt;br /&gt;&lt;br /&gt;GMN (that's Google Maps Navigation) is nicely integrated with GM (that's Google Maps). You get your directions as usual, then choose &lt;span style="font-style: italic;"&gt;Navigate &lt;/span&gt;option and you are in the game.&lt;br /&gt;&lt;br /&gt;Soon after the device gets itself oriented a nice metallic female voice tells you something. After a little practice you come to realize that what is being said at this point is the direction to the start of the route such as "drive South-West ...". Garmin unit would just say something like "proceed to route", which is more succinct and understandable. Garmin's voice sounds much more human-like and is quite a bit more understandable.&lt;br /&gt;&lt;br /&gt;Next goes the regular routine of voice commands that makes you feel good about your navigational abilities. I'm still trying to decide if I prefer quarter miles GMN style or decimal miles Garmin style. I do prefer "turn &lt;span style="font-style: italic;"&gt;to &lt;/span&gt;Main Street" Garmin style announcement to "turn &lt;span style="font-style: italic;"&gt;at&lt;/span&gt; Main Street" GMN style announcement.&lt;br /&gt;&lt;br /&gt;I happen to live in an area where a lot of road construction is going on and was expecting GMN to beat Garmin to the punch with the accuracy of the maps. No such luck. Google maps are as inaccurate as one year old Garmin maps installed on my GPS unit.&lt;br /&gt;&lt;br /&gt;My major expectation about a GPS navigation system is it's going to tell me where to go when I need it and that's exactly what my Garmin unit does. GMN does the same except when it doesn't feel like that... At one point on a test drive I realized that my phone was rebooting itself instead of telling me where to go.&lt;br /&gt;&lt;br /&gt;GMN builds routes as quickly as Garmin but Garmin's routes are generally faster in terms of travel time and better in terms of convenience.&lt;br /&gt;&lt;br /&gt;My Garmin GPS unit came with a nice dashboard mount and a car charger. My phone didn't. Unless you are voice-guiding your short office commute, which you probably know as the back of your hand, you'll want a charger. Unless you absolutely don't care about the route your GPS unit happened to choose, you'll want a dashboard mount. Both the charger and the mount are going to spoil that great "get-for-free" feeling for some.&lt;br /&gt;&lt;br /&gt;There's been a lot of talk recently on how Google Maps Navigation is going to drive traditional providers of GPS navigation systems out of business. My brief testing makes me believe that as of now GMN is highly beneficial for Garmin, TomTom, and other GPS nav manufacturers as it essentially provides them with free marketing services demonstrating what one can expect from a GPS navigation system to a crowd that might have not ever considered such a system otherwise.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5645807251540741658-6784284438520329755?l=blog.burnayev.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/burnayev/~4/7XQQCB8K1iY" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/burnayev/~3/7XQQCB8K1iY/google-maps-navigation-vs-garmin-nuvi.html</link><author>noreply@blogger.com (Borys Burnayev)</author><thr:total>1</thr:total><feedburner:origLink>http://blog.burnayev.com/2009/11/google-maps-navigation-vs-garmin-nuvi.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5645807251540741658.post-2006080492748459492</guid><pubDate>Tue, 17 Nov 2009 23:25:00 +0000</pubDate><atom:updated>2009-11-17T19:52:02.411-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">android</category><title>Android Developer Tip: Regenerating R.java</title><description>I've just spent half an hour trying to fathom how to get back my auto-generated R.java that magically disappeared at some point.&lt;br /&gt;&lt;br /&gt;The usual ways of resolving issues such as clean build, restarting IDE, and wiping the screen clean with a damp cloth didn't work.&lt;br /&gt;&lt;br /&gt;Googling around did reveal a lot of similar complaints and revived a stark deja vu feeling. The hilarious thing is that once the R guy is gone, a good chunk of your code goes red thus adding to the insult.&lt;br /&gt;&lt;br /&gt;Rather than continuing the discovery of all the conceivable strains of the issue found in the wild, I decided to leverage the tried-and-true approach of staring at the code. Having done so for a while I spotted a few red guys under &lt;span style="font-style: italic;"&gt;res &lt;/span&gt;folder. They were a leftover of my current redesign work that I was about to delete before things went awry. Sure enough, as soon as I hit Del on them the darn R thing automagically reappeared.&lt;br /&gt;&lt;br /&gt;The moral of the story is there's just so much magic Google can do for us. Bad resources (e.g. layouts with errors) are not treated gracefully by Google Android Eclipse plugin and can deceive it into deleting R.java with no sound reason.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5645807251540741658-2006080492748459492?l=blog.burnayev.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/burnayev/~4/JzS8yh5xf-Y" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/burnayev/~3/JzS8yh5xf-Y/android-developer-tip-regenerating.html</link><author>noreply@blogger.com (Borys Burnayev)</author><thr:total>5</thr:total><feedburner:origLink>http://blog.burnayev.com/2009/11/android-developer-tip-regenerating.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5645807251540741658.post-6379075684292495797</guid><pubDate>Fri, 02 Oct 2009 21:45:00 +0000</pubDate><atom:updated>2009-10-02T18:22:26.223-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">google</category><category domain="http://www.blogger.com/atom/ns#">android</category><title>Quick Search Box Makes Android Smartphones Genuine Google Phones</title><description>Android 1.6 aka Donut that's being pushed over the air to happy owners of T-Mobile G1 brings us a number of &lt;a href="http://developer.android.com/sdk/android-1.6-highlights.html"&gt;new and exciting features&lt;/a&gt;. The one that I'm going to highlight in this post is Quick Search Box.&lt;br /&gt;&lt;br /&gt;The idea behind the quick search is to allow a user to enter a search term and intelligently find the most relevant results be it a person in the Contacts list, an application on the phone, a nearby restaurant, or a web property. It goes as far as finding relevant results within applications enabled for such functionality.&lt;br /&gt;&lt;br /&gt;What's interesting is that such a seemingly minor feature radically changes the way you interact with your Android phone. Need to call Jim? Type "Jim" in the search box and go from there. Out of gas? Type "gas" in the search box and go from there. Want to launch The Weather Channel app to check the weekend forecast?.. You got the idea.&lt;br /&gt;&lt;br /&gt;Search-focused navigation paradigm promoted by quick search box brings Google spirit to Android phones. Like with Google.com or Gmail you search and find. In addition to that what you find on your Android phone is highly personalized and location-savvy. If you don't have an Android phone, buy one and try it for yourself.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5645807251540741658-6379075684292495797?l=blog.burnayev.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/burnayev/~4/Q1nZR9RCerU" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/burnayev/~3/Q1nZR9RCerU/quick-search-box-makes-android.html</link><author>noreply@blogger.com (Borys Burnayev)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.burnayev.com/2009/10/quick-search-box-makes-android.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5645807251540741658.post-5117773286278614688</guid><pubDate>Wed, 09 Sep 2009 00:19:00 +0000</pubDate><atom:updated>2009-09-08T21:19:27.978-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">android</category><title>Let the Epic Divide Begin - HTC Announces Tattoo</title><description>In today's &lt;a href="http://www.htc.com/www/press.aspx?id=110136&amp;amp;lang=1033"&gt;press release&lt;/a&gt;, HTC announced yet another Android phone - Tattoo.&lt;br /&gt;&lt;br /&gt;I'm not too fond of tattoos but that's not the point. What &lt;a href="http://www.htc.com/www/product/tattoo/specification.html"&gt;differentiates&lt;/a&gt; this phone from all of its Android predecessors that made it to the market so far is its meager screen resolution of 240 x 320. Yes, that's what you get when you put a &lt;a href="http://www.mobiletechreview.com/phones/BlackBerry-8700g.htm"&gt;dated BlackBerry&lt;/a&gt; on its side.&lt;br /&gt;&lt;br /&gt;As Android framework engineer Dianne Hackborn &lt;a href="http://groups.google.com/group/android-developers/msg/18e5518ebe1aeb14?hl=en"&gt;points out&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;One of the important things to know about the QVGA devices like this is that&lt;br /&gt;none of the existing apps will show up on the market there, because until&lt;br /&gt;1.6 developers have had no requirement to design for a smaller screen, and&lt;br /&gt;there is little the platform can do to make existing apps work on a smaller&lt;br /&gt;screen with a good experience.&lt;/blockquote&gt;Then she goes on about UI fiddling, alternative layouts, and low-density graphics.&lt;br /&gt;&lt;br /&gt;It's all good and well other than I'm not gonna do that.&lt;br /&gt;&lt;br /&gt;For many Android applications, &lt;a href="http://actioncomplete.com"&gt;ActionComplete&lt;/a&gt; included, the main differentiating factor is a neat and clean user interface. Addressing a different screen size is roughly equivalent to redoing 50% of the application.&lt;br /&gt;&lt;br /&gt;Given the current Android market share, it's strictly prohibitive to develop for particular screen sizes or anything particular for that matter.&lt;br /&gt;&lt;br /&gt;If you are an indie Android developer, here goes my advice. Don't waste your time on all kinds of weird configurations that device manufacturers might come up to - keeping up with that is a losing game.&lt;br /&gt;&lt;br /&gt;Reach out to you users and ask them what they want, separate the wheat from the chaff, and create a beautiful user experience for a screen of your choice.&lt;br /&gt;&lt;br /&gt;Don't let the fragmentation happen. When they see there's nothing ahead for outdated phones, the device manufacturers will have nothing to do but to accept the developer-friendly rules of the game.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5645807251540741658-5117773286278614688?l=blog.burnayev.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/burnayev/~4/xAhWZqhEi-8" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/burnayev/~3/xAhWZqhEi-8/let-epic-divide-begin-htc-announces.html</link><author>noreply@blogger.com (Borys Burnayev)</author><thr:total>2</thr:total><feedburner:origLink>http://blog.burnayev.com/2009/09/let-epic-divide-begin-htc-announces.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5645807251540741658.post-2055979583687945656</guid><pubDate>Tue, 11 Aug 2009 00:50:00 +0000</pubDate><atom:updated>2009-08-11T08:29:43.136-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">java</category><category domain="http://www.blogger.com/atom/ns#">spring</category><category domain="http://www.blogger.com/atom/ns#">google</category><title>SpringSource Course on Infrastructure Pays Out</title><description>This is unexpected but logical. SpringSource has been &lt;a href="http://blog.springsource.com/2009/08/10/springsource-chapter-two/"&gt;acquired&lt;/a&gt; by VMware.&lt;br /&gt;&lt;br /&gt;As Rod Johnson mentions in his blog post there are no product overlaps between two companies, which makes the acquisition a conglomeration type of a deal.&lt;br /&gt;&lt;br /&gt;On the other hand, if we looked closely at the developments within SpringSource during the past year or so, we would see an accelerating deviation away from the core Java framework business and towards the deployment infrastructure business.&lt;br /&gt;&lt;br /&gt;There is a lot of synergy between the companies indeed. In the enterprise, Java is increasingly deployed on virtual infrastructure powered by VMware. An integrated solution seems like a very solid business opportunity and will likely have a significant buy-in in the Java-heavy enterprise.&lt;br /&gt;&lt;br /&gt;What's bothering about SpringSource is the stagnating rate of innovation in their core business of Java frameworks. Most of the development on the Java front seems to be shaped around SpringSource's commercial offerings.  Valuable projects of general interest like Groovy/Grails Eclipse integration don't seem to get enough resources allocated to drive them to a release fast.&lt;br /&gt;&lt;br /&gt;Which leaves us with Google as the innovation leader in the Java space. Not to diminish the role of the search titan, a healthy ecosystem needs many living things to thrive. Another entity will eventually step up and challenge. Who that will be?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5645807251540741658-2055979583687945656?l=blog.burnayev.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/burnayev/~4/TtXrf-lc6Ds" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/burnayev/~3/TtXrf-lc6Ds/springsource-course-on-infrastructure.html</link><author>noreply@blogger.com (Borys Burnayev)</author><thr:total>1</thr:total><feedburner:origLink>http://blog.burnayev.com/2009/08/springsource-course-on-infrastructure.html</feedburner:origLink></item></channel></rss>
