The Iterative Web App: A new look for Gmail and Google mobile web apps

On April 7th, we announced a new version of Gmail for mobile for iPhone and Android-powered devices. Among the improvements was a complete redesign of the web application's underlying code which allows us to more rapidly develop and release new features that users have been asking for, as explained in our first post. We'd like to introduce The Iterative Webapp, a series where we will continue to release features for Gmail for mobile. Today: A new look for our buttons and toolbars.

Some of you noticed and asked us about recent changes we made to Gmail for mobile and a few of our other mobile web apps. If you use the web browser to access Gmail, Latitude, Calendar, or Tasks on your Android-powered device or iPhone, you'll see that we freshened up the look of the buttons and toolbars.

We never want the buttons and toolbars of Google apps to compete with your content; rather, they should complement them. So the headers and buttons are now darker, to better show the content of your emails and calendar entries.

We also made the all the buttons a bit larger, for easier button-tapping.

To try these apps yourself, point your mobile browser to Gmail (gmail.com), Calendar (google.com/calendar), Latitude (google.com/latitude), Tasks (gmail.com/tasks), or just go to google.com from you phone and find all these web apps under the 'more' link.

Is this an improvement? Let us know what you think.

Google Apps Connector for BlackBerry Enterprise Server now connects businesses of all sizes

(Cross posted from the Google Enterprise Blog)

When we launched the Google Apps Connector for BlackBerry® Enterprise Server in August, we focused on addressing the needs of companies operating their own BlackBerry Enterprise Servers, typically supporting a couple hundred BlackBerry smartphone users per server.

Of course, companies of all sizes are adopting Apps, and their needs for supporting BlackBerry smartphones are as diverse as their businesses. So today we're making it easier for companies large and small to manage their BlackBerry smartphones and save money.

With Google Apps Connector for BES version 1.5, large businesses can now support 500 BlackBerry devices per server, double the previous number. This lets them serve more users with fewer servers.

Small businesses get more flexibility too. The Apps Connector now supports BlackBerry Professional Software, which is designed for up to 30 BlackBerry smartphones. We've also made it possible for a single BlackBerry Enterprise Server to serve users in multiple Google Apps domains, enabling low cost hosting services to be offered by our hosting partners.

Stay tuned for more announcements from partners offering hosting services for Apps customers with BlackBerry smartphones. In the meantime, we're going to continue to make it easier for you to manage mobile devices of all types with Google Apps.

Posted by Zhengping Zuo, Software Engineer and Darrell Kuhn, Site Reliability Engineer

Happy Thanksgiving Travels: Google Maps Navigation now available for Android 1.6

A few weeks ago we launched Google Maps Navigation (Beta) as a free feature of Google Maps on Android 2.0 devices. Today we're expanding availability of Google Maps Navigation to devices running Android 1.6 (Donut) and higher, such as the T-Mobile myTouch 3G and the G1.

Google Maps Navigation is an internet-connected GPS system with voice guidance and automatic rerouting, all running on your mobile phone. Using Google services over your phone's data connection brings important benefits to GPS navigation users, like using Google search (typed or spoken) to enter your destination; fresh map, business, and traffic data; and satellite and Street View imagery along your route.

This release also includes the new Layers feature, which lets you overlay geographical information on the map. View My Maps, transit lines, Wikipedia articles about places, and more.

So if you're traveling this Thanksgiving, you'll be able to enjoy the benefits of an internet connection, whether it's free Wi-Fi at the airport or Google Maps Navigation in your car.

If you have a phone running Android 1.6, you can download an updated version of Google Maps from Android Market to use Navigation today. Google Maps Navigation is in beta and is currently available in the United States. Some features of Android 2.0 are not available on Android 1.6, for example, the ability to use the "navigate to" voice command as shown in our demo video. However, you can still create a shortcut that will allow you to launch Navigation and start getting directions to a specific place from your current location with just a single touch from your home screen. For example, you can create a "Home" shortcut to quickly navigate home, no matter where you are. Just use the "Add" menu item from the home screen, then choose "Shortcuts", then "Directions." Please visit our forum to give us feedback, or our Help Center to get help using Google Maps Navigation.

Get mobile coupons through Local Search

Since we launched printable coupons on Google Maps a few years ago, people are increasingly using their mobile phones to find local information when they're away from a computer. With more of you going mobile to search for this information, it makes sense for coupons to go mobile too.

So just in time for the holidays, we've made it easier to find discounts when you're on the go. If a business adds a mobile coupon to its Google Local Business Center listing, you'll be able to access it from your mobile device. Just go to google.com on your phone and search for a local business. When you land on its Place Page, you'll see any coupons or discounts that might be available. Then simply show the participating business the coupon, right from your phone, to redeem the offer.

We hope you find these mobile coupons useful and that they help you save money, trees (fewer printed coupons), and your hands (from paper cuts) when you're on the go. Mobile coupons are currently only available in the US. For more information check out the Lat Long Blog.

New Google News for mobile

At Google, we are committed to giving you a consistent user experience across products and devices, and we really value the feedback you've given us about Google News for mobile. Today we're excited to announce a completely new Google News offering for iPhone, Android, and Palm Pre users. (We already offer a mobile-optimized version of Google News for other phones, such as Blackberry, Windows Mobile, and S60, and more improvements will be coming to those in the near future)

This new version provides the same richness and personalization on your phone as Google News provides on desktop. Our new homepage displays more stories, sources, and images while keeping a familiar look and feel. Also, you can now reach your favorite sections, discover new ones, find articles and play videos in fewer clicks. If you are an existing Google News reader on desktop, you will find that all of your personalizations are honored in this mobile version too.

Google News for mobile is now available in 29 languages and 70 editions.

So pick up your mobile phone and point your browser to http://news.google.com to catch up on news anytime and anywhere. Feel free to check out more information or leave feedback in our Help Center.




Ankit "Chunky" Gupta and Alok Goel, Mobile News Team

An update to Google Earth for the iPhone

Cross-posted from the Google Lat Long blog

Just over one year ago, we unveiled Google Earth for the iPhone and iPod touch. Google Earth quickly became one of the most popular applications in the App Store, and after only six months, was the second most-downloaded free application overall. A big thank-you to the over 220,000 users have taken the time to write a review!

Today, we're proud to announce version 2.0 of Google Earth for iPhone. We've added some exciting new features, including the ability to view maps that you create on your desktop computer right from your iPhone, explore the app in new languages, and improved icon selection and performance.

View your maps wherever you go

Have you ever wanted to view a custom map with Google Earth on your iPhone? Well, now you can. By logging in directly to your Google Maps account, you can view the same maps that you or others have created, using the My Maps interface. Maybe you're on a trip and want to see where Tony Wheeler, the co-founder of Lonely Planet, most likes to travel. Or perhaps you're walking around looking for a restaurant and you want to see where world-famous chef Ferran Adrià likes to eat. All you have to do is click "Save to My Maps", open Earth on the iPhone, log in with the same account information, and voilà, you have your same collection of My Maps right in your pocket.



It's fun to create and view your own maps as well. Here's an example of a map that I created that shows the two attempts my friends and I made to summit Mount Ritter in the Sierra Nevada mountain range. As you can see, we didn't quite make it (the red line is the intended route, and the blue and green lines are our 2008 and 2009 attempts, respectively). Next year we'll get it for sure! I created this map by using the desktop version of Google Earth to read the tracks directly out of my GPS device, saving the resulting tracks as a KML file, and then importing into My Maps in Google Maps. You can learn more about My Maps here.

Browse businesses, photos, and places more easily
Browsing the world from the palm of your hand can be a thrilling experience, and viewing photos, Wikipedia articles, and place information is a great way to discover new parts of the globe. With the latest version of Google Earth for iPhone, we've made this even easier. Now, when you touch an icon, a small glow appears under your finger to let you know which icon you have picked. If your finger touches more than one icon, you'll be taken to a list of all icons, so you can select the one you are interested in.



New languages
We've also included new languages in this release, bringing the total to 31 languages from the original 18. The complete list of languages is: English (U.S), English (UK), French (France), German, Traditional Chinese, Simplified Chinese, Dutch, Italian, Spanish, Portuguese (Brazil), Portuguese (Portugal), Danish, Swedish, Finnish, Norwegian, Korean, Japanese, Russian, Polish, Turkish, Ukrainian, Arabic, Thai, Czech, Greek, Hebrew, Indonesian, Malaysian, Romanian, Slovak, and Croatian.

We hope you enjoy our latest release. Please note that the app will be rolling out around the world over the next twenty-four hours - if you don't see it immediately, be sure to check back soon. You can download Google Earth for iPhone here.

Peter Birch, Product Manager, Google Earth

Integrating Application with Intents

Written in collaboration with Michael Burton, Mob.ly; Ivan Mitrovic, uLocate; and Josh Garnier, OpenTable.

OpenTable, uLocate, and Mob.ly worked together to create a great user experience on Android. We saw an opportunity to enable WHERE and GoodFood users to make reservations on OpenTable easily and seamlessly. This is a situation where everyone wins — OpenTable gets more traffic, WHERE and GoodFood gain functionality to make their applications stickier, and users benefit because they can make reservations with only a few taps of a finger. We were able to achieve this deep integration between our applications by using Android's Intent mechanism. Intents are perhaps one of Android's coolest, most unique, and under-appreciated features. Here's how we exploited them to compose a new user experience from parts each of us have.

Designing

One of the first steps is to design your Intent interface, or API. The main public Intent that OpenTable exposes is the RESERVE Intent, which lets you make a reservation at a specific restaurant and optionally specify the date, time, and party size.

Hereʼs an example of how to make a reservation using the RESERVE Intent:

startActivity(new Intent("com.opentable.action.RESERVE",
Uri.parse("reserve://opentable.com/2947?partySize=3")));

Our objective was to make it simple and clear to the developer using the Intent. So how did we decide what it would look like?

First, we needed an Action. We considered using Intent.ACTION_VIEW, but decided this didn't map well to making a reservation, so we made up a new action. Following the conventions of the Android platform (roughly <package-name>.action.<action-name>), we chose "com.opentable.action.RESERVE". Actions really are just strings, so it's important to namespace them. Not all applications will need to define their own actions. In fact, common actions such as Intent.ACTION_VIEW (aka "android.intent.action.VIEW") are often a better choice if youʼre not doing something unusual.

Next we needed to determine how data would be sent in our Intent. We decided to have the data encoded in a URI, although you might choose to receive your data as a collection of items in the Intent's data Bundle. We used a scheme of "reserve:" to be consistent with our action. We then put our domain authority and the restaurant ID into the URI path since it was required, and we shunted off all of the other, optional inputs to URI query parameters.

Exposing

Once we knew what we wanted the Intent to look like, we needed to register the Intent with the system so Android would know to start up the OpenTable application. This is done by inserting an Intent filter into the appropriate Activity declaration in AndroidManifest.xml:

<activity android:name=".activity.Splash" ... >
...
<intent-filter>
<action android:name="com.opentable.action.RESERVE"/>
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="reserve" android:host="opentable.com"/>
</intent-filter>
...
</activity>

In our case, we wanted users to see a brief OpenTable splash screen as we loaded up details about their restaurant selection, so we put the Intent Filter in the splash Activity definition. We set our category to be DEFAULT. This will ensure our application is launched without asking the user what application to use, as long as no other Activities also list themselves as default for this action.

Notice that things like the URI query parameter ("partySize" in our example) are not specified by the Intent filter. This is why documentation is key when defining your Intents, which weʼll talk about a bit later.

Processing

Now the only thing left to do was write the code to handle the intent.

    protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final Uri uri;
final int restaurantId;
try {
uri = getIntent().getData();
restaurantId = Integer.parseInt( uri.getPathSegments().get(0));
} catch(Exception e) {
// Restaurant ID is required
Log.e(e);
startActivity( FindTable.start(FindTablePublic.this));
finish();
return;
}
final String partySize = uri.getQueryParameter("partySize");
...
}

Although this is not quite all the code, you get the idea. The hardest part here was the error handling. OpenTable wanted to be able to gracefully handle erroneous Intents that might be sent by partner applications, so if we have any problem parsing the restaurant ID, we pass the user off to another Activity where they can find the restaurant manually. It's important to verify the input just as you would in a desktop or web application to protect against injection attacks that might harm your app or your users.

Calling and Handling Uncertainty with Grace

Actually invoking the target application from within the requester is quite straight-forward, but there are a few cases we need to handle. What if OpenTable isn't installed? What if WHERE or GoodFood doesn't know the restaurant ID?



Restaurant ID knownRestaurant ID unknown
User has OpenTableCall OpenTable IntentDon't show reserve button
User doesn't have OpenTableCall Market IntentDon't show reserve button

You'll probably wish to work with your partner to decide exactly what to do if the user doesn't have the target application installed. In this case, we decided we would take the user to Android Market to download OpenTable if s/he wished to do so.

    public void showReserveButton() {

// setup the Intent to call OpenTable
Uri reserveUri = Uri.parse(String.format( "reserve://opentable.com/%s?refId=5449",
opentableId));
Intent opentableIntent = new Intent("com.opentable.action.RESERVE", reserveUri);

// setup the Intent to deep link into Android Market
Uri marketUri = Uri.parse("market://search?q=pname:com.opentable");
Intent marketIntent = new Intent(Intent.ACTION_VIEW).setData(marketUri);

opentableButton.setVisibility(opentableId > 0 ? View.VISIBLE : View.GONE);
opentableButton.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
PackageManager pm = getPackageManager();
startActivity(pm.queryIntentActivities(opentableIntent, 0).size() == 0 ?
opentableIntent : marketIntent);
}
});
}

In the case where the ID for the restaurant is unavailable, whether because they don't take reservations or they aren't part of the OpenTable network, we simply hide the reserve button.



Publishing the Intent Specification

Now that all the technical work is done, how can you get other developers to use your Intent-based API besides 1:1 outreach? The answer is simple: publish documentation on your website. This makes it more likely that other applications will link to your functionality and also makes your application available to a wider community than you might otherwise reach.

If there's an application that you'd like to tap into that doesn't have any published information, try contacting the developer. It's often in their best interest to encourage third parties to use their APIs, and if they already have an API sitting around, it might be simple to get you the documentation for it.

Summary

It's really just this simple. Now when any of us is in a new city or just around the neighborhood its easy to check which place is the new hot spot and immediately grab an available table. Its great to not need to find a restaurant in one application, launch OpenTable to see if there's a table, find out there isn't, launch the first application again, and on and on. We hope you'll find this write-up useful as you develop your own public intents and that you'll consider sharing them with the greater Android community.