New Resources for Developers

We're back in action after a Thanksgiving break filled with turkey, stuffing, and pumpkin pie. Now it's the holiday season (at least, here in the U.S.) and we're filled with good will toward developers. Today I wanted to talk about a couple things we just finished polishing up.

First, the Android 1.0 SDK, release 2 is now available. Like the previous 1.0_r1 release, this new 1.0_r2 build creates applications that are compatible with Android 1.0 devices, such as the T-Mobile G1. This new release fixes a few bugs. In 1.0_r1, it was possible for developers to write technically-illegal code by using the Java Reflection APIs to access private or protected fields and methods. 1.0_r2 fixes that problem by enforcing private/protected visibility of items accessed via Reflection. Meanwhile, the class android.R.styleable was included in 1.0_r1 primarily for documentation purposes as a way for developers to look up the style attributes available to them to use. However, actually referring to that class via source code would result in applications that might break when run on future versions of the Android platform, so 1.0_r2 corrects the oversight and removes access to the class from the android.jar file. (The class remains in the documentation for reference purposes, though.)

Both of these problems are obscure "future-proofing" issues, and I'd be quite surprised if they actually caused problems for anyone, but now they're fixed. 1.0_r2 also includes a few other smaller changes; check out the release notes for all the details.

Second, many of you have asked if developer devices will be available. We've worked with our partners to create a program for developers to purchase devices that enable them to test and debug applications more easily.

I think these new tools will be quite helpful to developers, and I'm looking forward to seeing what people do with Android, next.

Touch Mode

Designing and developing user interfaces for Android is very different from doing so in a regular desktop environment. Because Android runs applications on mobile devices, application designers and developers must deal with numerous constraints that are not always obvious. To help you design and develop better applications, we are publishing a new series of posts focusing on Android user interfaces. In this series, we will give you design guides and tools, development tips, and explain the fundamental principles of the Android UI toolkit. The goal here is simple: we want to help you design and develop a great user experience. To start off this series, I'd like to introduce touch mode, one of the most important principles of the UI toolkit.

The touch mode is a state of the view hierarchy that depends solely on the user interaction with the phone. By itself, the touch mode is something very easy to understand as it simply indicates whether the last user interaction was performed with the touch screen. For example, if you are using a G1 phone, selecting a widget with the trackball will take you out of touch mode; however, if you touch a button on the screen with your finger, you will enter touch mode. When the user is not in touch mode, we talk about the trackball mode, navigation mode or keyboard navigation, so do not be surprised if you encounter these terms. Finally, there is only one API directly related to touch mode, View.isInTouchMode().

Sounds easy enough right? Oddly enough, touch mode is deceivingly simple and the consequences of entering touch mode are far greater than you might think. Let's look at some of the reasons why.

Touch Mode, Selection, and Focus

Designing a UI toolkit for mobile devices is difficult because of the various interaction mechanisms they provide. Some devices offer only 12 keys, some have a touch screen, some require a stylus, some have both a touch screen and a keyboard. In that regard, it is a great benefit for the Android development community that the first commercially available device, the G1, offers multiple forms of input using a touch screen, a trackball, and a keyboard. Because the user can interact with applications using three different mechanisms, we had to think very hard about all the possible issues that could arise. One issue led us to create the touch mode.

Imagine a simple application, ApiDemos for example, that shows a list of text items. The user can freely navigate through the list using the trackball and they can also scroll and fling the list using their finger. The issue in this scenario is the selection. If I select an item at the top of the list and then fling the list towards the bottom, what should happen to the selection? Should it remain on the item and scroll off the screen? In this case, what would happen if I then decide to move the selection with the trackball? Or worse, if I press the trackball to act upon the currently selected item, which is not shown on screen anymore. After careful considerations, we decided to remove the selection altogether.

In touch mode, there is no focus and no selection. Any selected item in a list of in a grid becomes unselected as soon as the user enters touch mode. Similarly, any focused widgets become unfocused when the user enters touch mode. The image below illustrates what happens when the user touches a list after selecting an item with the trackball.

To make things more natural for the user, the framework knows how to resurrect the selection/focus whenever the user leaves touch mode. For instance, in the example above, if the user were to use the trackball again, the selection would reappear on the previously-selected item. This is why some developers are confused when they create a custom view and start receiving key events only after moving the trackball once: their application is in touch mode, and they need to use the trackball to exit touch mode and resurrect the focus.

The relationship between touch mode, selection, and focus means you must not rely on selection and/or focus to exist in your application. A very common problem with new Android developers is to rely on ListView.getSelectedItemPosition(). In touch mode, this method will return INVALID_POSITION. You should instead use click listeners or the choice mode.

Focusable in Touch Mode

Now that you know focus doesn't exist in touch mode, I must explain that it's not entirely true. Focus can exist in touch mode but in a very special way we call focusable in touch mode. This special mode was created for widgets that receive text input, like EditText or, when filtering is enabled, ListView. This is why the user can type text inside a text field without first selecting it with the trackball or their finger. When a user touches the screen, the application will enter touch mode if it wasn't in touch mode already.  What happens during the transition to touch mode depends on what the user touched, and what currently has focus.  If the user touches a widget that is focusable in touch mode, that widget will receive focus.  Otherwise, any currently focused widget will not retain focus unless it is focusable in touch mode. For instance, in the picture below, when the user touches the screen, the input text field receives the focus.

Focusable in touch mode is a property that you can set yourself either from code or XML. However, it should be used sparingly and only in very specific situations as it breaks consistency with Android normal behavior. A game is a good example of an application that can make good use of the focusable in touch mode property. MapView, if used in fullscreen as in Google Maps, is another good example of where you can use focusable in touch mode correctly.

Below is another example of a focusable in touch mode widget. When the user taps an AutoCompleteTextView's suggestion with his finger, the focus remains on the input text field:

New Android developers often think that focusable in touch mode is the solution they need to "fix" the problem of disappearing selection/focus. We really encourage you to think very hard before using it. If used incorrectly, it can make your application behave differently from the rest of the system and simply throw off the user's habits. The Android framework contains all the tools you need to handle user interactions without using "focusable in touch mode". For example, instead of trying to make ListView always keep its selection, simply use the appropriate choice mode. And if you feel that the framework does not suit all your need, feel free to let us know or contribute a patch.

Touch Mode Cheat Sheet

Do:

  • Remain consistent with the core applications
  • Use the appropriate feature if you need persistent selection (radio button, check box, ListView's choice mode, etc.)
  • Use focusable in touch mode if you write a game

Don't:

  • Do not try to keep the focus or selection in touch mode

Behind the apps: Amazed

This week's developer video features Jason Tomlinson of Hands-On Mobile. He wrote Amazed, an application open sourced in the apps-for-android project. Things Jason mentions in the videos include:

  • Amazed was built primarily to get familiar with the accelerometer. This helped him in his work on Guitar Hero® World Tour Mobile for Android.
  • Using traceview to track down which methods take the most CPU cycles.

This and other Android developer videos can be found here.

Behind the apps: Amazon and imeem

Last week we introduced a couple Android developers who shared how they built their Android apps and gave their insight into Android app development. This week, we have videos of two developers who've built music-related apps.

The first is of Allan Hsu—he wrote imeem's Android app. A couple of things he mentions in his videos:

The second video features Casey Langen—he wrote the Amazon MP3 for Android app. Things he mentions in the videos include:

Check out other Android developer videos here: Android App Developers.

The stories behind the apps

As we mentioned yesterday, the Android Market is now open for developers to upload their applications. I'm pretty excited because Market, along with the availability of the first Android-powered phone and the Android 1.0 SDK, puts the basic pieces of the Android platform into place for developers to create and distribute their apps.

To help developers better understand what's available to them, we've collected stories from some Android application developers. In the videos, you'll hear them talk about how they built their apps, their takes on the Android platform, and also some tips they want to share with other developers. I think they have a lot of insight to share about Android application development, so I hope you'll find these videos useful.

Here are the first two developers in this series:

Jeff Sharkey is an ADC finalist—he built CompareEverywhere.



Jacob Abrams is from Glu Mobile and helped to build their first Android app, Bonsai Blast.



Keep an eye on this blog, our YouTube channel, or the playlist for this series for more of these videos in the coming weeks.

Android Market: Now available for users

Last month I outlined some details around Android Market. Today, Android Market launched for users to download applications along with the first Android-powered phone—the T-Mobile G1.

With Android Market, users can easily download apps to their Android-powered phone. Users can also rate the apps they've downloaded and leave comments. These users' ratings along with anonymous usage statistics help determine how apps are ranked and presented within Android Market.

If you're a developer, you will be able to register and upload your applications starting next Monday, 2008-10-27, when we've wrapped up a few final details. In order to make sure that each developer is authenticated and responsible for their apps, you will need to register and pay a one time $25 application fee. Once registered, your apps can be made available to users without further validation or approval.

Starting in early Q1, developers will also be able to distribute paid apps in addition to free apps. Developers will get 70% of the revenue from each purchase; the remaining amount goes to carriers and billing settlement fees—Google does not take a percentage. We believe this revenue model creates a fair and positive experience for users, developers, and carriers.

There are already over 50 apps available in Android Market today. You can view a showcase of some of these apps—which include multimedia, location-based tools, barcode scanners, travel guides and games—at http://www.android.com/market/. Now that Android Market is live and ready for contributions, we hope to see developers adding their own compelling apps starting next week.

In the coming months, we'll continue to roll out additional tools and enhancements to Android Market. We also expect to see additional Android-powered devices rolling out by different carriers around the world. Starting today, you can get a device, test your apps on it, and get them ready for upload. On Monday, to share your app with the world, simply register, upload your application and publish it. It's really that easy. I look forward to seeing what you bring to the Market.

Update: As of Monday morning (2008-10-27), http://market.android.com/publish is now available for developers to publish their apps on Android Market.

New Android Maps API Terms of Service and Key Enforcement

When we released the 0.9_r1 beta SDK, we mentioned that the Maps API included with Android would soon require an API key to function correctly and load map tiles. Part of the reason for this was that the Terms of Service (ToS) for the Maps API had not been finalized.

Today, I'm pleased to be able to tell you that the new Android Maps API ToS are now finalized and they're actually pretty exciting. Most of the restrictions present in the old ToS are now gone—for instance, it's now permissible to use the Android Maps API to build "friend finder" style applications. There are still a few limitations, but not nearly as many as before.

Now that the ToS are finalized, it's time to take the next step. Until now, developers have been able to use any value for their Maps API key—that is, the Maps API keys weren't enforced. However, starting early tomorrow morning (Oct 22nd, PDT), we are turning on Maps key enforcement, so the grace period is ending very soon. This means it's also time for developers to acquire and begin using real API keys. Here's what you'll need to do:

  1. Visit http://code.google.com/android/maps-api-signup.html, fill out the required information, agree to the Terms of Service, and submit.
  2. Take the key you are given in response, and place it either:
    • In the XML layout where you declare your MapView, or
    • In your source code, where you instantiate your MapView object

The way the keys work is that when you use a MapView, it queries the system to find the public fingerprint ID of the certificate used to
sign the currently-running application. The MapView then works with the server to verify that the certificate which signed the current application is the same certificate to which the current Maps API key belongs. If they match, then tiles are displayed; if they do not match, then no map tiles are displayed.

You will need one Maps API key for each certificate you use to sign your applications. That is, you'll need separate Maps API keys for both your debug-time signing certificate used in the emulator, and for your release-time certificate you'll use when publishing your apps. Fortunately this is free, and there is no limit to the number of keys you can acquire. Finally, note that this only applies if you're using a MapView in your
Android application. If you don't use Maps at all, or if you use an Intentto launch Google Maps, you don't need to follow these steps.

Be sure to get your Maps API key now to avoid a disruption.

Android is now Open Source


Over the past year, we announced Android, released several SDKs (eventually resulting in the 1.0 SDK), gave out the first half of the $10,000,000 prize money for the Android Developer Challenge, and prepared the first Android-powered device for users. Tomorrow, the T-Mobile G1 goes on sale.


But today, we're making what might just be the most exciting announcement of all: we and our Open Handset Alliance partners have now released the source code for Android. There's a huge amount of code and content there, so head over to http://source.android.com/ for all the details.


I'd like to offer a huge thank you and congratulations to my colleagues and the Alliance partners for what I hope will be a red-letter day for the open source community, and openness in the mobile industry.

Announcing the Android 1.0 SDK, release 1

About this time last year, my colleagues and I were preparing for the first of the "early look" SDK releases. I remember being a little freaked out—November 12 was starting to sound awfully close! But I think I can safely speak for the entire Android team when I say that we were all very excited about that upcoming release. In the year since, we've run and concluded the first Android Developer Challenge, given away $5,000,000, released more SDK builds, and worked with our partners to prepare the first device for users. It's been quite the whirlwind of a year.

In one of those strange cosmic symmetries, here we are a year later, and we're once again very excited about an upcoming release. I'm referring, of course, to the first Android-powered device that our colleagues at T-Mobile have just announced—the T-Mobile G1. We can't wait to see our hard work on store shelves and in the hands of users, but today we're almost as excited because we're announcing the brand-new Android 1.0 SDK, release 1.

Yes, that means we're officially at 1.0. Of course the SDK won't remain static—we'll keep improving the tools by adding features and fixing bugs. But now developers can rely on the APIs in the SDK, and can update their applications to run on Android 1.0-compatible devices. The Android Market beta will also launch with the T-Mobile G1, providing developers an easy and open way to distribute their applications on that and later devices. I've already seen a lot of applications that have me stoked, and I can't wait to see things really come together as developers cross that final mile to prepare their applications for Android 1.0.

So what's next for us? Well, we'll keep working on the SDK, as I said. But we're also working hard with our partners in the Open Handset Alliance on the open-source release, with the aim of making the code available in the fourth quarter. The second Android Developer Challenge is also on the horizon—watch this space for more details. We're also already working on the future of the Android platform, and on more devices. We've updated the Developer Roadmap, and we'll keep updating it as more information becomes available.

It has indeed been quite an exciting road to get to where we are today. The road stretches on ahead though, and we're not slowing down for a moment. I look forward to meeting and working with many of you developers out there—and trying out your apps on my phone!

Happy Coding!

Panoramio

The Panoramio web site has a great collection of photos from all over the world, and they also have a very convenient web API. I thought it would be a lot of fun to use Android to access this content while you are out walking around – and especially to have Android find interesting photos based on your current location. The resulting open source application is now available in the apps-for-android project.

The application starts by showing your current location in a custom MapView. You can pan and zoom this map to choose the area you want to search.

Once you have selected a search area, the application downloads thumbnails of the most popular photos taken within that area:

You can tap on an item to see more details.

From here you can use the menu to find more pictures by the same photographer or to see the original photo on the Panoramio site. My two favorite features, though, help you find the location of the photo in the real world. You can show the location on the map along with your current location:

Or, you can bring up a radar view that uses the compass and GPS to show you the location of the photo in relation to your own location:

I thought that other applications might want to use the radar view for their own purposes ("find me the nearest taqueria"), so I split that into its own package. You can find the source for that in the Radar project. Of course, you don't need the source in order to use this feature. Because of Android's component architecture, all you need to do us use an Intent:

Intent i = new Intent("com.google.android.radar.SHOW_RADAR");

i.putExtra("latitude", 37.422f);

i.putExtra("longitude", -122.084f);

startActivity(i);

The code for these applications is not very long, but they are a good example of how to use a number of Android's location APIs:

Using WebViews

I've written a small application called WebViewDemo that shows how you can add web content to your application. You can find it in the apps-for-android project. This application demonstrates how you can embed a WebView into an activity and also how you can have two way communication between your application and the web content.

A WebView uses the same rendering and JavaScript engine as the browser, but it runs under the control of your application. The WebView can be full screen or you can mix it with other Views. The content for your WebView can come from anywhere. The WebView can download content from the web, or it can come from local files stored in your assets directory. The content can even be dynamically generated by your application code. For this example, the HTML comes from a local file called demo.html.

This application does not do very much: when you click on the android, he raises his arm.

This could, of course, easily be accomplished with a little bit of JavaScript. Instead, though, WebViewDemo takes a slightly more complicated path to illustrate two very powerful features of WebView.

First, JavaScript running inside the WebView can call out to code in your Activity. You can use this to have your JavaScript trigger actions like starting a new activity, or it can be used to fetch data from a database or ContentProvider. The API for this is very simple: just call the addJavascriptInterface method on your WebView. You pass an object whose methods you want to expose to JavaScript and the name to use when making calls. You can see the exact syntax in WebViewDemo.java. Here we are making our DemoJavascriptInterface object available to JavaScript where it will be called "window.demo".

Second, your Activity can invoke JavaScript methods. All you have to do is call the loadUrl method with the appropriate JavaScript call:

mWebView.loadUrl("javascript:wave()");

Our WebViewDemo uses both techniques: when you click on the android, it calls out to the activity, which then turns around and calls back into the JavaScript. WebViews are very powerful, and they may be a valuable tool to help you build your application – especially if you already have a lot of HTML content. As it happens, we've used exactly this approach in some of the applications we've written.

Divide and Conquer

Years ago I was addicted to a simple game that I played on my then state-of-the-art Pentium-75. In this game, balls would bounce around, and I would try to partition them into small enough spaces so that I could go to the next level where more and more balls would be added. As of a couple of months ago, for the life of me, I couldn't remember the name of this game. So when I sat down to write an application for Android in my 20% time, I thought, why not try to recreate something similar? After completing most of the game and showing it to some of my friends at work, one of them said, "Oh, this reminds me of JezzBall!" Eureka! If working on this game does nothing more than reveal the name of one of the favorite games of my youth, I'll call it a success, but in the meantime, I'm happy to announce that the source of this application, named Divide and Conquer, is now available on apps-for-android.


The game starts with instructions:



and begins simply enough with one ball bouncing around. You drag your finger in a horizontal or vertical gesture on the screen to initiate a line that extends until it reaches the edges:




In each level, once you've shaved off 80% of the original area, you move to the next level. Here's a screen shot of level 6:


If a ball hits a line in progress, you lose a life:



Once you are out of lives, it is game over:



While this game isn't going to win any awards for cutting edge graphics, it demonstrates use of several Android features and APIs:


  • custom drawing and animation
  • touch input based gesture detection

  • overriding the default behavior of the back key in some situations (to pause the game)

  • creating custom Dialogs

  • configuring an application to be full screen with no title or status bar
  • use of the preferences framework

  • use of the vibrator API

DivideAndConquerView is a custom View that implements its own onDraw method using the Canvas methods, and gesture detection using onTouchEvent and a helper class DirectionPoint. It keeps track of the state of the game using BallEngine, and reports relevant events back to the main activity of the application, which, in turn, keeps track of and controls the state of the game. The application is configured to be full screen in its AndroidManifest.xml file.

Three new Samples: Triangle, SpriteText and Downloader

I've posted three new open source samples to the apps-for-android project: Triangle, SpriteText and Downloader.


The first two samples, Triangle and SpriteText, show techniques that would be useful to anyone using the OpenGL ES 3D graphics APIs to write Android applications. The samples contain several reusable classes that may eventually be incorporated (in some form) into the SDK. Chief among these is the GLView class, which abstracts the OpenGL ES book-keeping code from the rest of the application. GLView helps handle the extra work OpenGL ES applications have to do when the activity is paused and resumed, and when the display goes to sleep and wakes up. In the Pause/Resume case the OpenGL surface has to be recreated. In the display sleep / wake-up case the entire OpenGL context has to be recreated.

Triangle

The first sample, Triangle, shows how to use the GLView class and the OpenGL ES 3D library to display a spinning textured triangle. Think of it as the "hello, world" of OpenGL ES apps. Because it's relatively simple, it's a good place to start when experimenting with the OpenGL ES API.


SpriteText

The second sample, SpriteText, shows how to efficiently display screen-aligned text using the GL11Ext.glDrawTexiOES method. SpriteText contains a reusable LabelMaker class for drawing static text and screen-aligned images, as well as a Projector class for finding the 2D screen coordinates corresponding to a 3D point, and a MatrixTrackingGL class for keeping track of the current transformation matrix. Finally, it shows how to use these classes to display a milliseconds per frame counter. A ms/f counter can be helpful for tuning graphics performance.


Downloader

The third sample, Downloader, shows how to add a downloader activity to your application. The downloader activity runs at the beginning of your application and makes sure that a set of files have been downloaded from a web server to the phone's SD card. Downloader is useful for applications that need more local data than can fit into an .apk file. For example a game could use Downloader to download the game's artwork, sound effects, and level data. The Downloader activity is designed to be a drop-in addition to your application. You customize it by supplying the URL of an XML configuration file which lists the data files that need to be downloaded.

Android Photostream

I'm pleased to announce that a new open source sample application—called Photostream—has been added to the apps-for-android project. Photostream is a simple photos browser and viewer for Flickr. All you need to use it is a Flickr screen name or user name (the application offers a default user name if you just want to try it.)



This application serves as an illustrative example of several Android features and APIs:


  • Activity aliases

  • Adding custom shortcuts to Home

  • Adding a new wallpaper chooser to the system

  • Custom layouts

  • Custom XML attributes

  • Use of themes

  • Use of styles

  • Use of text colors

  • Use of <include>

  • Use of bitmap and layer drawables from XML

  • Use of HttpClient

  • Proper interaction between background threads and the UI thread

  • Efficient display rotation (using the new onRetainNonConfigurationInstance() API)

  • Animations and layout animations

  • Cropping an image

  • Image manipulation





My favorite feature is the ability to add a new shortcut type in Home, to create a shortcut to any Flickr account. The shortcut shows a custom icon, downloaded from the Flickr user profile:





If you plan on reusing the source code to access Flickr in your own application, you should modify the Flickr.java file to replace the existing API key with your own. The application source code also contains a very handy class called UserTask.java. This class is designed to help you easily write background operations that interact with the UI thread.

Presenting the Winners of the Android Developer Challenge I

Since we started the first Android Developer Challenge late last year, we all have been eager to see who the winners of $275,000 and $100,000 would be. All 50 applications that emerged from Round 1 of ADC I showed great promise, and these teams have been working intensely for the past several months to polish their apps for the final round.

Similar to round 1 we sent laptops preconfigured with the judging environment, emulator, and all entries to each of our seven judges. In this round, each judge reviewed all 50 applications, took collaborative notes and gave initial scores. Then, all judges met together over conference calls to discuss and debate these applications, finally coming to consensus on which applications should receive $275,000 and which should receive $100,000.

We're pleased to present all of the winners and finalists in our detailed ADC gallery. Peruse and enjoy — there are awesome applications and unique uses of the Android platform. We would like to congratulate the winners and thank all the entrants for their hard work!

Android Market: a user-driven content distribution system

When we talk to developers, a common topic is the challenge of getting applications in the hands of users. That's why today I'm happy to share early details of Android Market—an open content distribution system that will help end users find, purchase, download and install various types of content on their Android-powered devices. The concept is simple: leverage Google's expertise in infrastructure, search and relevance to connect users with content created by developers like you.

Developers will be able to make their content available on an open service hosted by Google that features a feedback and rating system similar to YouTube. We chose the term "market" rather than "store" because we feel that developers should have an open and unobstructed environment to make their content available. Similar to YouTube, content can debut in the marketplace after only three simple steps: register as a merchant, upload and describe your content and publish it. We also intend to provide developers with a useful dashboard and analytics to help drive their business and ultimately improve their offerings.

I also wanted to share some early details to help with planning your efforts so that you can be ready as our partners release the first Android-powered handsets. Developers can expect the first handsets to be enabled with a beta version of Android Market. Some decisions are still being made, but at a minimum you can expect support for free (unpaid) applications. Soon after launch an update will be provided that supports download of paid content and more features such as versioning, multiple device profile support, analytics, etc. Below are some screenshots that illustrate some of the security features and workflow.

With the addition of a marketplace, the Android ecosystem is becoming even more robust. I am incredibly energized by the support and amazing content I've seen so far. We will share more details as they are available and I look forward to working with many of you in the coming months.

Some information on APIs removed in the Android 0.9 SDK beta

Earlier this week, we released a beta of the Android SDK. In the accompanying post, I mentioned that we had to remove some APIs from the platform for Android 1.0, and as a result they don't appear in the 0.9 beta SDK, and won't appear in 1.0-compatible SDKs. Today, I want to take a few minutes to explain why.


GTalkService


We were all really excited when the "XMPPService" (as it was called, at first) was included in the first early-look SDK. Once we brought in our security review team to examine Android, however, they soon realized that, as exciting as it is, the GTalkService has some fundamental security problems. Rich Cannings is one of our security researchers, and here's his explanation of the issues:


When I first read about GTalkService, I was both excited and scared. As a developer, I was interested in a feature that provided a simple interface to send messages between two Google Talk friends. The messages would appear on the receiving device as a standard Intent that was easy to handle. How simple and beautiful is that? Unfortunately, when I put my tin foil hat on, I recognized that things are a little more complicated than that.


We decided to postpone GTalkService's data-messaging functionality for the following reasons:


  1. "Repurposing" Google Talk Friends


    Google Talk friends are intended for a different purpose than that envisioned by the GTalkService. Your Google Talk friends can contact you at any time via IM. They can see your email address and often can see your real name. However, the idea of a Google Talk friend does not always line up with the types of people who may want to interact with via an Android application.


    For example, imagine a really cool mobile Massively Multiplayer Online Roleplaying Game using GTalkService. You would have to add all the players to your Google Talk friends list in order to play with them. Next time you log in to Google Talk from your desktop or on the web, you would notice that you have many new "friends". You may not want to chat with these friends -- and perhaps worse, you may not want them to know what your real name or email is.


    We do realize that Android users will want to interact with other Android users anonymously and for short periods of time, especially in gaming scenarios. Unfortunately, it turns out that using Instant Messaging is not really a good way to do that.


  2. Verifying Remote Intent Senders


    Intents were designed to send messages within the device. The Intent subsystem can conclusively determine who sent Intents only when the Intents originate from the same device that services the Intent. When Intents come from other devices, the Intent subsystem cannot determine what application sent the Intent.


    This can lead to a variety of problems. At first, remote applications could send arbitrary Intents, meaning that your Google Talk friends had almost the same control of your device as you did. Even once that issue was resolved, we recognized that we could not trust the identity of the application who sent the request. We could only trust the identity of the user. So a "bad" application on your friend's device could send a message to a "good" application on your device which would negatively affect the good application.


    In the end, we determined that the Intent system, as designed for local use, did not lend itself well to being the vehicle for a Remote Procedure Call (RPC).

  3. Placing Too Much Security Burden on Developers


    As originally designed, the GTalkService placed a significant burden on the application developer to avoid security flaws and perform user and relationship management. An Android application using GTalkService would be reachable from all of the user's Google Talk friends, and a flaw in that application could pose an inviting target to a malicious "friend" or automated malware. There are automated mechanisms that could be used to help protect vulnerable applications or stop the spread of malware, but the deployment of these technologies was not possible in time for the launch of the first Android handsets.



Although we would have loved to ship this service, in the end, the Android team decided to pull the API instead of exposing users to risk and breaking compatibility with a future, more secure version of the feature. We think it's obvious that this kind of functionality would be incredibly useful, and would open lots of new doors for developers. One of our top priorities after the first devices ship is to develop a device-to-device (and possibly device-to-server) RPC mechanism that is fast, reliable, and protective of developers and users alike.


As a final note, I want to point out that since the GTalkService was always a Google "value-added" service anyway, it was never guaranteed that it would be present on every Android device. That is, GTalkService was never part of core Android. As a result this change actually allows us the potential to build a new system that is part of the core of a future version of Android.


Bluetooth API


The 1.0 version of Android and the first devices will include support for Bluetooth; for instance, Android will support Bluetooth headsets. In the early-look SDKs, there was an incomplete draft of an API that exposed Bluetooth functionality to developers. Unfortunately we had to remove that API from the 1.0 release. To get the skinny on why, I contacted Nick Pelly, one of the Android engineers responsible for that functionality. Here's the story on Bluetooth, in Nick's words:


The reason is that we plain ran out of time. The Android Bluetooth API was pretty far along, but needs some clean-up before we can commit to it for the SDK. Keep in mind that putting it in the 1.0 SDK would have locked us into that API for years to come.


Here's an example of the problems in the API. Client code is required to pass around IBluetoothDeviceCallback objects in order to receive asynchronous callbacks, but IBluetoothDeviceCallback is meant to be an internal interface. That client code would break the moment we added new callbacks to IBluetoothDeviceCallback.aidl. This is not a recipe for future-proof apps.


To make things even more tricky, the recent introduction of the bluez 4.x series brings its own new API. The Android Bluetooth stack uses bluez for GAP and SDP so you'll see more than a passing resemblance to bluez's interfaces in Android. The bluez 4.x change requires us to carefully consider how to structure our API for the future. Again, remember that once we settle on an interface we need to support it for years going forward.


Rather than ship a broken API that we knew was going to change a lot, we chose not to include it. We absolutely intend to support a Bluetooth API in a future release, although we don't know exactly when that will be. This should include some tasty features, such as:


  • Bindings to GAP and SDP functionality.

  • Access to RFCOMM and SCO sockets.

  • Potentially, L2CAP socket support from Java. (This one is under consideration.)

  • An API to our headset and handsfree profiles.

On a personal note, Nick adds, "I would love nothing more than to start seeing some neat third-party applications and games over Bluetooth. In my opinion, Bluetooth is completely under-utilized on most mobile platforms and I'm excited to someday see what the developer community can do with Android."


I'm definitely bummed about these API removals. I was particularly looking forward to the P2P capabilities offered by GTalkService, but, as always, user security and privacy must come first. In all these cases, we'll work with the developer community to create some great APIs that balance these concerns.

Announcing a beta release of the Android SDK

I'm pretty happy today, for two reasons. First, I'm happy because I get to let everyone know that we're releasing a beta SDK. You can read about the new Android 0.9 SDK beta at the Android Developers' Site, or if you want to get straight to the bits, you can visit the download page. Once you've got it, be sure to visit our Developer Forum if you have any questions.

Back in November, we made some SDK builds available that we referred to as "early look" SDKs. The goal was to give developers insight into the platform as early on as possible, and to get some initial feedback. Since then, we've been working with our Open Handset Alliance partners to incorporate much of that feedback, and finish the first devices. Since those devices are shipping in the fourth quarter, the platform is now converging on a final "Android 1.0" version.

The beta SDK that we're releasing today is the first big step on the SDK's road to compatibility with 1.0. Since this is a beta release, applications developed with it may not quite be compatible with devices running the final Android 1.0. However, the APIs are now pretty stable and we don't expect any major changes. If you're one of the many developers who were waiting for something a bit more mature, this might be a good time to take another look.

Since we're now moving quickly toward 1.0, it may also help to know which direction we're headed. To help out, we've also prepared a development roadmap. This will be a living document, and we'll keep it up to date as the Android landscape evolves. Currently it covers the next few months, roughly through the end of the year and a bit into next year. We'll update it with additional detail as we are able to, but even right now it can help give you a picture of how things will play out as the first phones draw near.

Enough of that though -- you're probably wondering what's actually new in the SDK. Well, you should read the Release Notes, the Change Overview and the API Delta Report for all the details, but here are a few highlights:

  • First and most obviously, the new Home screen is included, along with a ton of UI changes for 1.0.
  • Some new applications are included: an Alarm Clock, Calculator, Camera, Music player, Picture viewer, and Messaging (for SMS/MMS conversations.)
  • Several new development tools were added, such as a graphical preview for XML layouts for users of Eclipse, and a tool for constructing 9-patch images.
  • Since we've got a new Home screen application now, we thought the now-obsolete version from the M5 early-look SDK might be helpful to developers, so its source is included as a sample.
  • A number of new APIs are fleshed out and improved, and others are now close to their final forms for 1.0.
  • Tons of bugs were fixed, of course. (If you had problems with the MediaPlayer, try it now!)

There are a lot of changes -- the ones in the list above are just my personal favorites, so you should check out the links above for the full story. Not all the changes are additions, though: I'm sorry to say that we had to remove a few things, such as the GTalkService (for security reasons), and the Bluetooth API. There's a bit more detail in the links above, and we'll follow up on those in particular here in this blog to give you the scoop. In fact, we've got a little list of topics we want to talk about here, so stay tuned.

At the top of this post I said I was happy for two reasons, and now you know one of them -- but what about the other? Well, the second reason is because now that this is out I can finally go get some sleep!

Karies dan Diet

Karies merupakan salah satu penyakit gigi dan mulut yang disebabkan oleh beberapa faktor, saya rasa sudah perbah saya bahas dan dipostingan sebelumnya anda akan lebih jelas mengenai karies :). Diet salah satu trend anak muda sekarang terutama bagi para remaja putri yang ingin tampil lebih PD dan menjaga kelangsingan tubuhnya. Namun apa hubungan antara karies dan diet ya? disini saya akan coba menjelaskan sedikit.


Pada dasarnya hubungan antara karies dan diet sangat simpel dan mudah untuk dimengerti, beberapa orang yang menjalani diet sehat dan berprilaku hidup sehat akan mengalami penurunan masalah gigi. mengapa demikian, hal ini dikarenakan konsumsi gula pada tubuh dikurangi dan lebih banyak mengkonsumsi bahan atau makanan dengan pemanis alami seperti buah-buahan yang sangat baik bagi tubuh maupun bagi kesehatan gigi dan mulut. Apabila kita mengkonsumsi buah-buahan seperti apel, apel secara tidak langsung akan membantu membersihkan gigi secara alami bisa diibaratkan kita menggosok gigi, nah sangat dianjurkan untuk menu penutup menggunakan apel atau ganti snak anda dengan buah - buahan. Selain gigi dan mulut kita sehat maka badan kita tetap langsing :).

Hubungan antara diet dan karies erat sekali kaitannya dengan jumlah konsumsi pemanis atau gula yang dikonsumsi oleh tubuh kita, sebenarnya Tuhan telah menciptakan gigi dan mulut kita sebagai gerbang dan peringatan yang sangat luar biasa. bagai mana tidak, apabila makanan yang kita konsumsi tidak baik bagi tubuh atau merugikan maka gelaja yang nampak akan terlihat pada daerah disekitar rongga mulut seperti : Amandel, sariawan, bibir pecah - pecah, karies, sakit tenggorokan dan lain - lain. maka kenali makanan yang anda konsumsi. Sangat dianjurkan untuk kembali ke pola hidup sederhana dan kembali ke alam. Saran saya mulai sekarang tinggalkan makanan dengan bahan kimia dan kembalilah Natural.

Sekedar tambahan:
Ingat pengolahan masakan dengan MSG mengidikasikan pembuat makanan kurang cakap mengolah bahan masakan dengan paduan bumbu - bumbu yang tersedia. apabila seorang koki atau tukang masak bisa mengolah bahan makanan dan bumbunya tidak perlu ditambah bahan penyedap.

Amandel

Terima kasi sebelumnya untuk masukan rekan-rekan yang masih berkenan untuk membangun kesehatan gigi menjadi lebih baik. Mohon maaf sebesar-besarnya baru bisa posting. Kali ini saya akan membahas mengenai Amandel. Semoga bisa bermanfaat untuk kita semua. Beberapa pertanyaan yang ada dibenak kita seberapa bahaya penyakit ini? Sebenarnya amandel sendiri memang selalu ada pada setiap tubuh manusia, disini kita menyadari betapa menakjubkannya sistem tubuh manusia. Amandel sendiri merupakan salah satu sistem proteksi tubuh.


Amandel atau tonsil merupakan kumpulan jaringan limfoid yang terletak pada kerongkongan di belakang kedua ujung lipatan belakang mulut. Amandel sendiri berfungsi mencegah agar infeksi tidak menyebar ke seluruh tubuh dengan cara menahan kuman memasuki tubuh. Oleh karena itu kelenjar amndel ini meradang. Peradangan pada Kelenjar amandel ini disebut dengan tonsilitis, penyakit ini merupakan salah satu gangguan THT (Telinga Hidung & Tenggorokan). Tonsilitis dapat bersifat akut atau kronis. Bentuk akut yang tidak parah biasanya berlangsung sekitar 4-6 hari, dan umumnya menyerang anak-anak pada usia 5-10 tahun. Sedangkan radang amandel/tonsil yang kronis terjadi secara berulang-ulang dan berlangsung lama.

Pada radang amandel yang akut biasanya dimulai dengan gejala sakit tenggorokan yang ringan hingga menjadi parah, sakit saat menelan makanan, kadang-kadang muntah. Tonsilitis dapat menyebabkan amandel menjadi bengkak, panas, gatal, sakit pada otot dan sendi, nyeri pada seluruh badan, kedinginan, sakit kepala, dan sakit pada telinga. Kelenjar getah bening melemah di dalam daerah submandibuler. Bagian belakang tenggorokan akan terasa mengerut sehingga sukar menelan. Peradangan tonsil yang akut ataupun pembengkakan tonsil yang tidak terlalu besar dan tidak menghalangi jalan pernapasan, serta tidak menimbulkan komplikasi tidak perlu dilakukan pembedahan/operasi, karena tonsil yang terbuat dari jaringan getah bening dapat berfungsi mencegah tubuh agar tidak terkena penyakit yang berhubungan dengan infeksi.

Beberapa upaya yang dapat kita lakukan sendiri dirumah untuk pencegahan, perawatan dan pengobatannya dilakukan beberapa langkah sebagai berikut :

* Diusahakan untuk minum banyak air atau cairan seperti sari buah, terutama selama demam.
* Jangan minum es, sirop, es krim, makanan dan minuman yang didinginkan, gorengan, makanan awetan yang diasinkan, dan manisan.
* Berkumur air garam hangat 3-4 kali sehari.
* Menaruh kompres hangat pada leher setiap hari.
* diberikan terapi antibiotik (atas petunjuk dokter) apabila ada infeksi bakteri dan untuk mencegah komplikasi.
* Istirahat yang cukup.

Namun apabila radang amandel kronis dengan pembengkakan tonsil yang terlalu besar sehingga mengakibatkan terganggunya jalan pernapasan, atau munculnya komplikasi, biasanya diperlukan pembedahan/operasi untuk mengeluarkan tonsil. Apabila terjadi peradangan yang kronis disarankan untuk berkonsultasi kedokter spesialis THT untuk penanganan dan tidakan selanjutnya.

Mudah-mudahan bisa sedikit membantu :) Senang rasanya bisa ngeblog lagi :) sekali lagi saya minta maaf.


Android at Google I/O and Developer Days

It was great to connect with everyone at the Google I/O event in San Francisco and at our recent Developer Days across the globe. We enjoyed meeting all of the Android developers and answering your questions - both at our booth and at the fireside chats.

For those of you who were unable to attend, all of the sessions are available on video:

http://sites.google.com/site/io/

Enjoy!

Sikat dan Odol


Sebelumnya saya minta maaf karena lama absen, mudah-mudahan semua masih tetap menjaga kesehatan gigi dan mulut. Judul yang aneh ^^ mengapa yah ko kepikiran ngasi judul gini setelah lama absen ngeblog koq jadi rada ga karuan hehehe. Sikat dan odol merupakan dua hal yang berbeda namun tidak dapat dipisahkan kalau mau gigi dan mulut kita sehat. Nah sikat apa yang cocok untuk gigi kita ( jangan sembarang sikat lo kan udah ada sikat khusus buat gigi, lebih dikenal dengan sikat gigi). Akan dijelaskan satu persatu mulai dari sikat gigi dan apa saja yang berhubungan dengan sikat gigi da mulut kita.


Sikat gigi
Sikat gigi adalah alat untuk membersihkan gigi yang berbentuk sikat kecil dengan pegangan. Pasta gigi biasanya ditambahkan ke sikat gigi sebelum menggosok gigi. Sikat gigi banyak jenisnya, dari yang bulunya halus sampai kasar, bentuknya kecil sampai besar, dan berbagai desain pegangan. Kebanyakan dokter gigi menganjurkan penggunaan sikat yang lembut karena sikat keras dapat merusak lapisan enamel dan melukai gusi. Terdapat juga sikat gigi

Salah satu cara untuk menjaga kesehatan gigi adalah dengan menyikat gigi. Dengan menyikat gigi, kebersihan gigi dan mulut pun akan terjaga, selain menghindari terbentuknya lubang-lubang gigi dan penyakit gigi dan gusi. Banyak jenis dan ragam sikat gigi yang dijual di pasaran, dari yang manual maupun elektrik. Sebetulnya, apa saja syarat sikat gigi yang bagus? Yang terpenting adalah bulu sikat dan lebar kepala sikat. Untuk bisa menjangkau daerah-daerah gigi bagian belakang, ukuran kepala sikat gigi yang ideal adalah 35 - 40 mm. Bahkan, orang dewasa sebaiknya juga memakai sikat gigi anak, karena ukurannya yang kecil akan membantu menjangkau bagian gigi yang paling dalam.

Sedikit tips dalam memilih sikat gigi ( mudah-mudahan bisa membantu yah)

Pilihlah sikat gigi yang kepalanya cukup kecil sehingga dapat digunakan dengan baik dalam rongga mulut. Bagi orang dewasa panjang kepala sikat gigi 2,5 cm, sedangkan pada anak 1,5 cm.

Panjang bulu sikat gigi hendaknya sama. Sikat gigi dengan bulu yang panjangnya berbeda tidak dapat membersihkan permukaan datar tanpa menimbulkan tekanan pada beberapa bulu sikat.

Tekstur bulu sikat hendaknya memungkinkan digunakan dengan efektif tanpa merusak jaringan. Jangan memilih bulu keras sebab dapat merusak jaringan. Yang terlalu lunak pun dikhawatirkan tidak dapat membersihkan plak dengan sempurna. Yang paling tepat sikat gigi dengan kekakuan bulu sikat medium.

Gagang sikat harus cukup lebar dan tebal agar dapat dipegang kuat dan dikontrol dengan baik.

Untuk cara menggosok gigi yang baik dan benar sudah saya posting jadi silahkan liat ya ( sengaja saya tidak jelaskan disini karena masih banyak yang perlu diuraikan ntar biar ga bosen ^^)

Pasta gigi atau odol
Pasta gigi adalah sejenis pasta yang digunakan untuk membersihkan gigi, biasanya dengan sikat gigi. Di Indonesia, pasta gigi sering juga disebut Odol, yaitu salah satu merek pasta gigi. Walaupun merek ini sudah berpuluh-puluh tahun tidak lagi dijual di Indonesia, nama Odol telah menjadi nama generik.

Sidikit tips memilih pasta gigi atau odol yang baik:
1. Pilih pasta gigi yang mengandung cukup fluoride. Fluoride berfungsi untuk menjaga gigi agar tidak berlubang. Namun, anak-anak di bawah 3 tahun sebaiknya tidak memakai odol. Pasalnya, terlalu banyak fluoride justru tidak bagus dan membuat gigi lebih rapuh.

2. Pilih pasta gigi yang busanya tidak terlalu banyak. Busa yang terlalu banyak menunjukkan bahwa kandungan deterjen di dalamnya juga banyak. Pendapat bahwa semakin banyak busa semakin baik, tentu tidak benar.

3. Hindari langsung makan setelah menyikat gigi. Pasalnya, kadar asam mulut akan turun dan fluoride pun hilang, sehingga kuman akan masuk lagi. Makan sebaiknya 1 - 2 jam setelah menyikat gigi.

4. Untuk menjaga kondisi gigi, setiap 6 bulan sekali anak sebaiknya dibawa ke dokter gigi untuk dilakukan topical fluoride (pelapisan gigi). Apalagi bagi anak anak yang malas menyikat gigi.

Mungkin sekian dulu masih bingung ni mo nulis apa lagi kalo ada pertanyaan silahkan komen, saran dan kritik selalu saya terima dengan senang hati.

AndroidGlobalTime

We are pleased to announce that a new open source sample application—called AndroidGlobalTime — has been added to the apps-for-android project.





It's a 3D world clock developed by an engineer at Google and may serve as an illustrative example of how to use the OpenGL ES APIs in your Android applications.



Just a quick word on how to use AndroidGlobalTime. When you launch it, you'll see a spinning globe showing day and night regions. Pressing the space bar will overlay an analog clock with the time corresponding to location you're currently examining. The arrow keys allow you to spin the Earth and traverse through different time-zones while the clock is displayed. Pressing the center key in the emulator toggles between a 3D and 2D view of the earth. Pressing the L key will turn the city lights on or off. You can also zoom-out by pressing 2 and zoom-in by pressing 8.

Hope you find this helpful!

Android Developer Challenge Judges and Top 50 Details

It's been a busy few weeks here as we've wrapped up the first round of the Android Developer Challenge. We'd like to share a couple pieces of information with you:

  • The full list of judges is now available. It was fun to work with such a diverse group of judges from different companies all around the world.
  • A slide deck of the Android Developer Challenge prize recipients is also available. The deck includes descriptions and screenshots of the 46 recipients who consented to sharing their information and is a great way to get a feel for the quality of apps submitted.

The prize recipients' entries were just the tip of the iceberg in terms of great applications submitted, and we'd like to thank and congratulate everyone who entered the challenge. We look forward to seeing all of the application in the hands of consumers with Android devices.

A Challenge in More than One Way

Well, the submission deadline for the first Android Developer Challenge has come and gone, the apps are in, the judges are finished, and the waiting is over. We got a lot of great submissions, and I can tell you personally that the competition was fierce. I didn't see all 1,788 submissions, but I saw quite a lot of them, and I uttered more than one wail of despair as some of my favorite submissions didn't quite make the cut, by razor-thin margins in some cases. But, the judges have spoken.


Speaking of the judges...we'll soon publish a list of who the judges are, but I know many of our developers are still curious: what were all those judges doing? Well, the short answer is that they were judging applications using a custom laptop configuration that we provided. But we thought some people might be interested in the "long" answer, so we put together this blog post. If you're not interested in the gory details of the judging, you can stop here; but if you are interested, read on!


How We Got Started


Making the Challenge fair was by far our primary goal. We knew we had to do whatever we could to make sure that the judges' scores are based solely on their review of the application. We automated as much as possible, to make it easy for judges to focus on judging, and not on administrivia or complicated setup.


The first thing we realized was that we were going to have way more submissions than any single judge could look at. No one could review all 1,788 submissions in a reasonable amount of time. On the other hand, we definitely needed more than one judge reviewing each submission. Our goal was to have each submission reviewed by four different judges, with a minimum of three.


The big question was then: how many judges would we need?


For 1,788 submissions, a panel of 4 judges per application meant that we needed a whopping 7,152 reviews to be performed. Since our judges would have to be crazy to agree to do more than 75 reviews, we needed at least 95 judges. In the end we recruited around 125, including backup judges.


Making Order out of Chaos


The next thing we realized was that judges need to be able to actually review the submissions. Since the judges came from our Open Handset Alliance partners and many are not engineers, we knew that we couldn't send instructions like "run the M5-RC15 emulator, open a terminal window, and run the command adb push geodb /data/misc/location—and don't forget the --sdcard option!" They'd think we were quoting Star Wars.


Besides that, we also knew that once we gave the judges their assignments, what they did was out of our hands. We couldn't control how the judges review the applications, but we could certainly make it as easy as possible for the judges to do a thorough review.


So, we built a program in wxPython that automates judging. This application launches a clean emulator for each submission, supports emulator features like SD card images and mock location providers, and allows judges to launch multiple emulators and simulate calls and SMS messages for applications which need that functionality. We asked our friendly neighborhood Google Tech Stop for 140 laptops, installed Ubuntu Linux and our software on one, and then cloned that installation for use on all the others. We then had a huge shipping party, where we imaged, boxed, and shipped 115 or so laptops in one day.


An important side effect of these custom laptops is that they are all identical. This means that each judge's experience of the submissions was the same, which eliminated the risk of one judge rating an app poorly just because it ran slowly on his personal computer.


Managing All that Data


Once we sent 100+ laptops all over the world, we needed a way to get the data back. Another goal was to eliminate as many sources of human error as possible. With 7,152 reviews to complete, and 4 categories per review, that's 28,608 scores to keep track of. Mistakes would be bound to happen, so filing paperwork or transcribing scores by hand from one file to another was out of the question.


Our solution was the Google Data web API for accessing things like Google Spreadsheets and Google Base. Here's how it worked.


  • We wrote a Python program to randomly assign applications to judges for review.
  • Using the Spreadsheets API, that program generated a Google Spreadsheet for each judge, pre-filled with that judge's assigned submissions and space to enter scores.
  • The program installed on the laptops also used the Spreadsheets API to fetch a given judge's assignments.
  • When the judge scores a submission, those scores were posted back into the spreadsheet.
  • After the judging period concluded, a separate program walks over all the judges' spreadsheets, computing the final scores.

This approach had two great things about it: first, it didn't require any new server infrastructure to make it work. Second, our "database" had a built-in rich "admin" UI for managing the data — namely, Google Spreadsheets itself. If any of our judges ran into problems or needed help, we could simply open that spreadsheet in our browser and review or fix problems.


This approach worked quite well, and I'd bet that the judges didn't even know the Spreadsheets API was being used, unless they actively poked around.


Tying Up the Loose Ends


Of course, our work wasn't done once we retrieved all the submission scores. We couldn't just average up the scores, you see. First, judges could recuse themselves from scoring specific submissions; perhaps they were assigned an application similar to one their own company is working on, or perhaps they realized they knew one of the authors. Second, despite our best efforts there was a chance that some judges might have a problem — for instance, if one judge had a poor network connection but reviewed an application that requires the network, then that judge might have scored the application unfairly poorly.


Here are the major outlier scenarios that we were concerned about:

  • Cases where judges recused themselves.
  • Submissions where one judge reported a problem with the application, but all the other judges reported good scores. (It seems odd for only one judge to have a problem.)
  • Cases where one judge's scores were an outlier compared to the other judges' scores.

For the first two cases, we simply discarded the outlying data points, if we had enough. For instance, if three judges reported good scores and one recused herself, we simply dropped that fourth score. If dropping the conflicting score would have brought the application below three reviews, we sent it back for review by a new judge to bring it up to our minimum number of judges per application.


The third case is more subtle. Just because a judge rated an application differently than others doesn't mean that that review is invalid, so we can't simply discard outliers. Instead, we took the highest and lowest scores in each category and gave them half weight. The effect is to bring the average scores a bit closer to the median scores, which helps minimize the impact of unusually high or low scores. This process was applied to all submissions (not just "suspicious" scores) since it has a minimal effect on submissions that don't have a large outlier.


We actually ran the whole process above twice: first we ran it to choose a first cut of the top 100 submissions from the original 1,788, and we then sent those 100 to a second group of judges for selection of the final 50. (Actually, the "top 100" were really "top 119", since we added a few more submissions to accommodate scoring ties in the first round.)


Wrapping Up


Now you know what we've been spending all our time on, and what's been keeping us up at night (sometimes literally)! Throughout, our key objectives were to keep the process fair, let the judges focus on judging, and give applications the benefit of the doubt in cases of scoring outliers.


What's next? Well, the 50 submissions that were awarded a prize now begin the refinement process for their Round 2 submissions, which will award the final, larger prizes to the top 20 applications. I also hope that the developers of the other great apps that didn't receive prizes will consider the second Android Developer Challenge, which should begin later this year.


To everyone, I'd also like to say thanks for participating, and congratulations on your hard work!

The Top 50 Applications

As you may have heard, the results from Android Developer Challenge Part 1, Round 1 were announced to all the participants late last week. We're still working on pulling together a more extensive listing for each application that made it into the top 50, but in the spirit of releasing early and often, here's a list containing the name of the application and its author(s):

  • AndroidScan - Jeffrey Sharkey

  • Beetaun - Sergey Gritsyuk and Dmitri Shipilov

  • BioWallet - Jose Luis Huertas Fernandez

  • BreadCrumbz - Amos Yoffe

  • CallACab - Konrad Huebner and Henning Boeger

  • City Slikkers - PoroCity Media and Virtual Logic Systems

  • Commandro - Alex Pisarev, Andrey Tapekha

  • Cooking Capsules - Mary Ann Cotter and Muthuselvam Ramadoss

  • Diggin - Daniel Johansson, Aramis Waernbaum, Andreas Hedin

  • Dyno - Virachat Boondharigaputra

  • e-ventr - Michael Zitzelsberger

  • Eco2go - Taneem Talukdar, Gary Pong, Jeff Kao and Robert Lam

  • Em-Radar - Jack Kwok

  • fingerprint - Robert Mickle

  • FreeFamilyWatch - Navee Technologies LLC

  • goCart - Rylan Barnes

  • GolfPlay - Inizziativa Networks

  • gWalk - Prof. Dr.-Ing. Klaus ten Hagen, Christian Klinger, Marko Modsching, Rene Scholze

  • HandWx - Weathertop Consulting LLC

  • IMEasy - Yan Shi

  • Jigsaw - Mikhail Ksenzov

  • JOYity - Zelfi AG

  • LifeAware - Gregory Moore, Aaron L. Obrien, Jawad Akhtar

  • Locale - Clare Bayley, Christina Wright, Jasper Lin, Carter Jernigan

  • LReady Emergency Manager - Chris Hulls, Dilpreet Singh, Luis Carvalho, Phuong Nguyen

  • Marvin - Pontier Laurent

  • Mobeedo - Sengaro GmbH

  • Multiple Facets Instant Messenger - Virgil Dobjanschi

  • MyCloset - Mamoru Tokashiki

  • PedNav - RouteMe2 Technologies Inc.

  • Phonebook 2.0 - Voxmobili

  • PicSay - Eric Wijngaard

  • PiggyBack - Christophe Petit and Sebastien Petit

  • Pocket Journey - Anthony Stevens and Rosie Pongracz

  • Rayfarla - Stephen Oldmeadow

  • Safety Net - Michael DeJadon

  • SocialMonster - Ben Siu-Lung Hui and Tommy Ng

  • SplashPlay

  • Sustain- Keeping Your Social Network Alive - Niraj Swami

  • SynchroSpot - Shaun Terry

  • Talkplay - Sung Suh Park

  • Teradesk - José Augusto Athayde Ferrarini

  • The Weather Channel for Android - The Weather Channel Interactive Inc.

  • TuneWiki - TuneWiki Inc.

  • Wikitude-the Mobile Travel Guide - Philipp Breuss

  • Writing Pad - ShapeWriter Inc

Those of you following along carefully at home (or who bothered to read this far) will notice that there's only 46 in this list. 4 winners opted to continue their efforts in secret and so while we congratulate them too, we can't list them here.

Regardless, congratulations to all those who made it this far!

Android Developer Challenge: Round I Results are In

The last few weeks were both extremely intense and rewarding. Based on feedback from the judges, it was apparent that large number of applications were compelling, innovative and well implemented. The quality of these entries clearly reflects the creativity and hard work that developers have invested in building their apps.

In addition to developers' participation and contributions, over 100 industry judges around the world spent weeks reviewing these submissions. I want to thank all the developers and judges who have worked incredibly hard over the last few months, making the Android Developer Challenge such a success.

Many of the top submissions took advantage of the geo and social networking capabilities of Android. These applications allow friends to share their personal experiences and favorite content such as vacations, photos, shows, music, cooking recipes, restaurants, and much more as they relate to certain locales. I've also seen applications that connect people during emergency situations and others that allow users to share information on how they can reduce their carbon footprint. One developer even turned a real city block into a playing field where gamers can role-play and chase after villains.

Furthermore, some of these applications provide rich interactive experiences by combining web services and mash-ups to bring together data that's on the web with data that's on the mobile device. One application combined weather, pollen and allergy information in the context of a map that is relevant to a user's location.

Though many applications use a traditional "download" model for data, many also enable users to publish content, such as photos or even voice memos, for others to use on other mobile devices or the web.

This is just a brief snapshot of the many impressive applications I've seen. The 50 highest scoring applications will receive $25,000 each and go on to compete in the final round. We plan to publish a list of these applications as soon as we receive the developers' consent. The real winners, however, are the consumers who will benefit from the work of these talented developers.

Gigi bungsu kenapa sih?


Dari beberapa pertanyaan yang masuk sering menanyakan mengapa sakit saat sibungsu tumbuh, apa memang harus sakit? Kebanyakan memang terasa sakit namun mengapa gigi bungsu harus tumbuh kalau hanya untuk membuat masalah. Mari kita bersama-sama menelusuri jejak langkah si bungsu yang selalau dipermasalahkan ini.

Pertumbuhan atau kemunculan gigi bungsu yang dalam dunia kedokteran gigi sering disebut dengan dens molaris inferior tertius atau molar ketiga ini memang kerap memberikan rasa sakit yang sangat menggangu aktifitas kita. Beberapa dari kita mungkin kurang paham akan gigi bungsu ini. mungkin saya dapet menjelaskan sedikit mengenai gigi bungsu ini.

Gigi bungsu adalah gigi geraham ketiga yang muncul pada usia sekitar 18-20 tahun.

Gigi bungsu termasuk dalam kategori struktur vestigial, yaitu struktur yang fungsi awalnya menjadi hilang atau berkurang sejalan dengan evolusi. Banyak ahli berpendapat bahwa perubahan jenis makanan pada manusia modern dari mentah menjadi dimasak membuat makanan lebih lunak. Selain itu, pemeliharaan gigi moderen mengalami kemajuan pesat. Akibatnya kerusakan pada gigi berkurang. Kehadiran gigi bungsu yang diperkirakan dapat membantu bila ada geraham lain yang tanggal menjadi tidak berguna, malah pada kebanyakan orang menjadi masalah.

Ada sejumlah faktor yang menyebabkan gigi mengalami impaksi. Karena jaringan sekitarnya yang terlalu padat, adanya retensi gigi susu yang berlebihan, tanggalnya gigi susu terlalu awal. Bisa juga karena tidak adanya tempat untuk erupsi. Rahang "kesempitan" gara-gara pertumbuhan tulang rahang kurang sempurna.

Ada teori lain. Pertumbuhan rahang dan gigi mempunyai tendensi bergerak maju ke arah depan. Apabila pergerakan ini terhambat oleh sesuatu yang merintangi, bisa terjadi impaksi gigi. Misalnya, karena infeksi, trauma, malposisi gigi, atau gigi susu tanggal sebelum waktunya.

Sementara, menurut teori Mendel, pertumbuhan rahang dan gigi dipengaruhi oleh faktor keturunan. Jika salah satu orang tua (ibu) mempunyai rahang kecil, dan bapak bergigi besar-besar, ada kemungkinan salah seorang anaknya berahang kecil dan bergigi besar-besar. Akibatnya, bisa terjadi kekurangan tempat erupsi gigi bungsu, dan terjadilah impaksi.

Sempitnya ruang erupsi gigi bungsu, menurut drg. Danardono, itu karena pertumbuhan rahangnya kurang sempurna. Hal ini bisa karena perubahan pola makan. Manusia sekarang cenderung menyantap makanan lunak, sehingga kurang merangsang pertumbuhan tulang rahang.

Makanan lunak yang mudah ditelan menjadikan rahang tak aktif mengunyah. Sedangkan makanan banyak serat perlu kekuatan rahang untuk mengunyah lebih lama. Proses pengunyahan lebih lama justru menjadikan rahang berkembang lebih baik. Seperti diketahui, sendi-sendi di ujung rahang merupakan titik tumbuh atau berkembangnya rahang. Kalau proses mengunyah kurang, sendi-sendi itu pun kurang aktif, sehingga rahang tidak berkembang semestinya. Rahang yang harusnya cukup untuk menampung 32 gigi menjadi sempit. Akibatnya, gigi bungsu yang selalu tumbuh terakhir itu tidak kebagian tempat untuk tumbuh normal. Ada yang tumbuh dengan posisi miring, atau bahkan "tidur" di dalam karena tidak ada tempat untuk nongol.

Maka, untuk mendukung perkembangan rahang, sebaiknya sering-sering mengkonsumsi makanan berserat supaya gigi jadi lebih aktif menggigit, memotong, dan mengunyah. Rahang pun menjadi makin aktif dan diharapkan akan tumbuh normal. Dampaknya, pertumbuhan gigi pun bisa lebih bagus. Tapi jangan lupa, periksakan gigi secara rutin untuk memantau kesehatan gigi.

Beberapa sumber memberikan definisi yang berbeda dan tanggapan yang berbeda tentang gigi bungsu ini, salah satu sumber yang membahas tentang masalah pada gigi bungu ini dapat saya kutipkan dan menurut saya lengkap menjelaskan masalah pada gigi bungsu ini dari wikipedia.

Masalah pada gigi bungsu

Gigi yang berdesakan

Karena gigi bungsu tumbuh paling akhir, terkadang rahang tidak memiliki tempat yang cukup untuk gigi bungsu tumbuh dengan wajar. Akibatnya gigi bungsu mendesak gigi geraham yang berada di depannya. Hal ini akan mengakibatkan sakit pada gigi. Masalah ini umumnya diatasi dengan mencabut gigi bungsu yang baru tumbuh. Bila gigi bungsu menempati posisi yang sulit untuk dicabut, yang dicabut adalah gigi geraham yang terdesak sehingga gigi bungsu mendapat tempat yang cukup untuk tumbuh.


Gigi yang tidak muncul sempurna pada gusi

Terkadang gigi bungsu tidak muncul dengan sempurna pada gusi. Gusi yang menutupi gigi dapat menyebabkan penumpukan sisa makanan dan bakteri yang dapat menyebabkan infeksi dan sakit pada gigi.


Pengobatan


Pencabutan

Sebelum dicabut, gigi umumnya akan difoto terlebih dahulu dengan sinar X untuk mengetahui bentuk, posisi dan kedalaman gigi. Pencabutan gigi bungsu biasanya dilakukan dengan pembiusan lokal, namun terkadang juga dilakukan dengan bius total. Walaupun tergolong operasi kecil, pencabutan gigi sebaiknya dilakukan secara profesional oleh dokter gigi, mengigat komplikasi yang mungkin timbul saat dan setelah pencabutan.


Hal yang perlu diperhatikan setelah pencabutan gigi

Untuk mempercepat proses penyembuhan:
Usahakan beristirahat sepanjang hari dan tidak mengerjakan pekerjaan berat.
Hindari merokok. Bila memungkinkan selama proses penyembuhan (3-4 hari), minimal selama 24 jam setelah operasi.
Hindari berkumur atau menggosok gigi selama 24 jam setelah operasi
Setelah 24 jam, kebersihan daerah operasi dapat dijaga dengan berkumur air hangat bergaram (1 sendok teh garam untuk 1 gelas air) minimal 4 kali sehari. Berkumurlah dengan hati-hati karena tekanan dapat menyebabkan lubang bekas operasi terbuka lagi dan terjadi pendarahan.
Setelah 24 jam, meggosok gigi dapat dilakukan dengan hati-hati, terutama di daerah operasi.
Bila diberi obat penahan sakit dan antibiotik, minumlah sesuai petunjuk dokter. Antibiotik harus dihabiskan walaupun gigi sudah tidak terasa sakit. Sebaliknya, obat penahan sakit dapat dihentikan bila sakit mereda.
Makan dan minumlah seperti biasanya. Hindari berdiet, karena makan dan minum yang cukup sangat penting untuk proses penyembuhan.
Hindari minum menggunakan sedotan karena tekanannya dapat melepaskan gumpalan darah pada lubang operasi.
Hindari minuman bersoda karena busanya diperkirakan dapat melepaskan gumpalan darah pada lubang operasi. Minuman jus buah terutama jeruk sangat disarankan.
Makan tambahan vitamin C dianjurkan.
Untuk menghindari pembengkakan, setelah operasi rahang sebaiknya dikompres dengan es atau air dingin. Tempelkan kompres dingin selama 15 menit, diseling 10 menit tanpa kompres, diulang sampai saat istirahat malam.
Pada hari-hari setelah hari operasi, rahang dapat dikompres dengan kompres hangat, untuk menstimulasi peredaran darah di daerah gigi bungsu yang dapat mempercepat penyembuhan.

Selain hal-hal di atas, pembiusan yang dilakukan sebelum operasi juga dapat berpengaruh pada kemampuan psikis dan mekanis. Jangan berkendara, melakukan pekerjaan yang membutuhkan konsentrasi tinggi, atau menandatangani dokumen penting pada hari yang sama. Bila menggunakan bius total, usahakan ada seseorang yang dapat menemani selama minimal satu hari tersebut.


Masalah yang mungkin timbul setelah pencabutan


Pendarahan

Pendarahan tidak dapat dihindari dan dapat berlangsung selama satu hari penuh. Berkumur pada saat pendarahan terjadi sangat tidak dianjurkan. Pendarahan akan berhenti saat darah mulai menggumpal di lubang pencabutan, dan berkumur dapat menyebabkan gumpalan darah terlepas. Hal ini dapat memperlambat proses penyembuhan dan menyebabkan pendarahan terjadi lebih lama.

Bila terjadi pendarahan, letakkan gulungan kecil kasa steril (umumnya diberikan oleh dokter gigi) pada lubang bekas pencabutan. Kasa harus digigit dengan baik dengan tekanan secukupnya. Cara ini akan membantu menghentikan pendarahan, tetapi jangan dilakukan telalu berlebihan sehingga menimbulkan iritasi pada lubang pencabutan. Gulungan kasa hanya boleh digigit selama sekitar 20 menit. Bila terlalu lama, darah dapat membeku pada kasa dan gumpalan darah dapat terlepas lagi saat kasa dibuang. Bila pendarahan masih terjadi setelah 20 menit, ganti dengan kasa yang baru. Demikian seterusnya hingga pedarahan berkurang atau berhenti.

Bila pendarahan terus berlanjut setelah 1 hari, segera kembali ke dokter gigi dan laporkan. Pendarahan yang terus menerus menunjukkan masalah pada proses penyembuhan.


Lubang operasi tidak tertutup sempurna (Dry socket)

Pada umumnya, setelah gigi bungsu dicabut, darah akan menggenangi lubang bekas gigi dan menggumpal. Terbentuknya gumpalan darah ini sangat penting karena berfungsi sebagai tempat gusi kemudian akan tumbuh menutupi lubang. Diperkirakan sebanyak 5-10% kasus mengalami penutupan lubang yang tidak sempurna atau terlepasnya gumpalan darah sebelum waktunya, sehingga syaraf pada gusi dan bahkan tulang rahang menjadi terbuka (dry socket). Telah diketahui bahwa umumnya penderita dry socket adalah perempuan yang minum pil kontrasepsi. Diperkirakan dry socket dapat dihindari dengan melakukan operasi pada hari ke-22 hingga ke-28 siklus, yaitu saat kadar estrogen sedang pada titik terendah.


Infeksi

Infeksi yang terjadi saat proses penyembuhan dapat dihindari dengan minum antibiotik dan menjaga kebersihan mulut. Berkumur dengan air garam setiap selesai makan dapat membantu membersihkan daerah operasi.


Semoga dapet membantu, artikel ini saya buat dengan mengkutip beberap artikel dari wikipedia dan ilmu yang saya dapatkan dibangku kuliah, semoga sehat selalu.