<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CkYBQHs5eip7ImA9WxNUGE4.&quot;"><id>tag:blogger.com,1999:blog-6755709643044947179</id><updated>2009-11-09T21:15:51.522-08:00</updated><title type="text">Android Developers Blog</title><subtitle type="html">An Open Handset Alliance Project.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://android-developers.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://android-developers.blogspot.com/" /><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/6755709643044947179/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>David McLaughlin, Developer Advocate</name><uri>http://www.blogger.com/profile/15001019201575108829</uri><email>noreply@blogger.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>101</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><link rel="self" href="http://feeds.feedburner.com/blogspot/hsDu" type="application/atom+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry gd:etag="W/&quot;DkEEQH8-eip7ImA9WxNUFEU.&quot;"><id>tag:blogger.com,1999:blog-6755709643044947179.post-7664005808214560319</id><published>2009-11-05T21:15:00.000-08:00</published><updated>2009-11-05T21:16:41.152-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-05T21:16:41.152-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Android Developer Challenge" /><title>ADC 2 Round 2 Voting Open</title><content type="html">&lt;p&gt;&lt;img src="http://1.bp.blogspot.com/_8qPyDn7SSew/SrujUM53ojI/AAAAAAAAAAM/yIUzCeuXcP4/s320/icon.png" align="left"&gt;The results from ADC 2 Round 1 are now tabulated and verified. With the &lt;a href="http://code.google.com/android/adc/adc2_top200.html"&gt;top 200 applications&lt;/a&gt; identified, it's time to begin the final round judging. Be sure to download the ADC 2 judging application, or update your existing application, and help us select the final winners!&lt;/p&gt;&lt;p&gt;For the final round, both users and a Google-selected panel of industry judges will provide votes to determine the final winners. Prizes will be distributed to the top 3 entrants in each of the 10 categories, and the top 3 overall entrants will receive additional prizes. Please see our &lt;a href="http://code.google.com/android/adc/"&gt;reference page for full challenge information&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Your vote is critical! We will keep voting open until we have received sufficient votes for all of the applications. We encourage you to download the ADC 2 judging application and evaluate entrants for yourself.&lt;/p&gt;&lt;p&gt;Download &lt;i&gt;Android Developer Challenge 2:&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://chart.apis.google.com/chart?cht=qr&amp;chs=230x230&amp;chl=http%3A%2F%2Fmarket.android.com%2Fsearch%3Fq%3Dpname%3Acom.google.android.challenge"&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6755709643044947179-7664005808214560319?l=android-developers.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=J0u8F4frjYA:3wGAaPtXvqo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/hsDu?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=J0u8F4frjYA:3wGAaPtXvqo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/hsDu?i=J0u8F4frjYA:3wGAaPtXvqo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/hsDu/~4/J0u8F4frjYA" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6755709643044947179/posts/default/7664005808214560319?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6755709643044947179/posts/default/7664005808214560319?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/hsDu/~3/J0u8F4frjYA/adc-2-round-2-voting-open.html" title="ADC 2 Round 2 Voting Open" /><author><name>Eric Chu, Android Mobile Platform</name><uri>http://www.blogger.com/profile/11243666057159213807</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00850393112957401966" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_8qPyDn7SSew/SrujUM53ojI/AAAAAAAAAAM/yIUzCeuXcP4/s72-c/icon.png" height="72" width="72" /><feedburner:origLink>http://android-developers.blogspot.com/2009/11/adc-2-round-2-voting-open.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0QNR3w7fyp7ImA9WxNUEUQ.&quot;"><id>tag:blogger.com,1999:blog-6755709643044947179.post-2533870443660471218</id><published>2009-11-02T14:00:00.000-08:00</published><updated>2009-11-02T14:03:16.207-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-02T14:03:16.207-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Announcements" /><title>Bring Your Lab Coats</title><content type="html">&lt;p&gt;&lt;img src="http://docs.google.com/a/google.com/File?id=ad9xdxhtb4_11sjkgrmfb_b" style="width: 200px; height: 200px; float: right; margin-left: 1em; margin-right: 0px" /&gt;With the recent release of &lt;a href="http://android-developers.blogspot.com/2009/10/announcing-android-20-support-in-sdk.html"&gt;Android 2.0&lt;/a&gt; and the growing number of available devices, we want to give developers a convenient way to test drive their apps on these new devices.  We also want to make our Android advocates available to answer any questions you may have.&lt;/p&gt;&lt;p&gt;We are pleased to announce that we will host a series of all day Android developer labs over the next month in the following cities (dates in local time):&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Mountain View, CA - Nov 9&lt;/li&gt;&lt;li&gt;New York, NY - Nov 16&lt;/li&gt;&lt;li&gt;London, UK - Nov 17&lt;/li&gt;&lt;li&gt;Tokyo, JP - Nov 18&lt;/li&gt;&lt;li&gt;Taipei, TW - Nov 20&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Due to limited space, developers who have already published an application in Android Market will be given priority.  You can request a spot on a first-come, first-serve basis by going to &lt;a href="https://spreadsheets.google.com/viewform?formkey=dFpqYlZieG51bnc5bXZuRmhsWDVodGc6MQ"&gt;this page&lt;/a&gt;.  We will send a follow-up email with venue information and other registration details to those who have secured a spot.&lt;/p&gt;&lt;p&gt;Thank you for your continued excitement in Android.  We look forward to meeting many of you in the coming weeks!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6755709643044947179-2533870443660471218?l=android-developers.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=Fan-r7c2jJ8:MR4JvQvYFts:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/hsDu?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=Fan-r7c2jJ8:MR4JvQvYFts:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/hsDu?i=Fan-r7c2jJ8:MR4JvQvYFts:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/hsDu/~4/Fan-r7c2jJ8" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6755709643044947179/posts/default/2533870443660471218?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6755709643044947179/posts/default/2533870443660471218?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/hsDu/~3/Fan-r7c2jJ8/bring-your-lab-coats.html" title="Bring Your Lab Coats" /><author><name>Eric Chu, Android Mobile Platform</name><uri>http://www.blogger.com/profile/11243666057159213807</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00850393112957401966" /></author><feedburner:origLink>http://android-developers.blogspot.com/2009/11/bring-your-lab-coats.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A08ASH06eyp7ImA9WxNVFkg.&quot;"><id>tag:blogger.com,1999:blog-6755709643044947179.post-4733849905252817490</id><published>2009-10-27T09:00:00.000-07:00</published><updated>2009-10-27T09:10:49.313-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-27T09:10:49.313-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Android 2.0" /><category scheme="http://www.blogger.com/atom/ns#" term="SDK updates" /><category scheme="http://www.blogger.com/atom/ns#" term="Announcements" /><title>Announcing Android 2.0 support in the SDK!</title><content type="html">&lt;p&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px; height: 200px;" src="http://3.bp.blogspot.com/_kNUIczJH1OM/SuYtG1H7bkI/AAAAAAAAAA0/DfNn2agKf_U/s320/eclair.png" alt="" id="BLOGGER_PHOTO_ID_5397050798812917314" border="0" /&gt;I am excited to announce that the Android SDK now supports Android 2.0 (also known as Eclair).&lt;/p&gt;&lt;p&gt;Android 2.0 brings new developer APIs for sync, Bluetooth, and a few other areas. Using the new sync, account manager and contacts APIs, you can write applications to enable users to sync their devices to various contact sources. You can also give users a faster way to communicate with others by embedding Quick Contact within your application. With the new Bluetooth API, you can now easily add peer-to-peer connectivity or gaming to your applications. To get a more complete list of the new capabilities you can add to your applications, please go to the &lt;a href="http://developer.android.com/sdk/android-2.0-highlights.html" onclick="javascript: pageTracker._trackPageview('/outgoing/sdk-2.0-blogpost/highlights-2.0');" title="Android 2.0 highlights"&gt;Android 2.0 highlights&lt;/a&gt; page.&lt;/p&gt;&lt;p&gt;Current developers can use the &lt;a href="http://developer.android.com/sdk/adding-components.html" onclick="javascript: pageTracker._trackPageview('/outgoing/sdk-2.0-blogpost/sdk-manager');" title="SDK Manager"&gt;SDK Manager&lt;/a&gt; to add Android 2.0 support to their SDK as well as update their SDK Tools to revision 3. New developers can download the Android SDK from the &lt;a href="http://developer.android.com/sdk/index.html" onclick="javascript: pageTracker._trackPageview('/outgoing/sdk-2.0-blogpost/download-site');" title="download site"&gt;download site&lt;/a&gt;. After the download, Android platforms must be added using the SDK Manager&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 238px;" src="http://3.bp.blogspot.com/_kNUIczJH1OM/SuYvEWkptmI/AAAAAAAAABE/EVhqXNiz6pM/s400/sdkmanager.png" alt="" id="BLOGGER_PHOTO_ID_5397052955275408994" border="0" /&gt;&lt;span style="font-size:85%;"&gt;The SDK Manager allows you to add new Android platforms to your SDK.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://developer.android.com/sdk/tools-notes.html" onclick="javascript: pageTracker._trackPageview('/outgoing/sdk-2.0-blogpost/sdk-tools-rev3');" title="Android SDK Tools, revision 3"&gt;Android SDK Tools, revision 3&lt;/a&gt; is required to develop for Android 2.0. It includes support for code coverage through the Ant build system, as well as Mac OS X 10.6 (Snow Leopard) support for the SDK and related tools. For those of you who develop using Eclipse, we are releasing &lt;a href="http://developer.android.com/sdk/adt-notes.html" onclick="javascript: pageTracker._trackPageview('/outgoing/sdk-2.0-blogpost/adt-version-0.9.4');" title="ADT version 0.9.4"&gt;ADT version 0.9.4&lt;/a&gt; through the usual Eclipse &lt;a href="http://developer.android.com/sdk/eclipse-adt.html" onclick="javascript: pageTracker._trackPageview('/outgoing/sdk-2.0-blogpost/adt-update-mechanism');" title="update mechanism"&gt;update mechanism&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Over the next few months, we expect to see more and more Android devices being released.  These devices will be running Android 1.5, 1.6, or 2.0. We are also planning a minor version update of Android 2.0 towards the end of the year, and that will be the last update for 2009. Below are some of the things you can do to be better prepared:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Download the Android 2.0 platform and make sure your existing apps continue to work on new devices running Android 2.0.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Make sure that your apps work when using the WVGA (800x480) &amp;amp; FWVGA (854x480) emulator skins. We expect devices with these types of screen, running Android 2.0 to be launched soon.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Checkout the video below for more information about Android 2.0.&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;object width="560" height="340"&gt;&lt;param name="movie" value="http://www.youtube.com/v/opZ69P-0Jbc&amp;amp;hl=en&amp;amp;fs=1&amp;amp;"&gt;
&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/opZ69P-0Jbc&amp;amp;hl=en&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6755709643044947179-4733849905252817490?l=android-developers.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=ZYOQZ97qkCQ:UbHPxLX_thE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/hsDu?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=ZYOQZ97qkCQ:UbHPxLX_thE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/hsDu?i=ZYOQZ97qkCQ:UbHPxLX_thE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/hsDu/~4/ZYOQZ97qkCQ" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6755709643044947179/posts/default/4733849905252817490?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6755709643044947179/posts/default/4733849905252817490?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/hsDu/~3/ZYOQZ97qkCQ/announcing-android-20-support-in-sdk.html" title="Announcing Android 2.0 support in the SDK!" /><author><name>Xavier Ducrohet, Android SDK Tech Lead</name><uri>http://www.blogger.com/profile/00361998914767345309</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="14283194986884703640" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_kNUIczJH1OM/SuYtG1H7bkI/AAAAAAAAAA0/DfNn2agKf_U/s72-c/eclair.png" height="72" width="72" /><feedburner:origLink>http://android-developers.blogspot.com/2009/10/announcing-android-20-support-in-sdk.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A04FRn4zeip7ImA9WxNVFkw.&quot;"><id>tag:blogger.com,1999:blog-6755709643044947179.post-2669477647071983497</id><published>2009-10-23T14:00:00.000-07:00</published><updated>2009-10-26T22:05:17.082-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-26T22:05:17.082-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="How-to" /><category scheme="http://www.blogger.com/atom/ns#" term="Android 1.6" /><category scheme="http://www.blogger.com/atom/ns#" term="User Interface" /><title>UI framework changes in Android 1.6</title><content type="html">&lt;p&gt;Android 1.6 introduces numerous enhancements and bug fixes in the UI framework. Today, I'd like to highlight &lt;strike&gt;three&lt;/strike&gt; two improvements in particular.&lt;/p&gt;&lt;h3&gt;Optimized drawing&lt;/h3&gt;&lt;p&gt;The UI toolkit introduced in Android 1.6 is aware of which views are opaque and can use this information to avoid drawing views that the user will not be able to see. Before Android 1.6, the UI toolkit would sometimes perform unnecessary operations by drawing a window background when it was obscured by a full-screen opaque view. A &lt;a href="http://android-developers.blogspot.com/2009/03/window-backgrounds-ui-speed.html" title="workaround"&gt;workaround&lt;/a&gt; was available to avoid this, but the technique was limited and required work on your part. With Android 1.6, the UI toolkit determines whether a view is opaque by simply querying the opacity of the background drawable.  &lt;strike&gt;If you know that your view is going to be opaque but that information does not depend on the background drawable, you can simply override the method called isOpaque():&lt;/strike&gt;&lt;/p&gt;&lt;pre&gt;&lt;strike&gt;@Override
public boolean isOpaque() {
    return true;
}&lt;/strike&gt;&lt;/pre&gt;&lt;p&gt;&lt;strike&gt;The value returned by isOpaque() does not have to be constant and can change at any time. For instance, the implementation of ListView in Android 1.6 indicates that a list is opaque only when the user is scrolling it.&lt;/strike&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Updated&lt;/strong&gt;: Our apologies&amp;mdash;we spoke to soon about isOpaque(). It will be available in a future update to the Android platform.&lt;/p&gt;&lt;h3&gt;More flexible, more robust RelativeLayout&lt;/h3&gt;&lt;p&gt;RelativeLayout is the most versatile layout offered by the Android UI toolkit and can be successfully used to reduce the number of views created by your applications. This layout used to suffer from various bugs and limitations, sometimes making it difficult to use without having some knowledge of its implementation. To make your life easier, Android 1.6 comes with a revamped RelativeLayout. This new implementation not only fixes all known bugs in RelativeLayout (&lt;a href="http://b.android.com/" title="let us know"&gt;let us know&lt;/a&gt; when you find new ones) but also addresses its major limitation: the fact that views had to be declared in a particular order. Consider the following XML layout:&lt;/p&gt;&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;

&amp;lt;RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="64dip"
    android:padding="6dip"&amp;gt;

    &amp;lt;TextView
        android:id="@+id/band"  
        android:layout_width="fill_parent" 
        android:layout_height="26dip" 

        android:layout_below="@+id/track"
        android:layout_alignLeft="@id/track"
        android:layout_alignParentBottom="true"

        android:gravity="top"
        android:text="The Airborne Toxic Event" /&amp;gt;

    &amp;lt;TextView
        android:id="@id/track"  
        android:layout_marginLeft="6dip"
        android:layout_width="fill_parent"
        android:layout_height="26dip"

        android:layout_toRightOf="@+id/artwork"

        android:textAppearance="?android:attr/textAppearanceMedium"
        android:gravity="bottom"
        android:text="Sometime Around Midnight" /&amp;gt;
        
    &amp;lt;ImageView
        android:id="@id/artwork"
        android:layout_width="56dip"
        android:layout_height="56dip"
        android:layout_gravity="center_vertical"

        android:src="@drawable/artwork" /&amp;gt;
        
&amp;lt;/RelativeLayout&amp;gt;&lt;/pre&gt;&lt;p&gt;This code builds a very simple layout&amp;mdash;an image on the left with two lines of text stacked vertically. This XML layout is perfectly fine and contains no errors. Unfortunately, Android 1.5's RelativeLayout is incapable of rendering it correctly, as shown in the screenshot below.&lt;/p&gt;&lt;p style="text-align: left;"&gt;&lt;img src="http://docs.google.com/a/google.com/File?id=cf49fh6b_2fx9rdhqc_b" style="width: 320px; height: 480px;"&gt;&lt;/p&gt;&lt;p&gt;The problem is that this layout uses forward references. For instance, the "band" TextView is positioned below the "track" TextView but "track" is declared after "band" and, in Android 1.5, RelativeLayout does not know how to handle this case. Now look at the exact same layout running on Android 1.6:&lt;/p&gt;&lt;p style="text-align: left;"&gt;&lt;img src="http://docs.google.com/a/google.com/File?id=cf49fh6b_3dcwcmnfj_b" style="width: 320px; height: 480px;"&gt;&lt;/p&gt;&lt;p&gt;As you can see Android 1.6 is now better able to handle forward reference. The result on screen is exactly what you would expect when writing the layout.&lt;/p&gt;&lt;h3&gt;Easier click listeners&lt;/h3&gt;&lt;p&gt;Setting up a click listener on a button is very common task, but it requires quite a bit of boilerplate code:&lt;/p&gt;&lt;pre&gt;findViewById(R.id.myButton).setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        // Do stuff
    }
});&lt;/pre&gt;&lt;p&gt;One way to reduce the amount of boilerplate is to share a single click listener between several buttons. While this technique reduces the number of classes, it still requires a fair amount of code and it still requires giving each button an id in your XML layout file:&lt;/p&gt;&lt;pre&gt;View.OnClickListener handler = View.OnClickListener() {
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.myButton: // doStuff
                break;
            case R.id.myOtherButton: // doStuff
                break;
        }
    }
}

findViewById(R.id.myButton).setOnClickListener(handler);
findViewById(R.id.myOtherButton).setOnClickListener(handler);&lt;/pre&gt;&lt;p&gt;With Android 1.6, none of this is necessary. All you have to do is declare a public method in your Activity to handle the click (the method &lt;i&gt;must&lt;/i&gt; have one View argument):&lt;/p&gt;&lt;pre&gt;class MyActivity extends Activity {
    public void myClickHandler(View target) {
        // Do stuff
    }
}&lt;/pre&gt;&lt;p&gt;And then reference this method from your XML layout:&lt;/p&gt;&lt;pre&gt;&amp;lt;Button android:onClick="myClickHandler" /&amp;gt;&lt;/pre&gt;&lt;p&gt;This new feature reduces both the amount of Java and XML you have to write, leaving you more time to concentrate on your application.&lt;/p&gt;&lt;p&gt;The Android team is committed to helping you write applications in the easiest and most efficient way possible. We hope you find these improvements useful and we're excited to see your applications on Android Market.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6755709643044947179-2669477647071983497?l=android-developers.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=XKv28OTvZsM:yq5iDKtF7JU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/hsDu?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=XKv28OTvZsM:yq5iDKtF7JU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/hsDu?i=XKv28OTvZsM:yq5iDKtF7JU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/hsDu/~4/XKv28OTvZsM" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6755709643044947179/posts/default/2669477647071983497?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6755709643044947179/posts/default/2669477647071983497?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/hsDu/~3/XKv28OTvZsM/ui-framework-changes-in-android-16.html" title="UI framework changes in Android 1.6" /><author><name>Romain Guy</name><uri>http://www.blogger.com/profile/02088413553272408047</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04735073885883787586" /></author><feedburner:origLink>http://android-developers.blogspot.com/2009/10/ui-framework-changes-in-android-16.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkYNQnc9fSp7ImA9WxNWEUk.&quot;"><id>tag:blogger.com,1999:blog-6755709643044947179.post-8010134788877108883</id><published>2009-10-08T18:53:00.001-07:00</published><updated>2009-10-09T19:03:13.965-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-09T19:03:13.965-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="How-to" /><category scheme="http://www.blogger.com/atom/ns#" term="Android 1.6" /><category scheme="http://www.blogger.com/atom/ns#" term="User Interface" /><title>Support for additional screen resolutions and densities in Android</title><content type="html">&lt;p&gt;You may have heard that &lt;a href="http://android-developers.blogspot.com/2009/09/android-16-sdk-is-here.html"&gt;one of the key changes&lt;/a&gt; introduced in Android 1.6 is support for new screen sizes.  This is one of the things that has me very excited about Android 1.6 since it means Android will start becoming available on so many more devices. However, as a developer, I know this also means a bit of additional work. That's why we've spent quite a bit of time making it as easy as possible for you to update your apps to work on these new screen sizes.&lt;/p&gt;&lt;p&gt;To date, all Android devices (such as the T-Mobile G1 and Samsung I7500, among others) have had HVGA (320x480) screens. The essential change in Android 1.6 is that we've expanded support to include three different classes of screen sizes:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;small: devices with a screen size smaller than the T-Mobile G1 or Samsung I7500, for example the recently announced HTC Tattoo&lt;/li&gt;&lt;li&gt;normal: devices with a screen size roughly the same as the G1 or I7500.&lt;/li&gt;&lt;li&gt;large: devices with a screen size larger than the G1 or I7500 (such as a tablet-style device.)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Any given device will fall into one of those three groups.  As a developer, you can control if and how your app appears to devices in each group by using a few tools we've introduced in the Android framework APIs and SDK.  &lt;a href="http://d.android.com/guide/practices/screens_support.html"&gt;The documentation at the developer site&lt;/a&gt; describes each of these tools in detail, but here they are in a nutshell:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;new attributes in AndroidManifest for an application to specify what kind of screens it supports,&lt;/li&gt;&lt;li&gt;framework-level support for using image drawables/layouts correctly regardless of screen size,&lt;/li&gt;&lt;li&gt;a compatibility mode for existing applications, providing a pseudo-HVGA environment, and descriptions of compatible device resolutions and minimum diagonal sizes.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The documentation also provides a quick checklist and testing tips for developers to ensure their apps will run correctly on devices of any screen size.&lt;/p&gt;&lt;p&gt;Once you've upgraded your app using Android 1.6 SDK, you'll need to make sure your app is only available to users whose phones can properly run it.  To help you with that, we've also added some new tools to Android Market.&lt;/p&gt;&lt;p&gt;Until the next time you upload a new version of your app to Android Market, we will assume that it works for normal-class screen sizes. This means users with normal-class and large-class screens will have access to these apps. Devices with "large" screens simply run these apps in a compatibility mode, which simulates an HVGA environment on the larger screen.&lt;/p&gt;&lt;p&gt;Devices with small-class screens, however, will only be shown apps which explicitly declare (via the AndroidManifest) that they will run properly on small screens.  In our studies, we found that "squeezing" an app designed for a larger screen onto a smaller screen often produces a bad result. To prevent users with small screens from getting a bad impression of your app (and reviewing it negatively!), Android Market makes sure that they can't see it until you upload a new version that declares itself compatible.&lt;/p&gt;&lt;p&gt;We expect small-class screens, as well as devices with additional resolutions in &lt;a href="http://d.android.com/guide/practices/screens_support.html"&gt;Table 1 in the developer document&lt;/a&gt; to hit the market in time for the holiday season. Note that not all devices will be upgraded to Android 1.6 at the same time.  There will be significant number of users still with Android 1.5 devices. To use the same apk to target Android 1.5 devices and Android 1.6 devices, build your apps using Android 1.5 SDK and test your apps on both Android 1.5 and 1.6 system images to make sure they continue to work well on both types of devices. If you want to target small-class devices like HTC Tattoo, please build your app using the Android 1.6 SDK. Note that if your application requires Android 1.6 features, but does not support a screen class, you need to set the appropriate attributes to false. To use optimized assets for normal-class, high density devices like WVGA, or for low density devices please use the Android 1.6 SDK.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6755709643044947179-8010134788877108883?l=android-developers.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=pNHtAB04Xs0:LZzPSg7E2yU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/hsDu?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=pNHtAB04Xs0:LZzPSg7E2yU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/hsDu?i=pNHtAB04Xs0:LZzPSg7E2yU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/hsDu/~4/pNHtAB04Xs0" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6755709643044947179/posts/default/8010134788877108883?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6755709643044947179/posts/default/8010134788877108883?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/hsDu/~3/pNHtAB04Xs0/support-for-additional-screen.html" title="Support for additional screen resolutions and densities in Android" /><author><name>Romain Guy</name><uri>http://www.blogger.com/profile/14359137835485363401</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="11053364165382206530" /></author><feedburner:origLink>http://android-developers.blogspot.com/2009/10/support-for-additional-screen.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0YFQns6fCp7ImA9WxNXGEg.&quot;"><id>tag:blogger.com,1999:blog-6755709643044947179.post-4800777703451368030</id><published>2009-10-06T10:45:00.000-07:00</published><updated>2009-10-06T10:45:13.514-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-06T10:45:13.514-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Android Developer Challenge" /><title>ADC 2 Round 1 Scoring Complete</title><content type="html">&lt;img src="http://1.bp.blogspot.com/_8qPyDn7SSew/SrujUM53ojI/AAAAAAAAAAM/yIUzCeuXcP4/s320/icon.png" align="right" alt="ADC 2 icon"&gt;&lt;p&gt;The response to round one of the Android Developer Challenge 2 has been phenomenal!  We originally expected that it would take two weeks to get all the necessary data to complete scoring.  Over the last 10 days, more than 26,000 Android users reviewed and submitted our target of over 100 scores per application.  With this enthusiastic support of the Android community, we are closing the first round of ADC 2 judging today.&lt;/p&gt;&lt;p&gt;We will now be reviewing the results and preparing for round 2.  Please stay tuned for information about round 2, where the community, combined with a panel of judges, will narrow down the top 20 applications in each category to determine the final winners. Until then, users with the ADC 2 judging application currently installed will get a notice saying that round 1 is over. When round 2 opens, the judging application will resume giving out new submissions to score. We look forward to seeing the results of the final round and hope that you choose to help us score these top apps as well!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6755709643044947179-4800777703451368030?l=android-developers.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=GzYb1MKkwB4:HhxANarPfTY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/hsDu?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=GzYb1MKkwB4:HhxANarPfTY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/hsDu?i=GzYb1MKkwB4:HhxANarPfTY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/hsDu/~4/GzYb1MKkwB4" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6755709643044947179/posts/default/4800777703451368030?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6755709643044947179/posts/default/4800777703451368030?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/hsDu/~3/GzYb1MKkwB4/adc-2-round-1-scoring-complete.html" title="ADC 2 Round 1 Scoring Complete" /><author><name>Eric Chu, Android Mobile Platform</name><uri>http://www.blogger.com/profile/11243666057159213807</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00850393112957401966" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_8qPyDn7SSew/SrujUM53ojI/AAAAAAAAAAM/yIUzCeuXcP4/s72-c/icon.png" height="72" width="72" /><feedburner:origLink>http://android-developers.blogspot.com/2009/10/adc-2-round-1-scoring-complete.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEUEQ309cSp7ImA9WxNXF0s.&quot;"><id>tag:blogger.com,1999:blog-6755709643044947179.post-7511647241234048472</id><published>2009-10-05T10:00:00.000-07:00</published><updated>2009-10-05T10:03:22.369-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-05T10:03:22.369-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="How-to" /><category scheme="http://www.blogger.com/atom/ns#" term="Gestures" /><category scheme="http://www.blogger.com/atom/ns#" term="Android 1.6" /><title>Gestures on Android 1.6</title><content type="html">&lt;p&gt;Touch screens are a great way to interact with applications on mobile devices. With a touch screen, users can easily tap, drag, fling, or slide to quickly perform actions in their favorite applications. But it's not always that easy for developers. With Android, it's easy to recognize simple actions, like a swipe, but it's much more difficult to handle complicated gestures, which also require developers to write a lot of code. That's why we have decided to introduce a new gestures API in Android 1.6. This API, located in the new package &lt;code&gt;android.gesture&lt;/code&gt;, lets you store, load, draw and recognize gestures. In this post I will show you how you can use the &lt;code&gt;android.gesture&lt;/code&gt; API in your applications. Before going any further, you should download the &lt;a href="http://code.google.com/p/apps-for-android/downloads/detail?name=GesturesDemos.zip&amp;can=2&amp;q=#makechanges" &gt;source code of the examples&lt;/a&gt;.&lt;/p&gt;&lt;h3&gt;Creating a gestures library&lt;/h3&gt;&lt;p&gt;The Android 1.6 SDK comes with a new application pre-installed on the emulator, called Gestures Builder. You can use this application to create a set of pre-defined gestures for your own application. It also serves as an example of how to let the user define his own gestures in your applications. You can find the source code of Gestures Builders in the samples directory of Android 1.6. In our example we will use Gestures Builder to generate a set of gestures for us (make sure to create an AVD with an SD card image to use Gestures Builder.)  The screenshot below shows what the application looks like after adding a few gestures:&lt;/p&gt;&lt;p&gt;&lt;img src="http://docs.google.com/a/google.com/File?id=cf49fh6b_5d97vb6ft_b" style="width: 320px; height: 480px;"&gt;&lt;/p&gt;&lt;p&gt;As you can see, a gesture is always associated with a name. That name is very important because it identifies each gesture within your application. The names do not have to be unique. Actually it can be very useful to have several gestures with the same name to increase the precision of the recognition. Every time you add or edit a gesture in the Gestures Builder, a file is generated on the emulator's SD card, &lt;code&gt;/sdcard/gestures&lt;/code&gt;. This file contains the description of all the gestures, and you will need to package it inside your application inside the resources directory, in &lt;code&gt;/res/raw&lt;/code&gt;.&lt;/p&gt;&lt;h3&gt;Loading the gestures library&lt;/h3&gt;&lt;p&gt;Now that you have a set of pre-defined gestures, you must load it inside your application. This can be achieved in several ways but the easiest is to use the &lt;code&gt;GestureLibraries&lt;/code&gt; class:&lt;/p&gt;&lt;pre class="prettyprint"&gt;mLibrary = GestureLibraries.fromRawResource(this, R.raw.spells);
if (!mLibrary.load()) {
    finish();
}&lt;/pre&gt;&lt;p&gt;In this example, the gesture library is loaded from the file &lt;code&gt;/res/raw/spells&lt;/code&gt;. You can easily load libraries from other sources, like the SD card, which is very important if you want your application to be able to save the library; a library loaded from a raw resource is read-only and cannot be modified. The following diagram shows the structure of a library:&lt;/p&gt;&lt;p&gt;&lt;img src="http://docs.google.com/a/google.com/File?id=cf49fh6b_6dvdb38c9_b" style="width: 600px; height: 512px;"&gt;&lt;/p&gt;&lt;h3&gt;Recognizing gestures&lt;/h3&gt;&lt;p&gt;To start recognizing gestures in your application, all you have to do is add a &lt;code&gt;GestureOverlayView&lt;/code&gt; to your XML layout:&lt;/p&gt;&lt;pre&gt;&amp;lt;android.gesture.GestureOverlayView
    android:id=&amp;quot;@+id/gestures&amp;quot;
    android:layout_width=&amp;quot;fill_parent&amp;quot; 
    android:layout_height=&amp;quot;0dip&amp;quot;
    android:layout_weight=&amp;quot;1.0&amp;quot; /&amp;gt;&lt;/pre&gt;&lt;p&gt;Notice that the &lt;code&gt;GestureOverlayView&lt;/code&gt; is not part of the usual android.widget package. Therefore, you must use its fully qualified name. A gesture overlay acts as a simple drawing board on which the user can draw his gestures. You can tweak several visual properties, like the color and the width of the stroke used to draw gestures, and register various listeners to follow what the user is doing. The most commonly used listener is &lt;code&gt;GestureOverlayView.OnGesturePerformedListener&lt;/code&gt; which fires whenever a user is done drawing a gesture:&lt;/p&gt;&lt;pre&gt;GestureOverlayView gestures = (GestureOverlayView) findViewById(R.id.gestures);
gestures.addOnGesturePerformedListener(this);&lt;/pre&gt;&lt;p&gt;When the listener fires, you can ask the &lt;code&gt;GestureLibrary&lt;/code&gt; to try to recognize the gesture. In return, you will get a list of Prediction instances, each with a name - the same name you entered in the Gestures Builder - and a score. The list is sorted by descending scores; the higher the score, the more likely the associated gesture is the one the user intended to draw. The following code snippet demonstrates how to retrieve the name of the first prediction:&lt;/p&gt;&lt;pre&gt;public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {
    ArrayList&lt;Prediction&gt; predictions = mLibrary.recognize(gesture);

    // We want at least one prediction
    if (predictions.size() &gt; 0) {
        Prediction prediction = predictions.get(0);
        // We want at least some confidence in the result
        if (prediction.score &gt; 1.0) {
            // Show the spell
            Toast.makeText(this, prediction.name, Toast.LENGTH_SHORT).show();
        }
    }
}&lt;/pre&gt;&lt;p&gt;In this example, the first prediction is taken into account only if it's score is greater than 1.0. The threshold you use is entirely up to you but know that scores lower than 1.0 are typically poor matches. And this is all the code you need to create a simple application that can recognize pre-defined gestures (see the source code of the project GesturesDemo):&lt;/p&gt;&lt;p&gt;&lt;img src="http://docs.google.com/a/google.com/File?id=cf49fh6b_7jv4jj7ck_b" style="width: 320px; height: 480px;"&gt;&lt;/p&gt;&lt;h3&gt;Gestures overlay&lt;/h3&gt;&lt;p&gt;In the example above, the &lt;code&gt;GestureOverlayView&lt;/code&gt; was used as a normal view, embedded inside a &lt;font class="Apple-style-span" face="'Courier New'"&gt;LinearLayout&lt;/font&gt;. However, as its name suggests, it can also be used as an overlay on top of other views. This can be useful to recognize gestures in a game or just anywhere in the UI of an application. In the second example, called GesturesListDemo, we'll create an overlay on top of a list of contacts. We start again in Gestures Builder to create a new set of pre-defined gestures:&lt;/p&gt;&lt;p&gt;&lt;img src="http://docs.google.com/a/google.com/File?id=cf49fh6b_88zfgzrgv_b" style="width: 320px; height: 480px;"&gt;&lt;/p&gt;&lt;p&gt;And here is what the XML layout looks like:&lt;/p&gt;&lt;pre&gt;&amp;lt;android.gesture.GestureOverlayView
    xmlns:android=&amp;quot;http://schemas.android.com/apk/res/android&amp;quot;
    android:id=&amp;quot;@+id/gestures&amp;quot;
    android:layout_width=&amp;quot;fill_parent&amp;quot;
    android:layout_height=&amp;quot;fill_parent&amp;quot;
    
    android:gestureStrokeType=&amp;quot;multiple&amp;quot;
    android:eventsInterceptionEnabled=&amp;quot;true&amp;quot;
    android:orientation=&amp;quot;vertical&amp;quot;&amp;gt;

    &amp;lt;ListView
        android:id=&amp;quot;@android:id/list&amp;quot;  
        android:layout_width=&amp;quot;fill_parent&amp;quot; 
        android:layout_height=&amp;quot;fill_parent&amp;quot;  /&amp;gt;

&amp;lt;/android.gesture.GestureOverlayView&amp;gt;&lt;/pre&gt;&lt;p&gt;In this application, the gestures view is an overlay on top of a regular ListView. The overlay also specifies a few properties that we did not need before:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;gestureStrokeType&lt;/code&gt;: indicates whether we want to recognize gestures made of a single stroke or multiple strokes. Since one of our gestures is the "+" symbol, we need multiple strokes&lt;/li&gt;&lt;li&gt;&lt;code&gt;eventsInterceptionEnabled&lt;/code&gt;: when set to true, this property tells the overlay to steal the events from its children as soon as it knows the user is really drawing a gesture. This is useful when there's a scrollable view under the overlay, to avoid scrolling the underlying child as the user draws his gesture &lt;/li&gt;&lt;li&gt;&lt;code&gt;orientation&lt;/code&gt;: indicates the scroll orientation of the views underneath. In this case the list scrolls vertically, which means that any horizontal gestures (like &lt;code&gt;action_delete&lt;/code&gt;) can immediately be recognized as a gesture. Gestures that start with a vertical stroke must contain at least one horizontal component to be recognized. In other words, a simple vertical line cannot be recognized as a gesture since it would conflict with the list's scrolling.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The code used to load and set up the gestures library and overlay is exactly the same as before. The only difference is that we now check the name of the predictions to know what the user intended to do:&lt;/p&gt;&lt;pre&gt;public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {
    ArrayList&amp;lt;Prediction&amp;gt; predictions = mLibrary.recognize(gesture);
    if (predictions.size() &amp;gt; 0 &amp;amp;&amp;amp; predictions.get(0).score &amp;gt; 1.0) {
        String action = predictions.get(0).name;
        if (&amp;quot;action_add&amp;quot;.equals(action)) {
            Toast.makeText(this, &amp;quot;Adding a contact&amp;quot;, Toast.LENGTH_SHORT).show();
        } else if (&amp;quot;action_delete&amp;quot;.equals(action)) {
            Toast.makeText(this, &amp;quot;Removing a contact&amp;quot;, Toast.LENGTH_SHORT).show();
        } else if (&amp;quot;action_refresh&amp;quot;.equals(action)) {
            Toast.makeText(this, &amp;quot;Reloading contacts&amp;quot;, Toast.LENGTH_SHORT).show();
        }
    }
}&lt;/pre&gt;&lt;p&gt;The user is now able to draw his gestures on top of the list without interfering with the scrolling:&lt;/p&gt;&lt;p&gt;&lt;img src="http://docs.google.com/a/google.com/File?id=cf49fh6b_9g5mpqzfg_b" style="width: 320px; height: 480px;"&gt;&lt;/p&gt;&lt;p&gt;The overlay even gives visual clues as to whether the gesture is considered valid for recognition. In the case of a vertical overlay, for instance, a single vertical stroke cannot be recognized as a gesture and is therefore drawn with a translucent color:&lt;/p&gt;&lt;p&gt;&lt;img src="http://docs.google.com/a/google.com/File?id=cf49fh6b_10ctk8g384_b" style="width: 320px; height: 480px;"&gt;&lt;/p&gt;&lt;h3&gt;It's your turn&lt;/h3&gt;&lt;p&gt;Adding support for gestures in your application is easy and can be a valuable addition. The gestures API does not even have to be used to recognize complex shapes; it will work equally well to recognize simple swipes. We are very excited by the possibilities the gestures API offers, and we're eager to see what cool applications the community will create with it.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6755709643044947179-7511647241234048472?l=android-developers.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=Rrgh3YnIqig:DwQshYrQLAw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/hsDu?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=Rrgh3YnIqig:DwQshYrQLAw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/hsDu?i=Rrgh3YnIqig:DwQshYrQLAw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/hsDu/~4/Rrgh3YnIqig" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6755709643044947179/posts/default/7511647241234048472?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6755709643044947179/posts/default/7511647241234048472?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/hsDu/~3/Rrgh3YnIqig/gestures-on-android-16.html" title="Gestures on Android 1.6" /><author><name>Romain Guy</name><uri>http://www.blogger.com/profile/14359137835485363401</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="11053364165382206530" /></author><feedburner:origLink>http://android-developers.blogspot.com/2009/10/gestures-on-android-16.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU4CSX46fip7ImA9WxNXEkk.&quot;"><id>tag:blogger.com,1999:blog-6755709643044947179.post-7898999761951591295</id><published>2009-09-29T10:00:00.000-07:00</published><updated>2009-09-29T11:12:48.016-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-29T11:12:48.016-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Android 1.6" /><category scheme="http://www.blogger.com/atom/ns#" term="NDK" /><category scheme="http://www.blogger.com/atom/ns#" term="Announcements" /><title>Now available: Android 1.6 NDK</title><content type="html">&lt;p&gt;&lt;img style="width: 200px; height: 200px; float: left; margin: 0em 1em 1em 0em;" src="http://docs.google.com/a/google.com/File?id=dfgb4wsg_19g9kfvbhk_b" /&gt;Today &lt;a href="http://developer.android.com/sdk/ndk/1.6_r1/index.html"&gt;Android 1.6 NDK, release 1&lt;/a&gt; is available for download from the Android developer site.&lt;/p&gt;&lt;p&gt;To recap, the NDK is a companion to the SDK that provides tools to generate and embed native ARM machine code within your application packages. This native code has the same restrictions as the VM code, but can execute certain operations much more rapidly. This is useful if you're doing heavy computations, digital processing, or even porting existing code bases written in C or C++.&lt;/p&gt;&lt;p&gt;If you already use the &lt;a href="http://android-developers.blogspot.com/2009/06/introducing-android-15-ndk-release-1.html"&gt;Android 1.5 NDK&lt;/a&gt;, upgrading to this release is highly recommended. It provides the following improvements:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The ability to use OpenGL ES 1.1 headers and libraries&lt;/strong&gt;
If your application targets Android 1.6, your native code can now directly call OpenGL ES 1.1 functions to perform graphics rendering. This will help those programs that need to send large amounts of vertex data to the GPU. Note, however, that activity lifecycle and surface creation must still be performed from the VM. This NDK contains a new sample ("san-angeles") that shows exactly how to do that with a GLSurfaceView object.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The ability to target either Android 1.5 or 1.6 devices&lt;/strong&gt;
The NDK parses your project's properties to know which platform release it is targeting. It will then automatically use the proper headers and libraries to generate your native code. Any application that targets 1.5 will run on Android 1.5, Android 1.6 and any future official system release. Targeting 1.6 should, thus, only be done if your application requires new 1.6 features / APIs, like the ability to call OpenGL ES 1.x headers from native code.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The ability to put your native sources under your application's project tree&lt;/strong&gt;
You can now conveniently place all your sources (C, C++ and Java) under the same tree, for editing or version control purposes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Many fixes to the NDK's build scripts&lt;/strong&gt;
The changes to the build scripts fix some annoying bugs and also increase host system compatibility.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;If you have any questions, please join us in the &lt;a href="http://groups.google.com/group/android-ndk"&gt;Android NDK forum&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6755709643044947179-7898999761951591295?l=android-developers.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=s-28t9ar-Jk:nBRBg14pViE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/hsDu?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=s-28t9ar-Jk:nBRBg14pViE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/hsDu?i=s-28t9ar-Jk:nBRBg14pViE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/hsDu/~4/s-28t9ar-Jk" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6755709643044947179/posts/default/7898999761951591295?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6755709643044947179/posts/default/7898999761951591295?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/hsDu/~3/s-28t9ar-Jk/now-available-android-16-ndk.html" title="Now available: Android 1.6 NDK" /><author><name>David Turner</name><uri>http://www.blogger.com/profile/11184262845691377700</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="11972009299897723328" /></author><feedburner:origLink>http://android-developers.blogspot.com/2009/09/now-available-android-16-ndk.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE8MSXs9cSp7ImA9WxNXEkk.&quot;"><id>tag:blogger.com,1999:blog-6755709643044947179.post-8698199965466441424</id><published>2009-09-28T07:00:00.000-07:00</published><updated>2009-09-29T10:54:48.569-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-29T10:54:48.569-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="How-to" /><category scheme="http://www.blogger.com/atom/ns#" term="Android 1.6" /><title>Zipalign: an easy optimization</title><content type="html">&lt;p&gt;The Android 1.6 SDK includes a tool called &lt;a href="http://developer.android.com/guide/developing/tools/zipalign.html"&gt;&lt;code&gt;zipalign&lt;/code&gt;&lt;/a&gt; that optimizes the way an application is packaged. Doing this enables Android to interact with your application more efficiently and thus has the potential to make your application and the overall system run faster. We strongly encourage you to use &lt;code&gt;zipalign&lt;/code&gt; on both new and already published applications and to make the optimized version available—even if your application targets a previous version of Android. We'll get into more detail on what &lt;code&gt;zipalign&lt;/code&gt; does, how to use it, and why you'll want to do so in the rest of this post.&lt;/p&gt;&lt;p&gt;In Android, data files stored in each application's apk are accessed by multiple processes: the installer reads the manifest to handle the permissions associated with that application; the Home application reads resources to get the application's name and icon; the system server reads resources for a variety of reasons (e.g. to display that application's notifications); and last but not least, the resource files are obviously used by the application itself.&lt;/p&gt;&lt;p&gt;The resource-handling code in Android can efficiently access resources when they're aligned on 4-byte boundaries by memory-mapping them. But for resources that are not aligned (i.e. when &lt;code&gt;zipalign&lt;/code&gt; hasn't been run on an apk), it has to fall back to explicitly reading them—which is slower and consumes additional memory.&lt;/p&gt;&lt;p&gt;For an application developer like you, this fallback mechanism is very convenient. It provides a lot of flexibility by allowing for several different development methods, including those that don't include aligning resources as part of their normal flow.&lt;/p&gt;&lt;p&gt;Unfortunately, the situation is reversed for users—reading resources from unaligned apks is slow and takes a lot of memory. In the best case, the only visible result is that both the Home application and the unaligned application launch slower than they otherwise should. In the worst case, installing several applications with unaligned resources increases memory pressure, thus causing the system to thrash around by having to constantly start and kill processes. The user ends up with a slow device with a poor battery life.&lt;/p&gt;&lt;p&gt;Luckily, it's very easy to align the resources:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Using ADT:&lt;/li&gt;&lt;li style="list-style: none"&gt;&lt;ul&gt;&lt;li&gt;ADT (starting with 0.9.3) will automatically align release application packages if the export wizard is used to create them. To use the wizard, right click the project and choose "Android Tools" &amp;gt; "Export Signed Application Package..." It can also be accessed from the first page of the &lt;code&gt;AndroidManifest.xml&lt;/code&gt; editor.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Using Ant:&lt;/li&gt;&lt;li style="list-style: none"&gt;&lt;ul&gt;&lt;li&gt;The &lt;em&gt;Ant&lt;/em&gt; build script that targets Android 1.6 (API level 4) can align application packages. Targets for older versions of the Android platform are not aligned by the &lt;em&gt;Ant&lt;/em&gt; build script and need to be manually aligned.&lt;/li&gt;&lt;li&gt;Debug packages built with &lt;em&gt;Ant&lt;/em&gt; for Android 1.6 applications are aligned and signed by default.&lt;/li&gt;&lt;li&gt;Release packages are aligned automatically only if &lt;em&gt;Ant&lt;/em&gt; has enough information to sign the packages, since aligning has to happen after signing. In order to be able to sign packages, and therefore to align them, &lt;em&gt;Ant&lt;/em&gt; needs to know the location of the keystore and the name of the key in &lt;code&gt;build.properties&lt;/code&gt;. The name of the properties are &lt;code&gt;key.store&lt;/code&gt; and &lt;code&gt;key.alias&lt;/code&gt; respectively. If those properties are present, the signing tool will prompt to enter the store/key passwords during the build, and the script will sign and then align the apk file. If the properties are missing, the release package will not be signed, and therefore will not get aligned either.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Manually:&lt;/li&gt;&lt;li style="list-style: none"&gt;&lt;ul&gt;&lt;li&gt;In order to manually align a package, &lt;code&gt;zipalign&lt;/code&gt; is in the tools folder of the Android 1.6 SDK. It can be used on application packages targeting any version of Android. It should be run after signing the apk file, using the following command:&lt;br&gt;&lt;code&gt;zipalign -v 4 source.apk destination.apk&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Verifying alignment:&lt;/li&gt;&lt;li style="list-style: none"&gt;&lt;ul&gt;&lt;li&gt;The following command verifies that a package is aligned:&lt;br&gt;&lt;code&gt;zipalign -c -v 4 application.apk&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;We encourage you manually run &lt;code&gt;zipalign&lt;/code&gt; on your currently published applications and to make the newly aligned versions available to users. And don't forget to align any new applications going forward!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6755709643044947179-8698199965466441424?l=android-developers.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=2DGDa3uWUCI:eWxWDjry81E:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/hsDu?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=2DGDa3uWUCI:eWxWDjry81E:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/hsDu?i=2DGDa3uWUCI:eWxWDjry81E:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/hsDu/~4/2DGDa3uWUCI" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6755709643044947179/posts/default/8698199965466441424?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6755709643044947179/posts/default/8698199965466441424?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/hsDu/~3/2DGDa3uWUCI/zipalign-easy-optimization.html" title="Zipalign: an easy optimization" /><author><name>Jean-Baptiste Queru, Android Open-Source Project</name><uri>http://www.blogger.com/profile/15561454390667884632</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="15339279315046915169" /></author><feedburner:origLink>http://android-developers.blogspot.com/2009/09/zipalign-easy-optimization.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE4MRnc4eyp7ImA9WxNQGUw.&quot;"><id>tag:blogger.com,1999:blog-6755709643044947179.post-4389042964160808218</id><published>2009-09-25T14:31:00.000-07:00</published><updated>2009-09-25T15:16:27.933-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-25T15:16:27.933-07:00</app:edited><title>A Note on Google Apps for Android</title><content type="html">&lt;p&gt;Lately we've been busy bees in Mountain View, as you can see from the recent release of Android 1.6 to the open-source tree, not to mention some devices we're working on with partners that we think you'll really like. Of course, the community isn't sitting around either, and we've been seeing some really cool and impressive things, such as the custom Android builds that are popular with many enthusiasts. Recently there's been some discussion about an exchange we had with the developer of one of those builds, and I've noticed some confusion around what is and isn't part of Android's open source code. I want to take a few moments to clear up some of those misconceptions, and explain how Google's apps for Android fit in.&lt;/p&gt;&lt;p&gt;Everyone knows that mobile is a big deal, but for a long time it was hard to be a mobile app developer. Competing interests and the slow pace of platform innovation made it hard to create innovative apps. For our part, Google offers a lot of services — such as Google Search, Google Maps, and so on — and we found delivering those services to users' phones to be a very frustrating experience. But we also found that we weren't alone, so we formed the Open Handset Alliance, a group of like-minded partners, and created Android to be the platform that we all wished we had. To encourage broad adoption, we arranged for Android to be open-source. Google also created and operates Android Market as a service for developers to distribute their apps to Android users. In other words, we created Android because the industry needed an injection of openness. Today, we're thrilled to see all the enthusiasm that developers, users, and others in the mobile industry have shown toward Android.&lt;/p&gt;&lt;p&gt;With a high-quality open platform in hand, we then returned to our goal of making our services available on users' phones. That's why we developed Android apps for many of our services like YouTube, Gmail, Google Voice, and so on. These apps are Google's way of benefiting from Android in the same way that any other developer can, but the apps are not part of the Android platform itself. We make some of these apps available to users of any Android-powered device via Android Market, and others are pre-installed on some phones through business deals. Either way, these apps aren't open source, and that's why they aren't included in the Android source code repository.  Unauthorized distribution of this software harms us just like it would any other business, even if it's done with the best of intentions.&lt;/p&gt;&lt;p&gt;I hope that clears up some of the confusion around Google's apps for Android. We always love seeing novel uses of Android, including custom Android builds from developers who see a need.&lt;b&gt; &lt;/b&gt;I look forward to seeing what comes next!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6755709643044947179-4389042964160808218?l=android-developers.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=uzk07V_uOR4:tJo4ZuVMnrw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/hsDu?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=uzk07V_uOR4:tJo4ZuVMnrw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/hsDu?i=uzk07V_uOR4:tJo4ZuVMnrw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/hsDu/~4/uzk07V_uOR4" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6755709643044947179/posts/default/4389042964160808218?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6755709643044947179/posts/default/4389042964160808218?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/hsDu/~3/uzk07V_uOR4/note-on-google-apps-for-android.html" title="A Note on Google Apps for Android" /><author><name>Dan Morrill</name><uri>http://www.blogger.com/profile/12526265248010766454</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17206489683788395259" /></author><feedburner:origLink>http://android-developers.blogspot.com/2009/09/note-on-google-apps-for-android.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak8DRng-fSp7ImA9WxNQGE4.&quot;"><id>tag:blogger.com,1999:blog-6755709643044947179.post-637050384737278422</id><published>2009-09-24T13:15:00.000-07:00</published><updated>2009-09-24T17:34:37.655-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-24T17:34:37.655-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Android Developer Challenge" /><category scheme="http://www.blogger.com/atom/ns#" term="Announcements" /><title>ADC 2 Judging Has Begun!</title><content type="html">&lt;p&gt;&lt;img src="http://1.bp.blogspot.com/_8qPyDn7SSew/SrujUM53ojI/AAAAAAAAAAM/yIUzCeuXcP4/s320/icon.png" align="left" alt="ADC 2 App Logo" style="margin-right: 5px;"&gt;&lt;img src="http://3.bp.blogspot.com/_8qPyDn7SSew/SrujUgpn79I/AAAAAAAAAAU/44bbRS6zJ0w/s320/intro.png" align="right" alt="ADC 2 Judging App Screenshot" style="margin-left: 5px; border-color: black; border-width: 1px; border-style: solid;"&gt;I am happy to announce that &lt;a href="http://code.google.com/android/adc/"&gt;Android Developer Challenge 2&lt;/a&gt;'s first round of judging has begun!&lt;/p&gt;&lt;p&gt;As a reminder, user voting determines which apps will make it to the second round. Voting will occur through an application called &lt;em&gt;Android Developer Challenge 2&lt;/em&gt;, which is now available for download from Android Market. &lt;em&gt;Android Developer Challenge 2&lt;/em&gt; presents apps for each user to download and score according to a set of criteria, such as originality and effective use of the Android platform, among others. The first round of judging will last at least two weeks from today. Judging will continue until we receive a sufficient number of votes to identify the top 20 applications in each of the 10 categories (200 apps total) that qualify for the second round.&lt;/p&gt;&lt;p&gt;During the second round, judging will occur through a combination of user voting and input from a panel of industry experts. User voting will continue to occur via &lt;em&gt;Android Developer Challenge 2&lt;/em&gt; and will account for 40% of the final score that each app receives in round two. The remaining 60% of the final score will be determined by the industry expert panel.&lt;/p&gt;&lt;p&gt;It has been a little less than a year since the first Android-powered phones became available. Today, there are more than 10,000 applications available in Android Market. We are pleased by the energy and commitment demonstrated by developers in such a short period of time. Our goal with Android Developer Challenge 2 is to inspire the developer community to produce even more innovative apps for Android. Now on to the voting!&lt;/p&gt;&lt;p&gt;Download &lt;i&gt;Android Developer Challenge 2&lt;/i&gt;:&lt;/p&gt;&lt;p&gt;&lt;img src="http://chart.apis.google.com/chart?cht=qr&amp;chs=230x230&amp;chl=http%3A%2F%2Fmarket.android.com%2Fsearch%3Fq%3Dpname%3Acom.google.android.challenge" alt="QR code for ADC2 app download"&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6755709643044947179-637050384737278422?l=android-developers.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=B6WY9p0xh9c:aJizYc_iorU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/hsDu?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=B6WY9p0xh9c:aJizYc_iorU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/hsDu?i=B6WY9p0xh9c:aJizYc_iorU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/hsDu/~4/B6WY9p0xh9c" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6755709643044947179/posts/default/637050384737278422?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6755709643044947179/posts/default/637050384737278422?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/hsDu/~3/B6WY9p0xh9c/adc-2-judging-has-begun.html" title="ADC 2 Judging Has Begun!" /><author><name>Eric Chu, Android Mobile Platform</name><uri>http://www.blogger.com/profile/11243666057159213807</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00850393112957401966" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_8qPyDn7SSew/SrujUM53ojI/AAAAAAAAAAM/yIUzCeuXcP4/s72-c/icon.png" height="72" width="72" /><feedburner:origLink>http://android-developers.blogspot.com/2009/09/adc-2-judging-has-begun.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0YCRHg8fyp7ImA9WxNQF08.&quot;"><id>tag:blogger.com,1999:blog-6755709643044947179.post-2160298517971567698</id><published>2009-09-23T08:45:00.000-07:00</published><updated>2009-09-23T08:52:45.677-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-23T08:52:45.677-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="How-to" /><category scheme="http://www.blogger.com/atom/ns#" term="Text-to-Speech" /><category scheme="http://www.blogger.com/atom/ns#" term="Android 1.6" /><title>An introduction to Text-To-Speech in Android</title><content type="html">&lt;p&gt;We've introduced a new feature in version 1.6 of the Android platform: Text-To-Speech (TTS). Also known as "speech synthesis", TTS enables your Android device to "speak" text of different languages.&lt;/p&gt;&lt;p&gt;Before we explain how to use the TTS API itself, let's first review a few aspects of the engine that will be important to your TTS-enabled application. We will then show how to make your Android application talk and how to configure the way it speaks.&lt;/p&gt;&lt;h3&gt;Languages and resources&lt;/h3&gt;&lt;h4&gt;About the TTS resources&lt;/h4&gt;&lt;p&gt;The TTS engine that ships with the Android platform supports a number of languages: English, French, German, Italian and Spanish. Also, depending on which side of the Atlantic you are on, American and British accents for English are both supported.&lt;/p&gt;&lt;p&gt;The TTS engine needs to know which language to speak, as a word like "Paris", for example, is pronounced differently in French and English. So the voice and dictionary are language-specific resources that need to be loaded before the engine can start to speak.&lt;/p&gt;&lt;p&gt;Although all Android-powered devices that support the TTS functionality ship with the engine, some devices have limited storage and may lack the language-specific resource files. If a user wants to install those resources, the TTS API enables an application to query the platform for the availability of language files and can initiate their download and installation. So upon creating your activity, a good first step is to check for the presence of the TTS resources with the corresponding intent:&lt;/p&gt;&lt;pre&gt;Intent checkIntent = new Intent();
checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
startActivityForResult(checkIntent, MY_DATA_CHECK_CODE);&lt;/pre&gt;&lt;p&gt;A successful check will be marked by a &lt;code&gt;CHECK_VOICE_DATA_PASS&lt;/code&gt; result code, indicating this device is ready to speak, after the creation of our &lt;code&gt;android.speech.tts.TextToSpeech&lt;/code&gt; object. If not, we need to let the user know to install the data that's required for the device to become a multi-lingual talking machine! Downloading and installing the data is accomplished by firing off the ACTION_INSTALL_TTS_DATA intent, which will take the user to Android Market, and will let her/him initiate the download. Installation of the data will happen automatically once the download completes. Here is an example of what your implementation of &lt;code&gt;onActivityResult()&lt;/code&gt; would look like:&lt;/p&gt;&lt;pre&gt;private TextToSpeech mTts;
protected void onActivityResult(
        int requestCode, int resultCode, Intent data) {
    if (requestCode == MY_DATA_CHECK_CODE) {
        if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {
            // success, create the TTS instance
            mTts = new TextToSpeech(this, this);
        } else {
            // missing data, install it
            Intent installIntent = new Intent();
            installIntent.setAction(
                TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
            startActivity(installIntent);
        }
    }
}&lt;/pre&gt;&lt;p&gt;In the constructor of the &lt;code&gt;TextToSpeech&lt;/code&gt; instance we pass a reference to the &lt;code&gt;Context&lt;/code&gt; to be used (here the current Activity), and to an &lt;code&gt;OnInitListener&lt;/code&gt; (here our Activity as well). This listener enables our application to be notified when the Text-To-Speech engine is fully loaded, so we can start configuring it and using it.&lt;/p&gt;&lt;h4&gt;Languages and Locale&lt;/h4&gt;&lt;p&gt;At Google I/O, we showed an &lt;a title="Google I/O 2009, TTS demonstration" href="http://www.youtube.com/watch?v=uX9nt8Cpdqg#t=6m17s" id="rnfd"&gt;example of TTS&lt;/a&gt; where it was used to speak the result of a translation from and to one of the 5 languages the Android TTS engine currently supports. Loading a language is as simple as calling for instance:&lt;/p&gt;&lt;pre&gt;mTts.setLanguage(Locale.US);&lt;/pre&gt;&lt;p&gt;to load and set the language to English, as spoken in the country "US". A locale is the preferred way to specify a language because it accounts for the fact that the same language can vary from one country to another. To query whether a specific Locale is supported, you can use isLanguageAvailable(), which returns the level of support for the given Locale. For instance the calls:&lt;/p&gt;&lt;pre&gt;mTts.isLanguageAvailable(Locale.UK))
mTts.isLanguageAvailable(Locale.FRANCE))
mTts.isLanguageAvailable(new Locale("spa", "ESP")))&lt;/pre&gt;&lt;p&gt;will return TextToSpeech.LANG_COUNTRY_AVAILABLE to indicate that the language AND country as described by the Locale parameter are supported (and the data is correctly installed). But the calls:&lt;/p&gt;&lt;pre&gt;mTts.isLanguageAvailable(Locale.CANADA_FRENCH))
mTts.isLanguageAvailable(new Locale("spa"))&lt;/pre&gt;&lt;p&gt;will return &lt;code&gt;TextToSpeech.LANG_AVAILABLE&lt;/code&gt;. In the first example, French is supported, but not the given country. And in the second, only the language was specified for the Locale, so that's what the match was made on.&lt;/p&gt;&lt;p&gt;Also note that besides the &lt;code&gt;ACTION_CHECK_TTS_DATA&lt;/code&gt; intent to check the availability of the TTS data, you can also use &lt;code&gt;isLanguageAvailable()&lt;/code&gt; once you have created your &lt;code&gt;TextToSpeech&lt;/code&gt; instance, which will return &lt;code&gt;TextToSpeech.LANG_MISSING_DATA&lt;/code&gt; if the required resources are not installed for the queried language.&lt;/p&gt;&lt;p&gt;Making the engine speak an Italian string while the engine is set to the French language will produce some pretty &lt;i&gt;interesting &lt;/i&gt;results, but it will not exactly be something your user would understand  So try to match the language of your application's content and the language that you loaded in your &lt;code&gt;TextToSpeech&lt;/code&gt; instance. Also if you are using &lt;code&gt;Locale.getDefault()&lt;/code&gt; to query the current Locale, make sure that at least the default language is supported.&lt;/p&gt;&lt;h3&gt;Making your application speak&lt;/h3&gt;&lt;p&gt;Now that our &lt;code&gt;TextToSpeech&lt;/code&gt; instance is properly initialized and configured, we can start to make your application speak. The simplest way to do so is to use the &lt;code&gt;speak()&lt;/code&gt; method. Let's iterate on the following example to make a talking alarm clock:&lt;/p&gt;&lt;pre&gt;String myText1 = "Did you sleep well?";
String myText2 = "I hope so, because it's time to wake up.";
mTts.speak(myText1, TextToSpeech.QUEUE_FLUSH, null);
mTts.speak(myText2, TextToSpeech.QUEUE_ADD, null);&lt;/pre&gt;&lt;p&gt;The TTS engine manages a global queue of all the entries to synthesize, which are also known as "utterances". Each &lt;code&gt;TextToSpeech&lt;/code&gt; instance can manage its own queue in order to control which utterance will interrupt the current one and which one is simply queued. Here the first &lt;code&gt;speak()&lt;/code&gt; request would interrupt whatever was currently being synthesized: the queue is flushed and the new utterance is queued, which places it at the head of the queue. The second utterance is queued and will be played after &lt;code&gt;myText1&lt;/code&gt; has completed.&lt;/p&gt;&lt;h4&gt;Using optional parameters to change the playback stream type&lt;/h4&gt;&lt;p&gt;On Android, each audio stream that is played is associated with one stream type, as defined in &lt;a title="AudioManager documentation on Android Developers" href="http://developer.android.com/reference/android/media/AudioManager.html"&gt;android.media.AudioManager&lt;/a&gt;. For a talking alarm clock, we would like our text to be played on the AudioManager.STREAM_ALARM stream type so that it respects the alarm settings the user has chosen on the device. The last parameter of the speak() method allows you to pass to the TTS engine optional parameters, specified as key/value pairs in a HashMap. Let's use that mechanism to change the stream type of our utterances:&lt;/p&gt;&lt;pre&gt;HashMap&amp;lt;String, String&amp;gt; myHashAlarm = new HashMap();
myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_STREAM,
        String.valueOf(AudioManager.STREAM_ALARM));
mTts.speak(myText1, TextToSpeech.QUEUE_FLUSH, myHashAlarm);
mTts.speak(myText2, TextToSpeech.QUEUE_ADD, myHashAlarm);&lt;/pre&gt;&lt;h4&gt;Using optional parameters for playback completion callbacks&lt;/h4&gt;&lt;p&gt;Note that &lt;code&gt;speak()&lt;/code&gt; calls are asynchronous, so they will return well before the text is done being synthesized and played by Android, regardless of the use of &lt;code&gt;QUEUE_FLUSH&lt;/code&gt; or &lt;code&gt;QUEUE_ADD&lt;/code&gt;. But you might need to know when a particular utterance is done playing. For instance you might want to start playing an annoying music after &lt;code&gt;myText2&lt;/code&gt; has finished synthesizing (remember, we're trying to wake up the user). We will again use an optional parameter, this time to tag our utterance as one we want to identify. We also need to make sure our activity implements the &lt;code&gt;TextToSpeech.OnUtteranceCompletedListener&lt;/code&gt; interface:&lt;/p&gt;&lt;pre&gt;mTts.setOnUtteranceCompletedListener(this);
myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_STREAM,
        String.valueOf(AudioManager.STREAM_ALARM));
mTts.speak(myText1, TextToSpeech.QUEUE_FLUSH, myHashAlarm);
myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID,
        "end of wakeup message ID");
// myHashAlarm now contains two optional parameters
mTts.speak(myText2, TextToSpeech.QUEUE_ADD, myHashAlarm);&lt;/pre&gt;&lt;p&gt;And the Activity gets notified of the completion in the implementation of the listener:&lt;/p&gt;&lt;pre&gt;public void onUtteranceCompleted(String uttId) {
    if (uttId == "end of wakeup message ID") {
        playAnnoyingMusic();
    } 
}&lt;/pre&gt;&lt;h4&gt;File rendering and playback&lt;/h4&gt;&lt;p&gt;While the &lt;code&gt;speak()&lt;/code&gt; method is used to make Android speak the text right away, there are cases where you would want the result of the synthesis to be recorded in an audio file instead. This would be the case if, for instance, there is text your application will speak often; you could avoid the synthesis CPU-overhead by rendering only once to a file, and then playing back that audio file whenever needed. Just like for &lt;code&gt;speak()&lt;/code&gt;, you can use an optional utterance identifier to be notified on the completion of the synthesis to the file:&lt;/p&gt;&lt;pre&gt;HashMap&amp;lt;String, String&amp;gt; myHashRender = new HashMap();
String wakeUpText = "Are you up yet?";
String destFileName = "/sdcard/myAppCache/wakeUp.wav";
myHashRender.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, wakeUpText);
mTts.synthesizeToFile(wakuUpText, myHashRender, destFileName);&lt;/pre&gt;&lt;p&gt;Once you are notified of the synthesis completion, you can play the output file just like any other audio resource with &lt;a title="MediaPlayer documentation on Android Developers" href="http://developer.android.com/reference/android/media/MediaPlayer.html"&gt;android.media.MediaPlayer&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;But the &lt;code&gt;TextToSpeech&lt;/code&gt; class offers other ways of associating audio resources with speech. So at this point we have a WAV file that contains the result of the synthesis of "Wake up" in the previously selected language. We can tell our TTS instance to associate the contents of the string "Wake up" with an audio resource, which can be accessed through its path, or through the package it's in, and its resource ID, using one of the two &lt;code&gt;addSpeech()&lt;/code&gt; methods:&lt;/p&gt;&lt;pre&gt;mTts.addSpeech(wakeUpText, destFileName);&lt;/pre&gt;&lt;p&gt;This way any call to speak() for the same string content as &lt;code&gt;wakeUpText&lt;/code&gt; will result in the playback of &lt;code&gt;destFileName&lt;/code&gt;. If the file is missing, then speak will behave as if the audio file wasn't there, and will synthesize and play the given string. But you can also take advantage of that feature to provide an option to the user to customize how "Wake up" sounds, by recording their own version if they choose to. Regardless of where that audio file comes from, you can still use the same line in your Activity code to ask repeatedly "Are you up yet?":&lt;/p&gt;&lt;pre&gt;mTts.speak(wakeUpText, TextToSpeech.QUEUE_ADD, myHashAlarm);&lt;/pre&gt;&lt;h4&gt;When not in use...&lt;/h4&gt;&lt;p&gt;The text-to-speech functionality relies on a dedicated service shared across all applications that use that feature. When you are done using TTS, be a good citizen and tell it "you won't be needing its services anymore" by calling &lt;code&gt;mTts.shutdown()&lt;/code&gt;, in your Activity &lt;code&gt;onDestroy()&lt;/code&gt; method for instance.&lt;/p&gt;&lt;h3&gt;Conclusion&lt;/h3&gt;&lt;p&gt;Android now talks, and so can your apps. Remember that in order for synthesized speech to be intelligible, you need to match the language you select to that of the text to synthesize. Text-to-speech can help you push your app in new directions. Whether you use TTS to help users with disabilities, to enable the  use of your application while looking away from the screen, or simply to make it cool, we hope you'll enjoy this new feature.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6755709643044947179-2160298517971567698?l=android-developers.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=p6Ueb7g-Ris:Jz4edZzmkug:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/hsDu?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=p6Ueb7g-Ris:Jz4edZzmkug:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/hsDu?i=p6Ueb7g-Ris:Jz4edZzmkug:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/hsDu/~4/p6Ueb7g-Ris" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6755709643044947179/posts/default/2160298517971567698?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6755709643044947179/posts/default/2160298517971567698?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/hsDu/~3/p6Ueb7g-Ris/introduction-to-text-to-speech-in.html" title="An introduction to Text-To-Speech in Android" /><author><name>Jean-Michel Trivi</name><uri>http://www.blogger.com/profile/05266211345932660373</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04319438986513161529" /></author><feedburner:origLink>http://android-developers.blogspot.com/2009/09/introduction-to-text-to-speech-in.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU4FQXs7fip7ImA9WxNQEk8.&quot;"><id>tag:blogger.com,1999:blog-6755709643044947179.post-7463312515543349922</id><published>2009-09-17T15:45:00.000-07:00</published><updated>2009-09-17T15:51:50.506-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-17T15:51:50.506-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="How-to" /><category scheme="http://www.blogger.com/atom/ns#" term="Android 1.6" /><category scheme="http://www.blogger.com/atom/ns#" term="Quick Search Box" /><title>Introducing Quick Search Box for Android</title><content type="html">&lt;img src="http://docs.google.com/a/google.com/File?id=chp8dmh9_364w8qhm4d6_b" style="float: right; margin-left: 1em; margin-bottom: 1em; width: 233px; height: 349.5px;" /&gt;&lt;p&gt;One of the new features we're really proud of in the Android 1.6 release is Quick Search Box for Android. This is our new system-wide search framework, which makes it possible for users to quickly and easily find what they're looking for, both on their devices and on the web. It suggests content on your device as you type, like apps, contacts, browser history, and music. It also offers results from the web search suggestions, local business listings, and other info from Google, such as stock quotes, weather, and flight status. All of this is available right from the home screen, by tapping on Quick Search Box (QSB).&lt;/p&gt;&lt;p&gt;What we're most excited about with this new feature is the ability for you, the developers, to leverage the QSB framework to provide quicker and easier access to the content inside your apps. Your apps can provide search suggestions that will surface to users in QSB alongside other search results and suggestions. This makes it possible for users to access your application's content from outside your application—for example, from the home screen.&lt;/p&gt;&lt;p style="font-size:75%;"&gt;The code fragments below are related to a new demo app for Android 1.6 called &lt;a href="http://developer.android.com/guide/samples/SearchableDictionary/index.html" title="Searchable Dictionary"&gt;Searchable Dictionary&lt;/a&gt;.&lt;/p&gt;&lt;hr style="width:66%; margin:1.5em;"&gt;&lt;h3&gt;The story before now: searching within your app&lt;/h3&gt;&lt;p&gt;In previous releases, we already provided a mechanism for you to expose search and search suggestions in your app as described in the docs for &lt;a href="http://developer.android.com/reference/android/app/SearchManager.html" title="SearchManager"&gt;SearchManager&lt;/a&gt;. This mechanism has not changed and requires the following two things in your &lt;code&gt;AndroidManifest.xml&lt;/code&gt;:&lt;/p&gt;&lt;p&gt;1) In your &lt;code&gt;&amp;lt;activity&amp;gt;&lt;/code&gt;, an intent filter, and a reference to a &lt;code&gt;searchable.xml&lt;/code&gt; file (described below):&lt;/p&gt;&lt;pre class="prettyprint"&gt;&amp;lt;intent-filter&amp;gt;
    &amp;lt;action android:name="android.intent.action.SEARCH" /&amp;gt;
    &amp;lt;category android:name="android.intent.category.DEFAULT" /&amp;gt;
&amp;lt;/intent-filter&amp;gt;
            
&amp;lt;meta-data android:name="android.app.searchable"
       android:resource="@xml/searchable" /&amp;gt;&lt;/pre&gt;&lt;p&gt;2) A content provider that can provide search suggestions according to the URIs and column formats specified by the &lt;a href="http://developer.android.com/reference/android/app/SearchManager.html#Suggestions" title="&amp;quot;Search Suggestions&amp;quot; section of the SearchManager docs"&gt;Search Suggestions section&lt;/a&gt; of the SearchManager docs:&lt;/p&gt;&lt;pre class="prettyprint"&gt;&amp;lt;!-- Provides search suggestions for words and their definitions. --&amp;gt;
&amp;lt;provider android:name="DictionaryProvider"
       android:authorities="dictionary"
       android:syncable="false" /&amp;gt;&lt;/pre&gt;&lt;p&gt;In the &lt;code&gt;searchable.xml&lt;/code&gt; file, you specify a few things about how you want the search system to present search for your app, including the authority of the content provider that provides suggestions for the user as they type. Here's an example of the &lt;code&gt;searchable.xml&lt;/code&gt; of an Android app that provides search suggestions within its own activities:&lt;/p&gt;&lt;pre class="prettyprint"&gt;&amp;lt;searchable xmlns:android="http://schemas.android.com/apk/res/android"
        android:label="@string/search_label"
        android:searchSuggestAuthority="dictionary"
        android:searchSuggestIntentAction="android.intent.action.VIEW"&amp;gt;
&amp;lt;/searchable&amp;gt;&lt;/pre&gt;&lt;p&gt;Note that the &lt;code&gt;android:searchSuggestAuthority&lt;/code&gt; attribute refers to the authority of the content provider we declared in &lt;code&gt;AndroidManifest.xml&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;For more details on this, see the &lt;a href="http://developer.android.com/reference/android/app/SearchManager.html#SearchabilityMetadata" title="Searchability Metadata section of the SearchManager docs"&gt;Searchability Metadata section&lt;/a&gt; of the SearchManager docs.&lt;/p&gt;&lt;h3&gt;Including your app in Quick Search Box&lt;/h3&gt;&lt;p&gt;In Android 1.6, we added a new attribute to the metadata for searchables: &lt;code&gt;android:includeInGlobalSearch&lt;/code&gt;. By specifying this as &lt;code&gt;"true"&lt;/code&gt; in your &lt;code&gt;searchable.xml&lt;/code&gt;, you allow QSB to pick up your search suggestion content provider and include its suggestions along with the rest (if the user enables your suggestions from the system search settings).&lt;/p&gt;&lt;p&gt;You should also specify a string value for &lt;code&gt;android:searchSettingsDescription&lt;/code&gt;, which describes to users what sorts of suggestions your app provides in the system settings for search.&lt;/p&gt;&lt;pre class="prettyprint"&gt;&amp;lt;searchable xmlns:android="http://schemas.android.com/apk/res/android"
       android:label="@string/search_label"
       &lt;span style="background:#ff0;"&gt;android:searchSettingsDescription="@string/settings_description"&lt;/span&gt;
       &lt;span style="background:#ff0;"&gt;android:includeInGlobalSearch="true"&lt;/span&gt;
       android:searchSuggestAuthority="dictionary"
       android:searchSuggestIntentAction="android.intent.action.VIEW"&amp;gt;
&amp;lt;/searchable&amp;gt;&lt;/pre&gt;&lt;p&gt;These new attributes are supported only in Android 1.6 and later.&lt;/p&gt;&lt;h3&gt;What to expect&lt;/h3&gt;&lt;p&gt;The first and most important thing to note is that when a user installs an app with a suggestion provider that participates in QSB, this new app will &lt;em&gt;not&lt;/em&gt; be enabled for QSB by default. The user can choose to enable particular suggestion sources from the system settings for search (by going to "Search" &amp;gt; "Searchable items" in settings).&lt;/p&gt;&lt;p&gt;You should consider how to handle this in your app. Perhaps show a notice that instructs the user to visit system settings and enable your app's suggestions.&lt;/p&gt;&lt;p&gt;Once the user enables your searchable item, the app's suggestions will have a chance to show up in QSB, most likely under the "more results" section to begin with. As your app's suggestions are chosen more frequently, they can move up in the list.&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;img src="http://docs.google.com/a/google.com/File?id=chp8dmh9_367f2g7c4db_b" style="width: 233px; height: 349.5px;" /&gt;  &lt;img id="k0vw" src="http://docs.google.com/a/google.com/File?id=chp8dmh9_365drh6t3ft_b" style="width: 233px; height: 349.5px;" /&gt;&lt;/p&gt;&lt;h3&gt;Shortcuts&lt;/h3&gt;&lt;p&gt;One of our objectives with QSB is to make it faster for users to access the things they access most often. One way we've done this is by 'shortcutting' some of the previously chosen search suggestions, so they will be shown immediately as the user starts typing, instead of waiting to query the content providers. Suggestions from your app may be chosen as shortcuts when the user clicks on them.&lt;/p&gt;&lt;p&gt;For dynamic suggestions that may wish to change their content (or become invalid) in the future, you can provide a 'shortcut id'. This tells QSB to query your suggestion provider for up-to-date content for a suggestion after it has been displayed. For more details on how to manage shortcuts, see the Shortcuts section &lt;a href="http://developer.android.com/reference/android/app/SearchManager.html#ExposingSearchSuggestionsToQuickSearchBox" title="within the SearchManager docs"&gt;within the SearchManager docs&lt;/a&gt;.&lt;/p&gt;&lt;hr style="width:66%; margin:1.5em;"&gt;&lt;p&gt;QSB provides a really cool way to make your app's content quicker to access by users. To help you get your app started with it, we've created a demo app which simply provides access to a small dictionary of words in QSB&amp;mdash;it's called Searchable Dictionary, and we encourage you to &lt;a href="http://developer.android.com/guide/samples/SearchableDictionary/index.html" title="here"&gt;check it out&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6755709643044947179-7463312515543349922?l=android-developers.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=Cu4IWm2u180:5ZY2Okl71zQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/hsDu?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=Cu4IWm2u180:5ZY2Okl71zQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/hsDu?i=Cu4IWm2u180:5ZY2Okl71zQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/hsDu/~4/Cu4IWm2u180" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6755709643044947179/posts/default/7463312515543349922?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6755709643044947179/posts/default/7463312515543349922?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/hsDu/~3/Cu4IWm2u180/introducing-quick-search-box-for.html" title="Introducing Quick Search Box for Android" /><author><name>Mike LeBeau and Karl Rosaen</name><uri>http://www.blogger.com/profile/09959049473982622114</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="12085822909317385418" /></author><feedburner:origLink>http://android-developers.blogspot.com/2009/09/introducing-quick-search-box-for.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEUFSH09cCp7ImA9WxNQEEg.&quot;"><id>tag:blogger.com,1999:blog-6755709643044947179.post-604925027217581638</id><published>2009-09-15T15:00:00.000-07:00</published><updated>2009-09-15T15:03:39.368-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-15T15:03:39.368-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SDK updates" /><category scheme="http://www.blogger.com/atom/ns#" term="Android 1.6" /><category scheme="http://www.blogger.com/atom/ns#" term="Announcements" /><title>Android 1.6 SDK is here</title><content type="html">&lt;p&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px; height: 200px;" src="http://1.bp.blogspot.com/_kNUIczJH1OM/Sqmkj5D-jwI/AAAAAAAAAAM/Tr6FGp6-6sI/s320/donut.png" alt="" id="BLOGGER_PHOTO_ID_5380012166390648578" border="0" /&gt;I am happy to let you know that Android 1.6 SDK is &lt;a title="available for download" href="http://developer.android.com/sdk/1.6_r1/index.html" onclick="javascript: pageTracker._trackPageview('/outgoing/android-1.6-download');"&gt;available for download&lt;/a&gt;. Android 1.6, which is based on the donut branch from the &lt;a href="http://source.android.com/" onclick="javascript: pageTracker._trackPageview('/outgoing/source.android.com');"&gt;Android Open Source Project&lt;/a&gt;, introduces a number of new features and technologies. With support for CDMA and additional screen sizes, your apps can be deployed on even more mobile networks and devices. You will have access to new technologies, including framework-level support for additional screen resolutions, like QVGA and WVGA, new telephony APIs to support CDMA, gesture APIs, a text-to-speech engine, and the ability to integrate with Quick Search Box. &lt;a title="What's new in Android 1.6" href="http://developer.android.com/sdk/android-1.6-highlights.html" onclick="javascript: pageTracker._trackPageview('/outgoing/whats-new-in-android-1.6');"&gt;What's new in Android 1.6&lt;/a&gt; provides a more complete overview of this platform update.&lt;/p&gt;&lt;p&gt;The Android 1.6 SDK requires a new version of Android Development Tools (&lt;a href="http://developer.android.com/sdk/preview/upgrading.html" title="ADT" onclick="javascript: pageTracker._trackPageview('/outgoing/adt-upgrade-instructions');"&gt;ADT&lt;/a&gt;). The SDK also includes a new tool that enables you to download updates and additional components, such as new add-ons or platforms.&lt;/p&gt;&lt;p&gt;You can expect to see devices running Android 1.6 as early as October. As with previous platform updates, applications written for older versions of Android will continue to run on devices with Android 1.6. Please test your existing apps on the Android 1.6 SDK to make sure they run as expected.&lt;/p&gt;&lt;p&gt;Over the next several weeks, we will publish a series of blog posts to help you get ready for the new developer technologies in Android 1.6. The following topics, and more, will be covered: how to adapt your applications to support different screen sizes, integrating with Quick Search Box, building gestures into your apps, and using the text-to-speech engine.&lt;/p&gt; &lt;p&gt;If you are interested to see some highlights of Android 1.6, check out the video below.&lt;/p&gt;&lt;object height="385" width="640"&gt;&lt;param name="movie" value="http://www.youtube.com/v/MBRFkLKRwFw&amp;amp;hl=en&amp;amp;fs=1&amp;amp;color1=0x3a3a3a&amp;amp;color2=0x999999"&gt;
&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/MBRFkLKRwFw&amp;amp;hl=en&amp;amp;fs=1&amp;amp;color1=0x3a3a3a&amp;amp;color2=0x999999" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="385" width="640"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;p&gt;Happy coding!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6755709643044947179-604925027217581638?l=android-developers.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=5nIry2OEOGY:wrBS8iQ-Dbw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/hsDu?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=5nIry2OEOGY:wrBS8iQ-Dbw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/hsDu?i=5nIry2OEOGY:wrBS8iQ-Dbw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/hsDu/~4/5nIry2OEOGY" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6755709643044947179/posts/default/604925027217581638?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6755709643044947179/posts/default/604925027217581638?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/hsDu/~3/5nIry2OEOGY/android-16-sdk-is-here.html" title="Android 1.6 SDK is here" /><author><name>Xavier Ducrohet, Android SDK Tech Lead</name><uri>http://www.blogger.com/profile/00361998914767345309</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="14283194986884703640" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_kNUIczJH1OM/Sqmkj5D-jwI/AAAAAAAAAAM/Tr6FGp6-6sI/s72-c/donut.png" height="72" width="72" /><feedburner:origLink>http://android-developers.blogspot.com/2009/09/android-16-sdk-is-here.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkcGQnw6fCp7ImA9WxNREEw.&quot;"><id>tag:blogger.com,1999:blog-6755709643044947179.post-1410075355357241504</id><published>2009-09-03T15:30:00.000-07:00</published><updated>2009-09-03T15:47:03.214-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-03T15:47:03.214-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Android 1.6" /><category scheme="http://www.blogger.com/atom/ns#" term="Android Market" /><title>Some News from Android Market</title><content type="html">&lt;p&gt;I'm pleased to let you know about several updates to Android Market.  First, we will soon introduce new features in Android Market for Android 1.6 that will improve the overall experience for users.  As part of this change, developers will be able to provide screenshots, promotional icons and descriptions that will better show off applications and games.&lt;/p&gt;&lt;p&gt;We have also added four new sub-categories for applications: sports, health, themes, and comics.  Developers can now choose these sub-categories for both new and existing applications via the publisher website.  Finally, we have added seller support for developers in Italy.  Italian developers can go to the publisher website to upload applications and target any of the countries where paid applications are currently available to users.&lt;/p&gt;&lt;p&gt;To take advantage of the upcoming Android Market refresh, we encourage you to visit the &lt;a href="http://market.android.com/publish/"&gt;Android Market publisher website&lt;/a&gt; and upload additional marketing assets.  Check out the video below for some of the highlights.&lt;/p&gt;&lt;object width="640" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/8ma9Xh67Eyo&amp;hl=en&amp;fs=1&amp;color1=0x3a3a3a&amp;color2=0x999999"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/8ma9Xh67Eyo&amp;hl=en&amp;fs=1&amp;color1=0x3a3a3a&amp;color2=0x999999" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6755709643044947179-1410075355357241504?l=android-developers.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=NMmpgXmXKoQ:tsUQOkyika4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/hsDu?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=NMmpgXmXKoQ:tsUQOkyika4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/hsDu?i=NMmpgXmXKoQ:tsUQOkyika4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/hsDu/~4/NMmpgXmXKoQ" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6755709643044947179/posts/default/1410075355357241504?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6755709643044947179/posts/default/1410075355357241504?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/hsDu/~3/NMmpgXmXKoQ/some-news-from-android-market.html" title="Some News from Android Market" /><author><name>Eric Chu, Android Mobile Platform</name><uri>http://www.blogger.com/profile/11243666057159213807</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00850393112957401966" /></author><feedburner:origLink>http://android-developers.blogspot.com/2009/09/some-news-from-android-market.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D08EQX4zcSp7ImA9WxNSFkU.&quot;"><id>tag:blogger.com,1999:blog-6755709643044947179.post-8203663293677442286</id><published>2009-08-30T19:30:00.000-07:00</published><updated>2009-08-30T19:30:00.089-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-30T19:30:00.089-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Android Developer Challenge" /><title>ADC2 Submissions Closing Monday!</title><content type="html">&lt;p&gt;Don't forget to submit your ADC2 apps by midnight PST on Monday, August 31! Remember that this is Pacific time in the US (GMT - 7) so be sure to convert the deadline into your local timezone.&lt;/p&gt;&lt;p&gt;Also, even if you've already submitted your apps, please double check and make sure that your app is in the "Submitted" state in the UI!  If it says "Unsubmitted", it will NOT be considered as an entry.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6755709643044947179-8203663293677442286?l=android-developers.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=e9DNBRJm7BU:AII5X8ii6wg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/hsDu?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=e9DNBRJm7BU:AII5X8ii6wg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/hsDu?i=e9DNBRJm7BU:AII5X8ii6wg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/hsDu/~4/e9DNBRJm7BU" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6755709643044947179/posts/default/8203663293677442286?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6755709643044947179/posts/default/8203663293677442286?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/hsDu/~3/e9DNBRJm7BU/adc2-submissions-closing-monday.html" title="ADC2 Submissions Closing Monday!" /><author><name>David McLaughlin</name><uri>http://www.blogger.com/profile/07251078650813170094</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="06397026801281146430" /></author><feedburner:origLink>http://android-developers.blogspot.com/2009/08/adc2-submissions-closing-monday.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE4EQ34_eSp7ImA9WxNSEU4.&quot;"><id>tag:blogger.com,1999:blog-6755709643044947179.post-5042651050098152880</id><published>2009-08-24T09:50:00.000-07:00</published><updated>2009-08-24T09:55:02.041-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-24T09:55:02.041-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Android Developer Challenge" /><title>Android Developer Challenge 2 open for submissions</title><content type="html">&lt;p&gt;&lt;img src="http://2.bp.blogspot.com/_-e06f1q-QQE/SLcdjvXWN2I/AAAAAAAAAGc/kkSvcvrRWok/s320/android_adc.gif" alt="Android Developer Challenge" align="right" /&gt;The time has come! The submission site for Android Developer Challenge 2 is now open. You can now submit applications for the Challenge at &lt;a href="http://market.android.com/adc"&gt;http://market.android.com/adc&lt;/a&gt;.  Full instructions are also available on the site.&lt;/p&gt;&lt;p&gt;The key thing to remember is that all submissions must be entered by 11:59:59pm Pacific Time in the United States on August 31, 2009. If your applications are not submitted by that time, they won't be eligible for participation. Please carefully note what time that is in your local time zone.&lt;/p&gt;&lt;p&gt;It's very important that your apps only use published APIs. Some users might be judging your submissions on new phones you haven't seen or tested.  If your apps depend on unpublished APIs, they might not work on some of these phones. Please note that you won't be able to submit new versions of your apps after the deadline!&lt;/p&gt;&lt;p&gt;Since you'll be competing against developers around the world for users' attention, it is important to focus on the fit and finish of your app.  Your apps will be judged by users as a final product and not just a cool demo.&lt;/p&gt;&lt;p&gt;As a final note, if you've uploaded a version of your app to Android Market, you'll need to use a different Android package name for the version you submit to the Challenge.&lt;/p&gt;&lt;p&gt;I look forward to see all the great apps and innovations from you all.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6755709643044947179-5042651050098152880?l=android-developers.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=k5r7loH1jNw:LW8z0qwoQS4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/hsDu?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=k5r7loH1jNw:LW8z0qwoQS4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/hsDu?i=k5r7loH1jNw:LW8z0qwoQS4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/hsDu/~4/k5r7loH1jNw" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6755709643044947179/posts/default/5042651050098152880?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6755709643044947179/posts/default/5042651050098152880?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/hsDu/~3/k5r7loH1jNw/android-developer-challenge-2-open-for.html" title="Android Developer Challenge 2 open for submissions" /><author><name>Eric Chu, Android Mobile Platform</name><uri>http://www.blogger.com/profile/11243666057159213807</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00850393112957401966" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_-e06f1q-QQE/SLcdjvXWN2I/AAAAAAAAAGc/kkSvcvrRWok/s72-c/android_adc.gif" height="72" width="72" /><feedburner:origLink>http://android-developers.blogspot.com/2009/08/android-developer-challenge-2-open-for.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0ANRHc7fCp7ImA9WxJUFU8.&quot;"><id>tag:blogger.com,1999:blog-6755709643044947179.post-1204734511466994858</id><published>2009-07-13T14:45:00.000-07:00</published><updated>2009-07-13T14:49:55.904-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-13T14:49:55.904-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Android Developer Challenge" /><category scheme="http://www.blogger.com/atom/ns#" term="Announcements" /><title>ADC 2 Updates</title><content type="html">&lt;img src="http://2.bp.blogspot.com/_-e06f1q-QQE/SLcdjvXWN2I/AAAAAAAAAGc/kkSvcvrRWok/s320/android_adc.gif" align="right"&gt;&lt;p&gt;Since the &lt;a href="http://android-developers.blogspot.com/2009/05/calling-all-developers-for-android.html"&gt;announcement of Android Developer Challenge 2&lt;/a&gt; in May, Android phones continue to be deployed in countries worldwide. Android phones are currently available in over 20 countries, with more on the way. As I've mentioned earlier, we'll be including real-world users of these phones to help review and score your submissions.  It is important to remember that your apps will be reviewed by judges around the world on actual devices; thus,   be sure to make it extremely easy for users/judges to access your apps with minimum setup. &lt;/p&gt; &lt;p&gt; Some of you have been asking for clarifications on what we mean by "open only to applications that have not been published".  To be specific, applications that are available on Android Market before August 1, 2009 will not be eligible to participate in the contest. Users have already been providing comments for apps that are currently available on Android Market, so it wouldn't make sense for them to "judge" the same apps again in this contest.  In addition, apps that include or that are based on open source projects are fully welcomed, as long as the application itself is not on Android Market until August 1, 2009. &lt;/p&gt; &lt;p&gt; If you want to find out more details about ADC 2, you can find everything at the &lt;a href="http://code.google.com/android/adc/"&gt;ADC 2 page&lt;/a&gt; along with the &lt;a href="http://code.google.com/android/adc/adc2_terms.html"&gt;Terms and Conditions&lt;/a&gt;.  For the moment, the most important thing to know is that ADC 2 submissions will be due August 31.  I can't wait to see what you all come up with this time. &lt;/p&gt; &lt;p&gt; Happy coding -- and good luck! &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6755709643044947179-1204734511466994858?l=android-developers.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=eYGbMUMXXY8:B8gcG7Stt5E:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/hsDu?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=eYGbMUMXXY8:B8gcG7Stt5E:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/hsDu?i=eYGbMUMXXY8:B8gcG7Stt5E:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/hsDu/~4/eYGbMUMXXY8" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6755709643044947179/posts/default/1204734511466994858?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6755709643044947179/posts/default/1204734511466994858?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/hsDu/~3/eYGbMUMXXY8/adc-2-updates.html" title="ADC 2 Updates" /><author><name>Eric Chu, Android Mobile Platform</name><uri>http://www.blogger.com/profile/11243666057159213807</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00850393112957401966" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_-e06f1q-QQE/SLcdjvXWN2I/AAAAAAAAAGc/kkSvcvrRWok/s72-c/android_adc.gif" height="72" width="72" /><feedburner:origLink>http://android-developers.blogspot.com/2009/07/adc-2-updates.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0UCRXw6cSp7ImA9WxJWGUg.&quot;"><id>tag:blogger.com,1999:blog-6755709643044947179.post-5375150057279538273</id><published>2009-06-25T10:30:00.000-07:00</published><updated>2009-06-25T10:34:24.219-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-25T10:34:24.219-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Android 1.5" /><category scheme="http://www.blogger.com/atom/ns#" term="NDK" /><category scheme="http://www.blogger.com/atom/ns#" term="Announcements" /><title>Introducing Android 1.5 NDK, Release 1</title><content type="html">&lt;p&gt;Many of you have been asking for the ability to call into native code from your Android applications. I'm glad to announce that developers can now download the &lt;a href="http://developer.android.com/sdk/ndk/1.5_r1/index.html"&gt;Android Native Development Kit&lt;/a&gt; from the Android developer site.&lt;/p&gt;&lt;p&gt;As you know, Android applications run in the Dalvik virtual machine.  The NDK allows developers to implement parts of these applications using native-code languages such as C and C++. This can provide benefits to certain kinds of applications.&lt;/p&gt;&lt;p&gt;The NDK provides:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;a set of tools and build files used to generate native code libraries from C and C++ sources&lt;/li&gt;&lt;li&gt;a way to embed the corresponding native libraries into application packages files (.apks) that can be deployed on Android devices&lt;/li&gt;&lt;li&gt;a set of native system headers and libraries that will be supported in all future releases of the Android platform, starting from Android 1.5 documentation, samples and tutorials&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;This release of the NDK supports the ARMv5TE machine instruction set and provides stable headers for:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;libc, the standard C library&lt;/li&gt;&lt;li&gt;libm, the standard math library&lt;/li&gt;&lt;li&gt;the JNI interface&lt;/li&gt;&lt;li&gt;libz, the common ZLib compression library&lt;/li&gt;&lt;li&gt;liblog, used to send logcat messages to the kernel&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Keep in mind that using the NDK will not be relevant for all Android applications. As a developer, you will need to balance its benefits against its drawbacks, which are numerous!  Your application will be more complicated, have reduced compatibility, have no access to framework APIs, and be harder to debug. That said, some applications that have self-contained, CPU-intensive operations that don't allocate much memory may still benefit from increased performance and the ability to reuse existing code.  Some examples are signal processing, intensive physics simulations, and some kinds of data processing.&lt;/p&gt;&lt;p&gt;For any questions on the NDK, please join the &lt;a href="http://groups.google.com/group/android-ndk"&gt;Android NDK forum&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Have fun.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6755709643044947179-5375150057279538273?l=android-developers.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=2foWz7hwFtE:bMjCa29nU10:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/hsDu?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=2foWz7hwFtE:bMjCa29nU10:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/hsDu?i=2foWz7hwFtE:bMjCa29nU10:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/hsDu/~4/2foWz7hwFtE" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6755709643044947179/posts/default/5375150057279538273?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6755709643044947179/posts/default/5375150057279538273?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/hsDu/~3/2foWz7hwFtE/introducing-android-15-ndk-release-1.html" title="Introducing Android 1.5 NDK, Release 1" /><author><name>David Turner</name><uri>http://www.blogger.com/profile/11184262845691377700</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="11972009299897723328" /></author><feedburner:origLink>http://android-developers.blogspot.com/2009/06/introducing-android-15-ndk-release-1.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk8FQHkzcSp7ImA9WxJXEEs.&quot;"><id>tag:blogger.com,1999:blog-6755709643044947179.post-6365226330003873799</id><published>2009-06-03T13:00:00.000-07:00</published><updated>2009-06-03T14:33:31.789-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-03T14:33:31.789-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Guidelines" /><category scheme="http://www.blogger.com/atom/ns#" term="User Interface" /><title>Activities and Tasks Design Guidelines</title><content type="html">&lt;p&gt;For our third post in the series of Android UI, we're releasing &lt;a href="http://developer.android.com/guide/practices/ui_guidelines/activity_task_design.html"&gt;Activity and Task Design Guidelines&lt;/a&gt;. This section of our guidelines aims to help you understand basic concepts of activities and tasks, how they work, and how to enrich the user experience you are creating.&lt;/p&gt;&lt;p&gt;We've packed a lot into this section, which is targeted at designers and developers. You'll see examples that will illustrate how to use our core principles and mechanisms, such as multitasking, activity reuse, intents, and the back stack.&lt;/p&gt;&lt;p&gt;Additionally, we are providing some best practices around our UI patterns such as notifications. For example, we'll show you how to design a notification so that it will take the user to the screen they expect.  This behavior needs to be thought out, and doesn't necessarily just happen by default.&lt;/p&gt;&lt;p&gt;With helpful pointers to the API's and this documentation, we look forward to building your understanding of what it means to design and develop an Android UI. &lt;/p&gt;&lt;p&gt;&lt;img src="http://1.bp.blogspot.com/_skDnkH-UhlQ/ShzTnAHyxmI/AAAAAAAAABQ/aBL5QqhcuaQ/s400/HomeTaskBasics1d-small.png" alt="" border="0" /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6755709643044947179-6365226330003873799?l=android-developers.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=aXdmYVagwDs:7HVK8KTZrHc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/hsDu?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=aXdmYVagwDs:7HVK8KTZrHc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/hsDu?i=aXdmYVagwDs:7HVK8KTZrHc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/hsDu/~4/aXdmYVagwDs" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6755709643044947179/posts/default/6365226330003873799?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6755709643044947179/posts/default/6365226330003873799?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/hsDu/~3/aXdmYVagwDs/activities-and-tasks-design-guidelines.html" title="Activities and Tasks Design Guidelines" /><author><name>Doug Kramer</name><uri>http://www.blogger.com/profile/03063975743681455376</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10482118479720122042" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_skDnkH-UhlQ/ShzTnAHyxmI/AAAAAAAAABQ/aBL5QqhcuaQ/s72-c/HomeTaskBasics1d-small.png" height="72" width="72" /><feedburner:origLink>http://android-developers.blogspot.com/2009/06/activities-and-tasks-design-guidelines.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0MEQ3g9cCp7ImA9WxJQFEU.&quot;"><id>tag:blogger.com,1999:blog-6755709643044947179.post-7205415940234122978</id><published>2009-05-27T11:00:00.000-07:00</published><updated>2009-05-27T22:43:22.668-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-27T22:43:22.668-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Android Developer Challenge" /><category scheme="http://www.blogger.com/atom/ns#" term="Announcements" /><title>Calling all developers for Android Developer Challenge 2!</title><content type="html">&lt;img src="http://2.bp.blogspot.com/_-e06f1q-QQE/SLcdjvXWN2I/AAAAAAAAAGc/kkSvcvrRWok/s320/android_adc.gif" align="right"&gt;&lt;p&gt;I'm excited to announce the second Android Developer Challenge (ADC)! The first challenge was a huge success with over 1,700 entries that resulted in &lt;a href="http://code.google.com/android/adc/adc_gallery/"&gt;50 excellent winners&lt;/a&gt;. With the recent release of Android 1.5, as well as the availability of devices in multiple markets around the world, I'm pleased to announce the second ADC.&lt;/p&gt;&lt;p&gt;We've expanded ADC 2 to involve a very important part of the Android community&amp;mdash;the users who will be running these applications.  Users of Android-powered devices with Android Market will be able to download a special Android judging application and use it to download and rank applications submitted to the Challenge. The results from this round will determine the top ranking applications in each of the 10 categories.  These top applications will then be ranked by a combination of users and a panel of Google selected judges through a similar process as the first round to determine the final winners.&lt;/p&gt;&lt;p&gt;I've already seen a lot of great apps on Android and I look forward to seeing even more innovative and unexpected cool apps that will come out of this Challenge! For more details on ADC 2, please see the &lt;a href="http://code.google.com/android/adc/"&gt;official site&lt;/a&gt;. Start your engines and good luck!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6755709643044947179-7205415940234122978?l=android-developers.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=M3e43BWGH_0:66k5Z-Qjxbo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/hsDu?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=M3e43BWGH_0:66k5Z-Qjxbo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/hsDu?i=M3e43BWGH_0:66k5Z-Qjxbo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/hsDu/~4/M3e43BWGH_0" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6755709643044947179/posts/default/7205415940234122978?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6755709643044947179/posts/default/7205415940234122978?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/hsDu/~3/M3e43BWGH_0/calling-all-developers-for-android.html" title="Calling all developers for Android Developer Challenge 2!" /><author><name>Eric Chu, Android Mobile Platform</name><uri>http://www.blogger.com/profile/11243666057159213807</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00850393112957401966" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_-e06f1q-QQE/SLcdjvXWN2I/AAAAAAAAAGc/kkSvcvrRWok/s72-c/android_adc.gif" height="72" width="72" /><feedburner:origLink>http://android-developers.blogspot.com/2009/05/calling-all-developers-for-android.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEcEQHc-cSp7ImA9WxJQE0s.&quot;"><id>tag:blogger.com,1999:blog-6755709643044947179.post-41231587637295475</id><published>2009-05-26T11:20:00.000-07:00</published><updated>2009-05-26T11:20:01.959-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-26T11:20:01.959-07:00</app:edited><title>Android Icon Guidelines</title><content type="html">&lt;p&gt;&lt;img src="http://docs.google.com/a/google.com/File?id=ad9xdxhtb4_21d5zv7fcb_b" style="width: 172px; height: 164px; float: left; margin-left: 0px; margin-right: 1em;" id="q8te"&gt;For our second post in our series on Android UI, we're releasing our &lt;a title="Icon Design Guidelines" href="http://developer.android.com/guide/practices/ui_guidelines/icon_design.html"&gt;Icon Design Guidelines&lt;/a&gt; and an &lt;a title="Android Icon Templates Pack" href="http://developer.android.com/shareables/icon_templates-v1.0.zip"&gt;Android Icon Templates Pack&lt;/a&gt;. These should make it a lot easier for you (or your designer) to develop all the icons your applications need, so they fit with the other icons in the Android environment.&lt;/p&gt;&lt;p&gt;The Icon Design Guidelines document describes how to design and export icons that fit within the Android framework. It includes a wealth of detail about icons in the &lt;a title="Home screen" href="http://developer.android.com/guide/practices/ui_guidelines/icon_design.html#launcherstructure"&gt;Home screen&lt;/a&gt;, &lt;a title="menus" href="http://developer.android.com/guide/practices/ui_guidelines/icon_design.html#menustructure"&gt;menus&lt;/a&gt;, the &lt;a title="status bar" href="http://developer.android.com/guide/practices/ui_guidelines/icon_design.html#statusbarstructure"&gt;status bar&lt;/a&gt;, &lt;a title="tabs" href="http://developer.android.com/guide/practices/ui_guidelines/icon_design.html#tabstructure"&gt;tabs&lt;/a&gt;, &lt;a title="dialogs" href="http://developer.android.com/guide/practices/ui_guidelines/icon_design.html#dialogstructure"&gt;dialogs&lt;/a&gt;, and &lt;a title="lists" href="http://developer.android.com/guide/practices/ui_guidelines/icon_design.html#listviewstructure"&gt;lists&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;The Android Icon Templates Pack is a collection of template designs, filters, and settings that make it easier for you to create icons that conform to the general specifications given in this Guidelines document. We recommend downloading the template pack archive before you get started with your icon design.&lt;/p&gt;&lt;p&gt;The Templates Pack provides templates in Adobe Photoshop and Adobe Illustrator file formats, which preserves the layers and design treatments we used when creating the standard icons for the Android platform. You can load the template files into any compatible image-editing program, although your ability to work directly with the layers and treatments may vary based on the program you are using.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6755709643044947179-41231587637295475?l=android-developers.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=4RYt2kBnEUk:cuot_hCQr9o:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/hsDu?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=4RYt2kBnEUk:cuot_hCQr9o:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/hsDu?i=4RYt2kBnEUk:cuot_hCQr9o:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/hsDu/~4/4RYt2kBnEUk" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6755709643044947179/posts/default/41231587637295475?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6755709643044947179/posts/default/41231587637295475?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/hsDu/~3/4RYt2kBnEUk/android-icon-guidelines.html" title="Android Icon Guidelines" /><author><name>Chris Nesladek</name><uri>http://www.blogger.com/profile/00650153306523605448</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="15005591833900444280" /></author><feedburner:origLink>http://android-developers.blogspot.com/2009/05/android-icon-guidelines.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE4EQ387cCp7ImA9WxJQEE8.&quot;"><id>tag:blogger.com,1999:blog-6755709643044947179.post-7797948979126681822</id><published>2009-05-22T14:15:00.000-07:00</published><updated>2009-05-22T14:15:02.108-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-22T14:15:02.108-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Google I/O" /><title>Lightning talks at Google I/O</title><content type="html">&lt;p&gt;&lt;a href="http://code.google.com/events/io/"&gt;Google I/O&lt;/a&gt; is approaching, and with over ten &lt;a href="http://code.google.com/events/io/schedule.html"&gt;quality talks&lt;/a&gt; lined up, we should all strive to be attentive, avid learners. But for the last Android session of the conference, we thought it would be fun to unwind and open up the podium for &lt;a href="http://en.wikipedia.org/wiki/Lightning_Talk"&gt;lightning talks&lt;/a&gt;. This is where anyone can take the stage for six minutes and talk about anything. If you've done a cool hack involving Android, if you've devised a clever technique for a common problem, or even if you just want to get up on your soapbox for six minutes to appeal to your fellow developers, this is your time to be heard.&lt;/p&gt;&lt;p&gt;For those planning on attending Google I/O, we need you to submit and judge lightning talk proposals through a &lt;a href="http://moderator.appspot.com/#15/e=6de3b&amp;amp;t=6a7d9"&gt;Google Moderator series&lt;/a&gt; we've set up. Please go ahead and start submitting your proposals. You only have 250 characters to describe the talk, which may be 110 more characters than you've been used to these days.&lt;/p&gt;&lt;p&gt;Voting is open from now until the moment the session starts. We'll take the eight highest rated talks and will call upon each speaker to take the stage. Remember you only have six minutes. Exceed that, and our security force tackles you off the stage. Thanks and see you all at I/O!&lt;/p&gt;&lt;p&gt;&lt;a href="http://moderator.appspot.com/#15/e=6de3b&amp;amp;t=6a7d9"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 111px;" src="http://1.bp.blogspot.com/_Yv8sBwNnaiI/ShbrVCvEzTI/AAAAAAAAABI/-ETRMZrnfmw/s400/cd3jzrcb_24dmsdzmhj_b.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5338713155038399794" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6755709643044947179-7797948979126681822?l=android-developers.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=IAriuc6svpw:jwtF-ra43mg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/hsDu?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=IAriuc6svpw:jwtF-ra43mg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/hsDu?i=IAriuc6svpw:jwtF-ra43mg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/hsDu/~4/IAriuc6svpw" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6755709643044947179/posts/default/7797948979126681822?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6755709643044947179/posts/default/7797948979126681822?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/hsDu/~3/IAriuc6svpw/lightning-talks-at-google-io.html" title="Lightning talks at Google I/O" /><author><name>James Yum</name><uri>http://www.blogger.com/profile/08187363046295257307</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="09184109853385563376" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_Yv8sBwNnaiI/ShbrVCvEzTI/AAAAAAAAABI/-ETRMZrnfmw/s72-c/cd3jzrcb_24dmsdzmhj_b.png" height="72" width="72" /><feedburner:origLink>http://android-developers.blogspot.com/2009/05/lightning-talks-at-google-io.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C08ASHc8cCp7ImA9WxJSFk4.&quot;"><id>tag:blogger.com,1999:blog-6755709643044947179.post-2021514946948968931</id><published>2009-05-06T09:30:00.000-07:00</published><updated>2009-05-06T10:44:09.978-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-06T10:44:09.978-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="How-to" /><category scheme="http://www.blogger.com/atom/ns#" term="Android 1.5" /><category scheme="http://www.blogger.com/atom/ns#" term="User Interface" /><title>Painless threading</title><content type="html">&lt;p&gt;Whenever you first start an Android application, a thread called "main" is automatically created. The main thread, also called the UI thread, is very important because it is in charge of dispatching the events to the appropriate widgets and this includes the drawing events. It is also the thread you interact with Android widgets on. For instance, if you touch the a button on screen, the UI thread dispatches the touch event to the widget which in turn sets its pressed state and posts an invalidate request to the event queue. The UI thread dequeues the request and notifies the widget to redraw itself.&lt;/p&gt;&lt;p&gt;This single thread model can yield poor performance in Android applications that do not consider the implications. Since everything happens on a single thread performing long operations, like network access or database queries, on this thread will block the whole user interface. No event can be dispatched, including drawing events, while the long operation is underway. From the user's perspective, the application appears hung. Even worse, if the UI thread is blocked for more than a few seconds (about 5 seconds currently) the user is presented with the infamous "&lt;a href="http://developer.android.com/guide/practices/design/responsiveness.html"&gt;application not responding&lt;/a&gt;" (ANR) dialog.&lt;/p&gt;&lt;p&gt;If you want to see how bad this can look, write a simple application with a button that invokes &lt;code&gt;Thread.sleep(2000)&lt;/code&gt; in its &lt;a href="http://developer.android.com/reference/android/view/View.OnClickListener.html"&gt;OnClickListener&lt;/a&gt;. The button will remain in its pressed state for about 2 seconds before going back to its normal state. When this happens, it is very easy for the user to &lt;em&gt;perceive&lt;/em&gt; the application as slow.&lt;/p&gt;&lt;p&gt;Now that you know you &lt;em&gt;must&lt;/em&gt; avoid lengthy operations on the UI thread, you will probably use extra threads (&lt;em&gt;background&lt;/em&gt; or &lt;em&gt;worker&lt;/em&gt; threads) to perform these operations, and rightly so. Let's take the example of a click listener downloading an image over the network and displaying it in an &lt;a href="http://developer.android.com/reference/android/widget/ImageView.html"&gt;ImageView&lt;/a&gt;:&lt;/p&gt;&lt;pre class="prettyprint"&gt;public void onClick(View v) {
  new Thread(new Runnable() {
    public void run() {
      Bitmap b = loadImageFromNetwork();
      mImageView.setImageBitmap(b);
    }
  }).start();
}&lt;/pre&gt;&lt;p&gt;At first, this code seems to be a good solution to your problem, as it does not block the UI thread. Unfortunately, it violates the single thread model: the Android UI toolkit is not thread-safe and must always be manipulated on the UI thread. In this piece of code, the &lt;code&gt;ImageView&lt;/code&gt; is manipulated on a worker thread, which can cause really weird problems. Tracking down and fixing such bugs can be difficult and time-consuming.&lt;/p&gt;&lt;p&gt;Android offers several ways to access the UI thread from other threads. You may already be familiar with some of them but here is a comprehensive list:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://developer.android.com/reference/android/app/Activity.html#runOnUiThread(java.lang.Runnable)"&gt;Activity.runOnUiThread(Runnable)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://developer.android.com/reference/android/view/View.html#post(java.lang.Runnable)"&gt;View.post(Runnable)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://developer.android.com/reference/android/view/View.html#postDelayed(java.lang.Runnable,%20long)"&gt;View.postDelayed(Runnable, long)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://developer.android.com/reference/android/os/Handler.html"&gt;Handler&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Any of these classes and methods could be used to correct our previous code example:&lt;/p&gt;&lt;pre class="prettyprint"&gt;public void onClick(View v) {
  new Thread(new Runnable() {
    public void run() {
      final Bitmap b = loadImageFromNetwork();
      mImageView.post(new Runnable() {
        public void run() {
          mImageView.setImageBitmap(b);
        }
      });
    }
  }).start();
}&lt;/pre&gt;&lt;p&gt;Unfortunately, these classes and methods also tend to make your code more complicated and more difficult to read. It becomes even worse when your implement complex operations that require frequent UI updates. To remedy this problem, Android 1.5 offers a new utility class, called &lt;a href="http://developer.android.com/reference/android/os/AsyncTask.html"&gt;AsyncTask&lt;/a&gt;, that simplifies the creation of long-running tasks that need to communicate with the user interface.&lt;/p&gt;&lt;p&gt;&lt;a href="http://developer.android.com/reference/android/os/AsyncTask.html"&gt;AsyncTask&lt;/a&gt; is also available for Android 1.0 and 1.1 under the name &lt;a href="http://code.google.com/p/shelves/source/browse/trunk/Shelves/src/org/curiouscreature/android/shelves/util/UserTask.java"&gt;UserTask&lt;/a&gt;. It offers the exact same API and all you have to do is copy its source code in your application.&lt;/p&gt;&lt;p&gt;The goal of &lt;code&gt;AsyncTask&lt;/code&gt; is to take care of thread management for you. Our previous example can easily be rewritten with &lt;code&gt;AsyncTask&lt;/code&gt;:&lt;/p&gt;&lt;pre class="prettyprint"&gt;public void onClick(View v) {
  new DownloadImageTask().execute("http://example.com/image.png");
}

private class DownloadImageTask extends AsyncTask&lt;String, Void, Bitmap&gt; {
     protected Bitmap doInBackground(String... urls) {
         return loadImageFromNetwork(urls[0]);
     }

     protected void onPostExecute(Bitmap result) {
         mImageView.setImageBitmap(result);
     }
 }&lt;/pre&gt;&lt;p&gt;As you can see, &lt;code&gt;AsyncTask&lt;/code&gt; &lt;em&gt;must&lt;/em&gt; be used by subclassing it. It is also very important to remember that an &lt;code&gt;AsyncTask&lt;/code&gt; instance has to be created on the UI thread and can be executed only once. You can read the &lt;a href="http://developer.android.com/reference/android/os/AsyncTask.html"&gt;AsyncTask documentation&lt;/a&gt; for a full understanding on how to use this class, but here is a quick overview of how it works:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;You can specify the type, using generics, of the parameters, the progress values and the final value of the task&lt;/li&gt;&lt;li&gt;The method &lt;a href="http://developer.android.com/reference/android/os/AsyncTask.html#doInBackground(Params...)"&gt;doInBackground()&lt;/a&gt; executes automatically on a worker thread&lt;/li&gt;&lt;li&gt;&lt;a href="http://developer.android.com/reference/android/os/AsyncTask.html#onPreExecute()"&gt;onPreExecute()&lt;/a&gt;, &lt;a href="http://developer.android.com/reference/android/os/AsyncTask.html#onPostExecute(Result)"&gt;onPostExecute()&lt;/a&gt; and &lt;a href="http://developer.android.com/reference/android/os/AsyncTask.html#onProgressUpdate(Progress...)"&gt;onProgressUpdate()&lt;/a&gt; are all invoked on the UI thread&lt;/li&gt;&lt;li&gt;The value returned by &lt;a href="http://developer.android.com/reference/android/os/AsyncTask.html#doInBackground(Params...)"&gt;doInBackground()&lt;/a&gt; is sent to &lt;a href="http://developer.android.com/reference/android/os/AsyncTask.html#onPostExecute(Result)"&gt;onPostExecute()&lt;/a&gt;&lt;/li&gt;&lt;li&gt;You can call &lt;a href="http://developer.android.com/reference/android/os/AsyncTask.html#publishProgress(Progress...)"&gt;publishProgress()&lt;/a&gt; at anytime in &lt;a href="http://developer.android.com/reference/android/os/AsyncTask.html#doInBackground(Params...)"&gt;doInBackground()&lt;/a&gt; to execute &lt;a href="http://developer.android.com/reference/android/os/AsyncTask.html#onProgressUpdate(Progress...)"&gt;onProgressUpdate()&lt;/a&gt; on the UI thread&lt;/li&gt;&lt;li&gt;You can cancel the task at any time, from any thread&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;In addition to the official documentation, you can read several complex examples in the source code of Shelves (&lt;a href="http://code.google.com/p/shelves/source/browse/trunk/Shelves/src/org/curiouscreature/android/shelves/activity/ShelvesActivity.java"&gt;ShelvesActivity.java&lt;/a&gt; and &lt;a href="http://code.google.com/p/shelves/source/browse/trunk/Shelves/src/org/curiouscreature/android/shelves/activity/AddBookActivity.java"&gt;AddBookActivity.java&lt;/a&gt;) and Photostream (&lt;a href="http://code.google.com/p/apps-for-android/source/browse/trunk/Photostream/src/com/google/android/photostream/LoginActivity.java"&gt;LoginActivity.java&lt;/a&gt;, &lt;a href="http://code.google.com/p/apps-for-android/source/browse/trunk/Photostream/src/com/google/android/photostream/PhotostreamActivity.java"&gt;PhotostreamActivity.java&lt;/a&gt; and &lt;a href="http://code.google.com/p/apps-for-android/source/browse/trunk/Photostream/src/com/google/android/photostream/ViewPhotoActivity.java"&gt;ViewPhotoActivity.java&lt;/a&gt;). I highly recommend reading the source code of &lt;a href="http://code.google.com/p/shelves/"&gt;Shelves&lt;/a&gt; to see how to persist tasks across configuration changes and how to cancel them properly when the activity is destroyed.&lt;/p&gt;&lt;p&gt;Regardless of whether or not you use &lt;a href="http://developer.android.com/reference/android/os/AsyncTask.html"&gt;AsyncTask&lt;/a&gt;, always remember these two rules about the single thread model: do not block the UI thread and make sure the Android UI toolkit is only accessed on the UI thread. &lt;a href="http://developer.android.com/reference/android/os/AsyncTask.html"&gt;AsyncTask&lt;/a&gt; just makes it easier to do both of these things.&lt;/p&gt;&lt;p&gt;If you want to learn more cool techniques, come join us at &lt;a href="http://code.google.com/events/io/"&gt;Google I/O&lt;/a&gt;. Members of the Android team will be there to give a &lt;a href="http://code.google.com/events/io/sessions.html#android"&gt;series of in-depth technical sessions&lt;/a&gt; and answer all your questions.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6755709643044947179-2021514946948968931?l=android-developers.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=rV3jg9vInwQ:K5VTaqzVCBE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/hsDu?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=rV3jg9vInwQ:K5VTaqzVCBE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/hsDu?i=rV3jg9vInwQ:K5VTaqzVCBE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/hsDu/~4/rV3jg9vInwQ" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6755709643044947179/posts/default/2021514946948968931?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6755709643044947179/posts/default/2021514946948968931?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/hsDu/~3/rV3jg9vInwQ/painless-threading.html" title="Painless threading" /><author><name>Romain Guy</name><uri>http://www.blogger.com/profile/14359137835485363401</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="11053364165382206530" /></author><feedburner:origLink>http://android-developers.blogspot.com/2009/05/painless-threading.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkcER3s-eSp7ImA9WxJSFEo.&quot;"><id>tag:blogger.com,1999:blog-6755709643044947179.post-2432088149258057512</id><published>2009-05-04T16:00:00.000-07:00</published><updated>2009-05-04T16:00:06.551-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-04T16:00:06.551-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="How-to" /><category scheme="http://www.blogger.com/atom/ns#" term="Android 1.5" /><category scheme="http://www.blogger.com/atom/ns#" term="User Interface" /><title>Drawable mutations</title><content type="html">&lt;p&gt;Android's drawables are extremely useful to easily build applications. A &lt;a href="http://developer.android.com/reference/android/graphics/drawable/Drawable.html"&gt;Drawable&lt;/a&gt; is a pluggable drawing container that is usually associated with a View. For instance, a &lt;a href="http://developer.android.com/reference/android/graphics/drawable/BitmapDrawable.html"&gt;BitmapDrawable&lt;/a&gt; is used to display images, a &lt;a href="http://developer.android.com/reference/android/graphics/drawable/ShapeDrawable.html"&gt;ShapeDrawable&lt;/a&gt; to draw shapes and gradients, etc. You can even combine them to create complex renderings.&lt;/p&gt;&lt;p&gt;Drawables allow you to easily customize the rendering of the widgets without subclassing them. As a matter of fact, they are so convenient that most of the default Android apps and widgets are built using drawables; there are about 700 drawables used in the core Android framework. Because drawables are used so extensively throughout the system, Android optimizes them when they are loaded from resources. For instance, every time you create a &lt;a href="http://developer.android.com/reference/android/widget/Button.html"&gt;Button&lt;/a&gt;, a new drawable is loaded from the framework resources (&lt;code&gt;android.R.drawable.btn_default&lt;/code&gt;). This means all buttons across all the apps use a different drawable instance as their background. However, all these drawables share a common state, called the "constant state." The content of this state varies according to the type of drawable you are using, but it usually contains all the properties that can be defined by a resource. In the case of a button, the constant state contains a bitmap image. This way, all buttons across all applications share the same bitmap, which saves a lot of memory.&lt;/p&gt;&lt;p&gt;The following diagram shows what entities are created when you assign the same image resource as the background of two different views. As you can see, two drawables are created but they both share the same constant state, hence the same bitmap:&lt;/p&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 307px; height: 400px;" src="http://1.bp.blogspot.com/_9l0GmPwgCzk/Sf0SgfbQcVI/AAAAAAAAAD8/xKcxTQCAxn0/s400/shared_states.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5331437883277472082" /&gt;&lt;p&gt;This state sharing feature is great to avoid wasting memory but it can cause problems when you try to modify the properties of a drawable. Imagine an application with a list of books. Each book has a star next to its name, totally opaque when the user marks the book as a favorite, and translucent when the book is not a favorite. To achieve this effect, you would probably write the following code in your list adapter's &lt;code&gt;getView()&lt;/code&gt; method:&lt;/p&gt;&lt;pre&gt;Book book = ...;
TextView listItem = ...;

listItem.setText(book.getTitle());

Drawable star = context.getResources().getDrawable(R.drawable.star);
if (book.isFavorite()) {
  star.setAlpha(255); // opaque
} else {
  star.setAlpha(70); // translucent
}&lt;/pre&gt;&lt;p&gt;Unfortunately, this piece of code yields a rather strange result, all the drawables have the same opacity:&lt;/p&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 267px; height: 400px;" src="http://4.bp.blogspot.com/_9l0GmPwgCzk/Sf0TgPCgubI/AAAAAAAAAEE/xP3FxmTfOgg/s400/all_drawables_changed.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5331438978390342066" /&gt;&lt;p&gt;This result is explained by the constant state. Even though we are getting a new drawable instance for each list item, the constant state remains the same and, in the case of BitmapDrawable, the opacity is part of the constant state. Thus, changing the opacity of one drawable instance changes the opacity of all the other instances. Even worse, working around this issue was not easy with Android 1.0 and 1.1.&lt;/p&gt;&lt;p&gt;Android 1.5 offers a very way to solve this issue with a the new &lt;a href="http://developer.android.com/reference/android/graphics/drawable/Drawable.html#mutate()"&gt;mutate() method&lt;/a&gt;. When you invoke this method on a drawable, the constant state of the drawable is duplicated to allow you to change any property without affecting other drawables. Note that bitmaps are still shared, even after mutating a drawable. The diagram below shows what happens when you invoke &lt;code&gt;mutate()&lt;/code&gt; on a drawable:&lt;/p&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 307px; height: 400px;" src="http://3.bp.blogspot.com/_9l0GmPwgCzk/Sf0UkFtP6PI/AAAAAAAAAEM/2ywQ5XZlpP4/s400/mutated_states.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5331440144116345074" /&gt;&lt;p&gt;Let's update our previous piece of code to make use of &lt;code&gt;mutate()&lt;/code&gt;:&lt;/p&gt;&lt;pre&gt;Drawable star = context.getResources().getDrawable(R.drawable.star);
if (book.isFavorite()) {
  star.mutate().setAlpha(255); // opaque
} else {
  star. mutate().setAlpha(70); // translucent
}&lt;/pre&gt;&lt;p&gt;For convenience, &lt;code&gt;mutate()&lt;/code&gt; returns the drawable itself, which allows to chain method calls. It does not however create a new drawable instance. With this new piece of code, our application now behaves correctly:&lt;/p&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 267px; height: 400px;" src="http://4.bp.blogspot.com/_9l0GmPwgCzk/Sf0VHyzBWlI/AAAAAAAAAEU/9wdeSyWHo4M/s400/correct_drawables.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5331440757515573842" /&gt;&lt;p&gt;If you want to learn more cool techniques, come join us at &lt;a href="http://code.google.com/events/io/"&gt;Google I/O&lt;/a&gt;. Members of the Android team will be there to give a &lt;a href="http://code.google.com/events/io/sessions.html#android"&gt;series of in-depth technical sessions&lt;/a&gt; and answer all your questions.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6755709643044947179-2432088149258057512?l=android-developers.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=zwURoE8P_p0:w_4CqK96T7w:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/hsDu?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=zwURoE8P_p0:w_4CqK96T7w:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/hsDu?i=zwURoE8P_p0:w_4CqK96T7w:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/hsDu/~4/zwURoE8P_p0" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6755709643044947179/posts/default/2432088149258057512?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6755709643044947179/posts/default/2432088149258057512?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/hsDu/~3/zwURoE8P_p0/drawable-mutations.html" title="Drawable mutations" /><author><name>Romain Guy</name><uri>http://www.blogger.com/profile/14359137835485363401</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="11053364165382206530" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_9l0GmPwgCzk/Sf0SgfbQcVI/AAAAAAAAAD8/xKcxTQCAxn0/s72-c/shared_states.png" height="72" width="72" /><feedburner:origLink>http://android-developers.blogspot.com/2009/05/drawable-mutations.html</feedburner:origLink></entry></feed>
