Merge "docs: remove graphics rs docs and restructure existing docs" into jb-dev
diff --git a/core/res/res/values/styles.xml b/core/res/res/values/styles.xml
index 889f86f..e4fc26b 100644
--- a/core/res/res/values/styles.xml
+++ b/core/res/res/values/styles.xml
@@ -272,7 +272,7 @@
</style>
<style name="TextAppearance.EasyCorrectSuggestion" parent="TextAppearance.Suggestion">
- <item name="android:textUnderlineColor">#ffC8C8C8</item>
+ <item name="android:textUnderlineColor">#88C8C8C8</item>
</style>
<style name="TextAppearance.MisspelledSuggestion" parent="TextAppearance.Suggestion">
diff --git a/docs/html/design/media/metrics_diagram.png b/docs/html/design/media/metrics_diagram.png
index 3cdc5e6..5cbe252 100644
--- a/docs/html/design/media/metrics_diagram.png
+++ b/docs/html/design/media/metrics_diagram.png
Binary files differ
diff --git a/docs/html/design/media/switches_switches.png b/docs/html/design/media/switches_switches.png
index 43e2623..120955d 100644
--- a/docs/html/design/media/switches_switches.png
+++ b/docs/html/design/media/switches_switches.png
Binary files differ
diff --git a/docs/html/design/media/typography_sizes.png b/docs/html/design/media/typography_sizes.png
index eda1d99..fe6cdce 100644
--- a/docs/html/design/media/typography_sizes.png
+++ b/docs/html/design/media/typography_sizes.png
Binary files differ
diff --git a/docs/html/guide/google/gcm/adv.jd b/docs/html/guide/google/gcm/adv.jd
new file mode 100644
index 0000000..aec8ca4
--- /dev/null
+++ b/docs/html/guide/google/gcm/adv.jd
@@ -0,0 +1,255 @@
+page.title=GCM Advanced Topics
+@jd:body
+
+<div id="qv-wrapper">
+<div id="qv">
+
+<h2>Quickview</h2>
+
+<ul>
+<li>Learn more about GCM advanced features.</li>
+</ul>
+
+
+<h2>In this document</h2>
+
+<ol>
+<li><a href="#lifetime">Lifetime of a Message</a></li>
+<li><a href="#throttling">Throttling</a></li>
+<li><a href="#reg-state">Keeping the Registration State in Sync</a>
+ <ol>
+ <li><a href="#canonical">Canonical IDs</a></li>
+ </ol>
+</li>
+<li><a href="#retry">Automatic Retry Using Exponential Back-Off</a></li>
+<li><a href="#unreg">How Unregistration Works</a></li>
+<li><a href="#collapsible">Send-to-Sync vs. Messages with Payload</a>
+ <ol>
+ <li><a href="#s2s">Send-to-sync messages</a></li>
+ <li><a href="#payload">Messages with payload</a></li>
+ </ol>
+</li>
+<li><a href="#ttl">Setting an Expiration Date for a Message</a> </li>
+<li><a href="#throttling"></a><a href="#multi-senders">Receiving Messages from Multiple Senders</a></li>
+</ol>
+
+</div>
+</div>
+<p>This document covers advanced topics for GCM.</p>
+
+
+
+
+<h2 id="msg-lifetime">Lifetime of a Message</h2>
+<p>When a 3rd-party server posts a message to GCM and receives a message ID back, it does not mean that the message was already delivered to the device. Rather, it means that it was accepted for delivery. What happens to the message after it is accepted depends on many factors.</p>
+<p>In the best-case scenario, if the device is connected to GCM, the screen is on, and there are no throttling restrictions (see <a href="#throttling">Throttling</a>), the message will be delivered right away.</p>
+<p>If the device is connected but idle, the message will still be
+delivered right away unless the <code>delay_while_idle</code> flag is set to true. Otherwise, it will be stored in the GCM servers until the device is awake. And that's where the <code>collapse_key</code> flag plays a role: if there is already a message with the same collapse key (and registration ID) stored and waiting for delivery, the old message will be discarded and the new message will take its place (that is, the old message will be collapsed by the new one). However, if the collapse key is not set, both the new and old messages are stored for future delivery.</p>
+
+<p class="note"><strong>Note:</strong> There is a limit on how many messages can be stored without collapsing. That limit is currently 100. If the limit is reached, all stored messages are discarded. Then when the device is back online, it receives a special message indicating that the limit was reached. The application can then handle the situation properly, typically by requesting a full sync.</p>
+
+<p>If the device is not connected to GCM, the message will be stored until a connection is established (again respecting the collapse key rules). When a connection is established, GCM will deliver all pending messages to the device, regardless of the <code>delay_while_idle</code> flag. If the device never gets connected again (for instance, if it was factory reset), the message will eventually time out and be discarded from GCM storage. The default timeout is 4 weeks, unless the <code>time_to_live</code> flag is set.</p>
+
+<p class="note"><strong>Note:</strong> When you set the <code>time_to_live</code> flag, you must also set <code>collapse_key</code>. Otherwise the message will be rejected as a bad request.</p>
+<p>Finally, when GCM attempts to deliver a message to the device and the application was uninstalled, GCM will discard that message right away and invalidate the registration ID. Future attempts to send a message to that device will get a <code>NotRegistered</code> error. See <a href="#unreg">How Unregistration Works</a> for more information.</p>
+<p>Although is not possible to track the status of each individual message, the Google APIs Console stats are broken down by messages sent to device, messages collapsed, and messages waiting for delivery.</p>
+
+<h2 id="throttling">Throttling</h2>
+<p>To prevent abuse (such as sending a flood of messages to a device) and
+to optimize for the overall network efficiency and battery life of
+devices, GCM implements throttling of messages using a token bucket
+scheme. Messages are throttled on a per application and per <a href="#collapsible">collapse
+key</a> basis (including non-collapsible messages). Each application
+collapse key is granted some initial tokens, and new tokens are granted
+periodically therefter. Each token is valid for a single message sent to
+the device. If an application collapse key exhausts its supply of
+available tokens, new messages are buffered in a pending queue until
+new tokens become available at the time of the periodic grant. Thus
+throttling in between periodic grant intervals may add to the latency
+of message delivery for an application collapse key that sends a large
+number of messages within a short period of time. Messages in the pending
+queue of an application collapse key may be delivered before the time
+of the next periodic grant, if they are piggybacked with messages
+belonging to a non-throttled category by GCM for network and battery
+efficiency reasons.</p>
+
+<h2 id="reg-state">Keeping the Registration State in Sync</h2>
+<p>Whenever the application receives a <code>com.google.android.c2dm.intent.REGISTRATION</code> intent with a <code>registration_id</code> extra, it should save the ID for future use, pass it to the 3rd-party server to complete the registration, and keep track of whether the server completed the registration. If the server fails to complete the registration, it should try again or unregister from GCM.</p>
+<p>There are also two other scenarios that require special care:</p>
+<ul>
+ <li>Application update</li>
+ <li>Backup and restore
+ </li>
+</ul>
+<p>When an application is updated, it should invalidate its existing registration ID, as it is not guaranteed to work with the new version. Because there is no lifecycle method called when the application is updated, the best way to achieve this validation is by storing the current application version when a registration ID is stored. Then when the application is started, compare the stored value with the current application version. If they do not match, invalidate the stored data and start the registration process again.</p>
+
+<p>Similarly, you should not save the registration ID when an application is backed up. This is because the registration ID could become invalid by the time the application is restored, which would put the application in an invalid state (that is, the application thinks it is registered, but the server and GCM do not store that registration ID anymore—thus the application will not get more messages).</p>
+<h3 id="canonical">Canonical IDs</h3>
+<p>On the server side, as long as the application is behaving well, everything should work normally. However, if a bug in the application triggers multiple registrations for the same device, it can be hard to reconcile state and you might end up with duplicate messages.</p>
+<p>GCM provides a facility called "canonical registration IDs" to easily recover from these situations. A canonical registration ID is defined to be the ID of the last registration requested by your application. This is the ID that the server should use when sending messages to the device.</p>
+<p>If later on you try to send a message using a different registration ID, GCM will process the request as usual, but it will include the canonical registration ID in the <code>registration_id</code> field of the response. Make sure to replace the registration ID stored in your server with this canonical ID, as eventually the ID you're using will stop working.</p>
+
+<h2 id="retry">Automatic Retry Using Exponential Back-Off</h2>
+
+<p>When the application receives a <code>com.google.android.c2dm.intent.REGISTRATION</code> intent with the <code>error</code> extra set as <code>SERVICE_NOT_AVAILABLE</code>, it should retry the failed operation (register or unregister).</p>
+<p>In the simplest case, if your application just calls <code>register</code> and GCM is not a fundamental part of the application, the application could simply ignore the error and try to register again the next time it starts. Otherwise, it should retry the previous operation using exponential back-off. In exponential back-off, each time there is a failure, it should wait twice the previous amount of time before trying again. If the register (or unregister) operation was synchronous, it could be retried in a simple loop. However, since it is asynchronous, the best approach is to schedule a pending intent to retry the operation. The following steps describe how to implement this in the <code>MyIntentService</code> example used above:</p>
+<ol>
+ <li> Create a random token to verify the origin of the retry intent:
+
+<pre class="prettyprint pretty-java">private static final String TOKEN =
+ Long.toBinaryString(new Random().nextLong());
+</pre>
+
+ <li> Change the <code>handleRegistration()</code> method so it creates the pending intent when appropriate:</li>
+
+<pre class="prettyprint pretty-java">...
+if (error != null) {
+ if ("SERVICE_NOT_AVAILABLE".equals(error)) {
+ long backoffTimeMs = // get back-off time from shared preferences
+ long nextAttempt = SystemClock.elapsedRealtime() + backoffTimeMs;
+ Intent retryIntent = new Intent("com.example.gcm.intent.RETRY");
+ retryIntent.putExtra("token", TOKEN);
+ PendingIntent retryPendingIntent =
+ PendingIntent.getBroadcast(context, 0, retryIntent, 0);
+ AlarmManager am = (AlarmManager)
+ context.getSystemService(Context.ALARM_SERVICE);
+ am.set(AlarmManager.ELAPSED_REALTIME, nextAttempt, retryPendingIntent);
+ backoffTimeMs *= 2; // Next retry should wait longer.
+ // update back-off time on shared preferences
+ } else {
+ // Unrecoverable error, log it
+ Log.i(TAG, "Received error: " + error);
+}
+...</pre>
+<p> The back-off time is stored in a shared preference. This ensures that it is persistent across multiple activity launches. The name of the intent does not matter, as long as the same intent is used in the following steps.</p></li>
+
+ <li> Change the <code>onHandleIntent()</code> method adding an <code>else if</code> case for the retry intent:</li>
+
+<pre class="prettyprint pretty-java">...
+} else if (action.equals("com.example.gcm.intent.RETRY")) {
+ String token = intent.getStringExtra("token");
+ // make sure intent was generated by this class, not by a malicious app
+ if (TOKEN.equals(token)) {
+ String registrationId = // get from shared properties
+ if (registrationId != null) {
+ // last operation was attempt to unregister; send UNREGISTER intent again
+ } else {
+ // last operation was attempt to register; send REGISTER intent again
+ }
+}
+...</pre>
+
+ <li> Create a new instance of <code>MyReceiver</code> in your activity:</li>
+
+<pre class="prettyprint pretty-java">private final MyBroadcastReceiver mRetryReceiver = new MyBroadcastReceiver();
+</pre>
+
+ <li>In the activity's <code>onCreate()</code> method, register the new instance to receive the <code>com.example.gcm.intent.RETRY</code> intent:
+ <pre class="prettyprint pretty-java">...
+IntentFilter filter = new IntentFilter("com.example.gcm.intent.RETRY");
+filter.addCategory(getPackageName());
+registerReceiver(mRetryReceiver, filter);
+...</pre>
+
+<p class="note"><strong>Note:</strong> You must dynamically create a new instance of the broadcast receiver since the one defined by the manifest can only receive intents with the <code>com.google.android.c2dm.permission.SEND</code> permission. The permission <code>com.google.android.c2dm.permission.SEND</code> is a system permission and as such it cannot be granted to a regular application.</p>
+
+</li>
+
+ <li>In the activity's <code>onDestroy()</code> method, unregister the broadcast receiver:</li>
+
+<pre class="prettyprint pretty-java">unregisterReceiver(mRetryReceiver);</pre>
+</ol>
+<h2 id="unreg">How Unregistration Works</h2>
+<p>There are two ways to unregister a device from GCM: manually and automatically.</p>
+<p>An Android application can manually unregister itself by issuing a <code>com.google.android.c2dm.intent.UNREGISTER</code> intent, which is useful when the application offers a logoff feature (so it can unregister on logoff and register again on logon). See the <a href="gcm.html#unregistering">Architectural Overview</a> for more discussion of this topic. This is the sequence of events when an application unregisters itself:</p>
+<ol>
+ <li> The application issues a <code>com.google.android.c2dm.intent.UNREGISTER</code> intent, passing the registration ID (the application should have saved its registration ID when it received the proper <code>com.google.android.c2dm.intent.REGISTRATION</code> intent).</li>
+ <li>When the GCM server is done with the unregistration, it sends a <code>com.google.android.c2dm.intent.REGISTRATION</code> intent with the <code>unregistered</code> extra set.</li>
+ <li>The application then must contact the 3rd-party server so it can remove the registration ID.</li>
+ <li>The application should also clear its registration ID.
+ </li>
+</ol>
+<p>An application can be automatically unregistered after it is uninstalled from the device. However, this process does not happens right away, as Android does not provide an uninstall callback. What happens in this scenario is as follows:</p>
+<ol>
+ <li>The end user uninstalls the application.</li>
+ <li>The 3rd-party server sends a message to GCM server.</li>
+ <li>The GCM server sends the message to the device.</li>
+ <li>The GCM client receives the message and queries Package Manager, which returns a "package not found" error.</li>
+ <li>The GCM client informs the GCM server that the application was uninstalled.</li>
+ <li>The GCM server marks the registration ID for deletion.</li>
+ <li>The 3rd-party server sends a message to GCM.</li>
+ <li>The GCM returns a <code>NotRegistered</code> error message to the 3rd-party server.</li>
+ <li>The 3rd-party deletes the registration ID.
+ </li>
+</ol>
+<p>Note that it might take a while for the registration ID be completely removed from GCM. Thus it is possible that messages sent during step 7 above gets a valid message ID as response, even though the message will not be delivered to the device. Eventually, the registration ID will be removed and the server will get a <code>NotRegistered</code> error, without any further action being required from the 3rd-party server (this scenario happens frequently while an application is being developed and tested).</p>
+
+<h2 id="collapsible">Send-to-Sync vs. Messages with Payload</h2>
+<p>Every message sent in GCM, regardless of its other characteristics, is either a "send-to-sync" (collapsible) message or a "message with payload" (non-collapsible message).</p>
+<h3 id="s2s"><strong>Send-to-sync messages</strong></h3>
+<p>A send-to-sync (collapsible) message is typically a "tickle" that tells a mobile application to sync data from the server. For example, suppose you have an email application. When a user receives new email on the server, the server pings the mobile application with a "New mail" message. This tells the application to sync to the server to pick up the new email. The server might send this message multiple times as new mail continues to accumulate, before the application has had a chance to sync. But if the user has received 25 new emails, there's no need to preserve every "New mail" message. One is sufficient. This is a case where you would use the GCM <code>collapse_key</code> parameter. A <em>collapse key</em> is an arbitrary string that is used to collapse a group of like messages when the device is offline, so that only the last message gets sent to the client. For example, "New mail," "Updates available," and so on</p>
+<p>GCM allows a maximum of 4 different collapse keys to be used by the GCM server at any given time. In other words, the GCM server can simultaneously store 4 different send-to-sync messages, each with a different collapse key.</p>
+<h3 id="payload">Messages with payload</h3>
+<p>Unlike a send-to-sync message, every "message with payload" (non-collapsible message) is delivered. The payload the message contains can be up to 4K. For example, here is a JSON-formatted message in an IM application in which spectators are discussing a sporting event:</p>
+
+<pre class="prettyprint pretty-json">{
+ "registration_id" : "APA91bHun4MxP5egoKMwt2KZFBaFUH-1RYqx...",
+ "data" : {
+ "Nick" : "Mario",
+ "Text" : "great match!",
+ "Room" : "PortugalVSDenmark",
+ },
+}</pre>
+
+<p>A "message with payload" is not simply a "ping" to the mobile application to contact the server to fetch data. In the aforementioned IM application, for example, you would want to deliver every message, because every message has different content. To specify a non-collapsible message, you simply omit the <code>collapse_key</code> parameter. Thus GCM will send each message individually. Note that the order of delivery is not guaranteed.</p>
+<p>GCM will store up to 100 non-collapsible messages. After that, all messages are discarded from GCM, and a new message is created that tells the client how far behind it is. The message is delivered through a regular <code>com.google.android.c2dm.intent.RECEIVE</code> intent, with the following extras:</p>
+<ul>
+ <li> <code>message_type</code>—The value is always the string "deleted_messages".</li>
+ <li><code>total_deleted</code>—The value is a string with the number of deleted messages.</li>
+</ul>
+<p>The application should respond by syncing with the server to recover the discarded messages. </p>
+ <p class="note"><strong>Note:</strong> If your application does not need to use non-collapsible messages, collapsible messages are a better choice from a performance standpoint, because they put less of a burden on the device battery.
+
+</p>
+<h2 dir="ltr" id="ttl">Setting an Expiration Date for a Message</h2>
+<p>The Time to Live (TTL) feature lets the sender specify the maximum lifespan of a message using the <code>time_to_live</code> parameter in the send request. The value of this parameter must be a duration from 0 to 2,419,200 seconds, and it corresponds to the maximum period of time for which GCM will store and try to deliver the message. Requests that don't contain this field default to the maximum period of 4 weeks.</p>
+<p>Here are some possible uses for this feature:</p>
+<ul>
+ <li>Video chat incoming calls</li>
+ <li>Expiring invitation events</li>
+ <li>Calendar events</li>
+</ul>
+<h3 id="bg">Background </h3>
+<p>GCM will usually deliver messages immediately after they are sent. However, this might not always be possible. For example, the device could be turned off, offline, or otherwise unavailable. In other cases, the sender itself might request that messages not be delivered until the device becomes active by using the <code>delay_while_idle</code> flag. Finally, GCM might intentionally delay messages to prevent an application from consuming excessive resources and negatively impacting battery life.</p>
+<p>When this happens, GCM will store the message and deliver it as soon as it's feasible. While this is fine in most cases, there are some applications for which a late message might as well never be delivered. For example, if the message is an incoming call or video chat notification, it will only be meaningful for a small period of time before the call is terminated. Or if the message is an invitation to an event, it will be useless if received after the event has ended.</p>
+<p>Another advantage of specifying the expiration date for a message is that GCM will never throttle messages with a <code>time_to_live</code> value of 0 seconds. In other words, GCM will guarantee best effort for messages that must be delivered "now or never." Keep in mind that a <code>time_to_live</code> value of 0 means messages that can't be delivered immediately will be discarded. However, because such messages are never stored, this provides the best latency for sending notifications.</p>
+<p>Here is an example of a JSON-formatted request that includes TTL:</p>
+<pre class="prettyprint pretty-json">
+{
+ "collapse_key" : "demo",
+ "delay_while_idle" : true,
+ "registration_ids" : ["xyz"],
+ "data" : {
+ "key1" : "value1",
+ "key2" : "value2",
+ },
+ "time_to_live" : 3
+},
+</pre>
+
+
+<h2 id="multi-senders">Receiving Messages from Multiple Senders</h2>
+<p>GCM allows multiple parties to send messages to the same application. For example, suppose your application is an articles aggregator with multiple contributors, and you want each of them to be able to send a message when they publish a new article. This message might contain a URL so that the application can download the article. Instead of having to centralize all sending activity in one location, GCM gives you the ability to let each of these contributors send its own messages.</p>
+<p>To make this possible, all you need to do is have each sender generate its own project ID. Then include those IDs in the sender field, separated by commas, when requesting a registration. Finally, share the registration ID with your partners, and they'll be able to send messages to your application using their own authentication keys.</p>
+<p>This code snippet illustrates this feature. Senders are passed as an intent extra in a comma-separated list:</p>
+<pre class="prettyprint pretty-java">Intent intent = new Intent(GCMConstants.INTENT_TO_GCM_REGISTRATION);
+intent.setPackage(GSF_PACKAGE);
+intent.putExtra(GCMConstants.EXTRA_APPLICATION_PENDING_INTENT,
+ PendingIntent.getBroadcast(context, 0, new Intent(), 0));
+String senderIds = "968350041068,652183961211";
+intent.putExtra(GCMConstants.EXTRA_SENDER, senderIds);
+ontext.startService(intent);
+ </pre>
+
+<p>Note that there is limit of 100 multiple senders.</p>
+
diff --git a/docs/html/guide/google/gcm/c2dm.jd b/docs/html/guide/google/gcm/c2dm.jd
new file mode 100644
index 0000000..fd1bb0c
--- /dev/null
+++ b/docs/html/guide/google/gcm/c2dm.jd
@@ -0,0 +1,107 @@
+page.title=Migration
+@jd:body
+
+<div id="qv-wrapper">
+<div id="qv">
+
+<h2>Quickview</h2>
+
+<ul>
+<li>Understand the differences between GCM and C2DM.</li>
+<li>Learn how to migrate an app from C2DM to GCM.</li>
+
+</ul>
+
+
+<h2>In this document</h2>
+
+<ol>
+<li><a href="#history">Historical Overview</a></li>
+<li><a href="#diffs">How is GCM Different from C2DM?</a></li>
+<li><a href="#migrating">Migrating Your Apps</a>
+ <ol>
+ <li><a href="#client">Client changes</a></li>
+ <li><a href="#server">Server changes</a></li>
+ </ol>
+</li>
+</ol>
+
+</div>
+</div>
+
+<p>Android Cloud to Device Messaging (C2DM) is deprecated. The C2DM service will continue to be maintained in the short term, but C2DM will accept no new users, and it will grant no new quotas. <strong>C2DM developers are strongly encouraged to move to Google Cloud Messaging (GCM)</strong>. GCM is the next generation of C2DM.</p>
+<p>This document is addressed to C2DM developers who are moving to GCM. It describes the differences between GCM and C2DM, and explains how to migrate existing C2DM apps to GCM.</p>
+
+
+<h2 id="history">Historical Overview</h2>
+<p>C2DM was launched in 2010 to help Android apps send data from servers to their applications. Servers can tell apps to contact the server directly, to fetch updated application or user data. The C2DM service handles all aspects of queueing of messages and delivery to the target application running on the target device.</p>
+<p>GCM replaces C2DM. The focus of GCM is as follows:</p>
+<ul>
+ <li> Ease of use. No sign-up forms.</li>
+ <li>No quotas.</li>
+ <li>GCM and C2DM stats are available through the <a href="http://play.google.com/apps/publish">Android Developer Console</a>.</li>
+ <li>Battery efficiency.</li>
+ <li>Rich set of new APIs.</li>
+</ul>
+<h2 id="diffs">How is GCM Different from C2DM?</h2>
+<p>GCM builds on the core foundation of C2DM. Here is what's different:</p>
+
+<dl>
+<dt><strong>Simple API Key</strong></dt>
+<dd>To use the GCM service, you need to obtain a Simple API Key from Google APIs console page. For more information, see <a href="gs.html">Getting Started</a>. Note that GCM <em>only</em> accepts Simple API Key—using ClientLogin or OAuth2 tokens will not work.
+</dd>
+<dt><strong>Sender ID</strong></dt>
+<dd>In C2DM, the Sender ID is an email address. In GCM, the Sender ID is a project ID that you acquire from the API console, as described in <a href="https://devsite.googleplex.com/android/gcm/gs.html#create-proj">Getting Started</a>. </dd>
+
+<dt><strong>JSON format</strong></dt>
+<dd>GCM HTTP requests support JSON format in addition to plain text. For more information, see the <a href="gcm.html#send-msg">Architectural Overview</a>.</dd>
+
+<dt><strong>Multicast messages</strong></dt>
+<dd>In GCM you can send the same message to multiple devices simultaneously. For example, a sports app wanting to deliver a score update to fans can now send the message to up to 1000 registration IDs in the same request (requires JSON). For more information, see the <a href="gcm.html#send-msg">Architectural Overview</a>.</dd>
+
+<dt><strong>Multiple senders</strong></dt>
+<dd>Multiple parties can send messages to the same app with one common registration ID. For more information, see <a href="adv.html#multi-senders">Advanced Topics</a>.</dd>
+
+<dt><strong>Time-to-live messages</strong></dt>
+<dd>Apps like video chat and calendar apps can send expiring invitation events with a time-to-live value between 0 and 4 weeks. GCM will store the messages until they expire. A message with a time-to-live value of 0 will not be stored on the GCM server, nor will it be throttled. For more information, see <a href="adv.html#ttl">Advanced Topics</a>.</dd>
+
+<dt><strong>Messages with payload</strong></dt>
+<dd>Apps can use "messages with payload" to deliver messages of up to 4 Kb. This would be useful in a chat application, for example. To use this feature, simply omit the <code>collapse_key</code> parameter and messages will not be collapsed. GCM will store up to 100 messages. If you exceed that number, all messages will be discarded but you will receive a special message. If an application receives this message, it needs to sync with the server. For more information, see <a href="adv.html#collapsible">Advanced Topics</a>.</dd>
+
+<dt><strong>Canonical registration ID</strong></dt>
+<dd>There may be situations where the server ends up with 2 registration IDs for the same device. If the GCM response contains a registration ID, simply replace the registration ID you have with the one provided. With this feature your application doesn't need to send the device ID to your server anymore. For more information, see <a href="adv.html#canonical">Advanced Topics</a>.</dd>
+</dl>
+<p>GCM also provides helper libraries (<a href="{@docRoot}guide/google/gcm/client-javadoc/index.html">client</a> and <a href="{@docRoot}guide/google/gcm/server-javadoc/index.html">server</a>) to make writing your code easier.</p>
+<h2 id="migrating">Migrating Your Apps</h2>
+<p>This section describes how to move existing C2DM apps to GCM.</p>
+<h3 id="client">Client changes</h3>
+<p>Migration is simple! The only change required in the application is replacing the email account passed in the sender parameter of the registration intent with the project ID generated when signing up for the new service. For example:</p>
+<pre class="prettyprint pretty-java">Intent registrationIntent = new Intent("com.google.android.c2dm.intent.REGISTER");
+// sets the app name in the intent
+registrationIntent.putExtra("app", PendingIntent.getBroadcast(this, 0, new Intent(), 0));
+registrationIntent.putExtra("sender", senderID);
+startService(registrationIntent);</pre>
+<p>After receiving a response from GCM, the registration ID obtained must be sent to the application server. When doing this, the application should indicate that it is sending a GCM registration ID so that the server can distinguish it from existing C2DM registrations.</p>
+<h3 id="server">Server changes</h3>
+<p>When the application server receives a GCM registration ID, it should store it and mark it as such.</p>
+<p>Sending messages to GCM devices requires a few changes:</p>
+<ul>
+ <li> The request should be sent to a new endpoint: <code>https://android.googleapis.com/gcm/send</code>.</li>
+ <li>The Authorization header of the request should contain the API key generated during sign up. This key replaces the deprecated ClientLogin Auth token.</li>
+</ul>
+<p>For example:
+</p>
+<pre>Content-Type:application/json
+Authorization:key=AIzaSyB-1uEai2WiUapxCs2Q0GZYzPu7Udno5aA
+
+{
+ "registration_id" : "APA91bHun4MxP5egoKMwt2KZFBaFUH-1RYqx...",
+ "data" : {
+ "Team" : "Portugal",
+ "Score" : "3",
+ "Player" : "Varela",
+ },
+}</pre>
+<p>For a detailed discussion of this topic and more examples, see the <a href="gcm.html#send-msg">Architectural Overview</a>.</p>
+<p>Eventually, once enough users of your application have migrated to the new service, you might want to take advantage of the new <a href="gcm.html#send-msg">JSON-formatted</a> requests that give access to the full set of features provided by GCM.</p>
+
diff --git a/docs/html/guide/google/gcm/client-javadoc/allclasses-frame.html b/docs/html/guide/google/gcm/client-javadoc/allclasses-frame.html
new file mode 100644
index 0000000..4788142
--- /dev/null
+++ b/docs/html/guide/google/gcm/client-javadoc/allclasses-frame.html
@@ -0,0 +1,37 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_20) on Thu Jun 21 12:06:25 PDT 2012 -->
+<TITLE>
+All Classes
+</TITLE>
+
+<META NAME="date" CONTENT="2012-06-21">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+
+
+</HEAD>
+
+<BODY BGCOLOR="white">
+<FONT size="+1" CLASS="FrameHeadingFont">
+<B>All Classes</B></FONT>
+<BR>
+
+<TABLE BORDER="0" WIDTH="100%" SUMMARY="">
+<TR>
+<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="com/google/android/gcm/GCMBaseIntentService.html" title="class in com.google.android.gcm" target="classFrame">GCMBaseIntentService</A>
+<BR>
+<A HREF="com/google/android/gcm/GCMBroadcastReceiver.html" title="class in com.google.android.gcm" target="classFrame">GCMBroadcastReceiver</A>
+<BR>
+<A HREF="com/google/android/gcm/GCMConstants.html" title="class in com.google.android.gcm" target="classFrame">GCMConstants</A>
+<BR>
+<A HREF="com/google/android/gcm/GCMRegistrar.html" title="class in com.google.android.gcm" target="classFrame">GCMRegistrar</A>
+<BR>
+</FONT></TD>
+</TR>
+</TABLE>
+
+</BODY>
+</HTML>
diff --git a/docs/html/guide/google/gcm/client-javadoc/allclasses-noframe.html b/docs/html/guide/google/gcm/client-javadoc/allclasses-noframe.html
new file mode 100644
index 0000000..cf3b68c
--- /dev/null
+++ b/docs/html/guide/google/gcm/client-javadoc/allclasses-noframe.html
@@ -0,0 +1,37 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_20) on Thu Jun 21 12:06:25 PDT 2012 -->
+<TITLE>
+All Classes
+</TITLE>
+
+<META NAME="date" CONTENT="2012-06-21">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+
+
+</HEAD>
+
+<BODY BGCOLOR="white">
+<FONT size="+1" CLASS="FrameHeadingFont">
+<B>All Classes</B></FONT>
+<BR>
+
+<TABLE BORDER="0" WIDTH="100%" SUMMARY="">
+<TR>
+<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="com/google/android/gcm/GCMBaseIntentService.html" title="class in com.google.android.gcm">GCMBaseIntentService</A>
+<BR>
+<A HREF="com/google/android/gcm/GCMBroadcastReceiver.html" title="class in com.google.android.gcm">GCMBroadcastReceiver</A>
+<BR>
+<A HREF="com/google/android/gcm/GCMConstants.html" title="class in com.google.android.gcm">GCMConstants</A>
+<BR>
+<A HREF="com/google/android/gcm/GCMRegistrar.html" title="class in com.google.android.gcm">GCMRegistrar</A>
+<BR>
+</FONT></TD>
+</TR>
+</TABLE>
+
+</BODY>
+</HTML>
diff --git a/docs/html/guide/google/gcm/client-javadoc/com/google/android/gcm/GCMBaseIntentService.html b/docs/html/guide/google/gcm/client-javadoc/com/google/android/gcm/GCMBaseIntentService.html
new file mode 100644
index 0000000..0b2cfad
--- /dev/null
+++ b/docs/html/guide/google/gcm/client-javadoc/com/google/android/gcm/GCMBaseIntentService.html
@@ -0,0 +1,446 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_20) on Thu Jun 21 12:06:25 PDT 2012 -->
+<TITLE>
+GCMBaseIntentService
+</TITLE>
+
+<META NAME="date" CONTENT="2012-06-21">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+ if (location.href.indexOf('is-external=true') == -1) {
+ parent.document.title="GCMBaseIntentService";
+ }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../com/google/android/gcm/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV CLASS
+ <A HREF="../../../../com/google/android/gcm/GCMBroadcastReceiver.html" title="class in com.google.android.gcm"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../index.html?com/google/android/gcm/GCMBaseIntentService.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="GCMBaseIntentService.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+ SUMMARY: NESTED | <A HREF="#field_summary">FIELD</A> | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: <A HREF="#field_detail">FIELD</A> | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<!-- ======== START OF CLASS DATA ======== -->
+<H2>
+<FONT SIZE="-1">
+com.google.android.gcm</FONT>
+<BR>
+Class GCMBaseIntentService</H2>
+<PRE>
+java.lang.Object
+ <IMG SRC="../../../../resources/inherit.gif" ALT="extended by ">IntentService
+ <IMG SRC="../../../../resources/inherit.gif" ALT="extended by "><B>com.google.android.gcm.GCMBaseIntentService</B>
+</PRE>
+<HR>
+<DL>
+<DT><PRE>public abstract class <B>GCMBaseIntentService</B><DT>extends IntentService</DL>
+</PRE>
+
+<P>
+Skeleton for application-specific <CODE>IntentService</CODE>s responsible for
+ handling communication from Google Cloud Messaging service.
+ <p>
+ The abstract methods in this class are called from its worker thread, and
+ hence should run in a limited amount of time. If they execute long
+ operations, they should spawn new threads, otherwise the worker thread will
+ be blocked.
+<P>
+
+<P>
+<HR>
+
+<P>
+<!-- =========== FIELD SUMMARY =========== -->
+
+<A NAME="field_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Field Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../com/google/android/gcm/GCMBaseIntentService.html#TAG">TAG</A></B></CODE>
+
+<BR>
+ </TD>
+</TR>
+</TABLE>
+
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+
+<A NAME="constructor_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Constructor Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>protected </CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../com/google/android/gcm/GCMBaseIntentService.html#GCMBaseIntentService(java.lang.String)">GCMBaseIntentService</A></B>(java.lang.String senderId)</CODE>
+
+<BR>
+ Subclasses must create a public no-arg constructor and pass the
+ sender id to be used for registration.</TD>
+</TR>
+</TABLE>
+
+<!-- ========== METHOD SUMMARY =========== -->
+
+<A NAME="method_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Method Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>protected void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../com/google/android/gcm/GCMBaseIntentService.html#onDeletedMessages(Context, int)">onDeletedMessages</A></B>(Context context,
+ int total)</CODE>
+
+<BR>
+ Called when the GCM server tells pending messages have been deleted
+ because the device was idle.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>protected abstract void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../com/google/android/gcm/GCMBaseIntentService.html#onError(Context, java.lang.String)">onError</A></B>(Context context,
+ java.lang.String errorId)</CODE>
+
+<BR>
+ Called on registration or unregistration error.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../com/google/android/gcm/GCMBaseIntentService.html#onHandleIntent(Intent)">onHandleIntent</A></B>(Intent intent)</CODE>
+
+<BR>
+ </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>protected abstract void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../com/google/android/gcm/GCMBaseIntentService.html#onMessage(Context, Intent)">onMessage</A></B>(Context context,
+ Intent intent)</CODE>
+
+<BR>
+ Called when a cloud message has been received.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>protected boolean</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../com/google/android/gcm/GCMBaseIntentService.html#onRecoverableError(Context, java.lang.String)">onRecoverableError</A></B>(Context context,
+ java.lang.String errorId)</CODE>
+
+<BR>
+ Called on a registration error that could be retried.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>protected abstract void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../com/google/android/gcm/GCMBaseIntentService.html#onRegistered(Context, java.lang.String)">onRegistered</A></B>(Context context,
+ java.lang.String registrationId)</CODE>
+
+<BR>
+ Called after a device has been registered.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>protected abstract void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../com/google/android/gcm/GCMBaseIntentService.html#onUnregistered(Context, java.lang.String)">onUnregistered</A></B>(Context context,
+ java.lang.String registrationId)</CODE>
+
+<BR>
+ Called after a device has been unregistered.</TD>
+</TR>
+</TABLE>
+ <A NAME="methods_inherited_from_class_java.lang.Object"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left"><B>Methods inherited from class java.lang.Object</B></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE>clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait</CODE></TD>
+</TR>
+</TABLE>
+
+<P>
+
+<!-- ============ FIELD DETAIL =========== -->
+
+<A NAME="field_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Field Detail</B></FONT></TH>
+</TR>
+</TABLE>
+
+<A NAME="TAG"><!-- --></A><H3>
+TAG</H3>
+<PRE>
+public static final java.lang.String <B>TAG</B></PRE>
+<DL>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../../constant-values.html#com.google.android.gcm.GCMBaseIntentService.TAG">Constant Field Values</A></DL>
+</DL>
+
+<!-- ========= CONSTRUCTOR DETAIL ======== -->
+
+<A NAME="constructor_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Constructor Detail</B></FONT></TH>
+</TR>
+</TABLE>
+
+<A NAME="GCMBaseIntentService(java.lang.String)"><!-- --></A><H3>
+GCMBaseIntentService</H3>
+<PRE>
+protected <B>GCMBaseIntentService</B>(java.lang.String senderId)</PRE>
+<DL>
+<DD>Subclasses must create a public no-arg constructor and pass the
+ sender id to be used for registration.
+<P>
+</DL>
+
+<!-- ============ METHOD DETAIL ========== -->
+
+<A NAME="method_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Method Detail</B></FONT></TH>
+</TR>
+</TABLE>
+
+<A NAME="onMessage(Context, Intent)"><!-- --></A><H3>
+onMessage</H3>
+<PRE>
+protected abstract void <B>onMessage</B>(Context context,
+ Intent intent)</PRE>
+<DL>
+<DD>Called when a cloud message has been received.
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>context</CODE> - application's context.<DD><CODE>intent</CODE> - intent containing the message payload as extras.</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="onDeletedMessages(Context, int)"><!-- --></A><H3>
+onDeletedMessages</H3>
+<PRE>
+protected void <B>onDeletedMessages</B>(Context context,
+ int total)</PRE>
+<DL>
+<DD>Called when the GCM server tells pending messages have been deleted
+ because the device was idle.
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>context</CODE> - application's context.<DD><CODE>total</CODE> - total number of collapsed messages</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="onRecoverableError(Context, java.lang.String)"><!-- --></A><H3>
+onRecoverableError</H3>
+<PRE>
+protected boolean <B>onRecoverableError</B>(Context context,
+ java.lang.String errorId)</PRE>
+<DL>
+<DD>Called on a registration error that could be retried.
+
+ <p>By default, it does nothing and returns true, but could be
+ overridden to change that behavior and/or display the error.
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>context</CODE> - application's context.<DD><CODE>errorId</CODE> - error id returned by the GCM service.
+<DT><B>Returns:</B><DD>if true, failed operation will be retried (using
+ exponential backoff).</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="onError(Context, java.lang.String)"><!-- --></A><H3>
+onError</H3>
+<PRE>
+protected abstract void <B>onError</B>(Context context,
+ java.lang.String errorId)</PRE>
+<DL>
+<DD>Called on registration or unregistration error.
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>context</CODE> - application's context.<DD><CODE>errorId</CODE> - error id returned by the GCM service.</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="onRegistered(Context, java.lang.String)"><!-- --></A><H3>
+onRegistered</H3>
+<PRE>
+protected abstract void <B>onRegistered</B>(Context context,
+ java.lang.String registrationId)</PRE>
+<DL>
+<DD>Called after a device has been registered.
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>context</CODE> - application's context.<DD><CODE>registrationId</CODE> - the registration id returned by the GCM service.</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="onUnregistered(Context, java.lang.String)"><!-- --></A><H3>
+onUnregistered</H3>
+<PRE>
+protected abstract void <B>onUnregistered</B>(Context context,
+ java.lang.String registrationId)</PRE>
+<DL>
+<DD>Called after a device has been unregistered.
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>registrationId</CODE> - the registration id that was previously registered.<DD><CODE>context</CODE> - application's context.</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="onHandleIntent(Intent)"><!-- --></A><H3>
+onHandleIntent</H3>
+<PRE>
+public final void <B>onHandleIntent</B>(Intent intent)</PRE>
+<DL>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<!-- ========= END OF CLASS DATA ========= -->
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../com/google/android/gcm/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV CLASS
+ <A HREF="../../../../com/google/android/gcm/GCMBroadcastReceiver.html" title="class in com.google.android.gcm"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../index.html?com/google/android/gcm/GCMBaseIntentService.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="GCMBaseIntentService.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+ SUMMARY: NESTED | <A HREF="#field_summary">FIELD</A> | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: <A HREF="#field_detail">FIELD</A> | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+
+</BODY>
+</HTML>
diff --git a/docs/html/guide/google/gcm/client-javadoc/com/google/android/gcm/GCMBroadcastReceiver.html b/docs/html/guide/google/gcm/client-javadoc/com/google/android/gcm/GCMBroadcastReceiver.html
new file mode 100644
index 0000000..f0b3e26
--- /dev/null
+++ b/docs/html/guide/google/gcm/client-javadoc/com/google/android/gcm/GCMBroadcastReceiver.html
@@ -0,0 +1,282 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_20) on Thu Jun 21 12:06:25 PDT 2012 -->
+<TITLE>
+GCMBroadcastReceiver
+</TITLE>
+
+<META NAME="date" CONTENT="2012-06-21">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+ if (location.href.indexOf('is-external=true') == -1) {
+ parent.document.title="GCMBroadcastReceiver";
+ }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../com/google/android/gcm/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../com/google/android/gcm/GCMBaseIntentService.html" title="class in com.google.android.gcm"><B>PREV CLASS</B></A>
+ <A HREF="../../../../com/google/android/gcm/GCMConstants.html" title="class in com.google.android.gcm"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../index.html?com/google/android/gcm/GCMBroadcastReceiver.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="GCMBroadcastReceiver.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+ SUMMARY: NESTED | FIELD | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: FIELD | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<!-- ======== START OF CLASS DATA ======== -->
+<H2>
+<FONT SIZE="-1">
+com.google.android.gcm</FONT>
+<BR>
+Class GCMBroadcastReceiver</H2>
+<PRE>
+java.lang.Object
+ <IMG SRC="../../../../resources/inherit.gif" ALT="extended by ">BroadcastReceiver
+ <IMG SRC="../../../../resources/inherit.gif" ALT="extended by "><B>com.google.android.gcm.GCMBroadcastReceiver</B>
+</PRE>
+<HR>
+<DL>
+<DT><PRE>public class <B>GCMBroadcastReceiver</B><DT>extends BroadcastReceiver</DL>
+</PRE>
+
+<P>
+<CODE>BroadcastReceiver</CODE> that receives GCM messages and delivers them to
+ an application-specific <A HREF="../../../../com/google/android/gcm/GCMBaseIntentService.html" title="class in com.google.android.gcm"><CODE>GCMBaseIntentService</CODE></A> subclass.
+ <p>
+ By default, the <A HREF="../../../../com/google/android/gcm/GCMBaseIntentService.html" title="class in com.google.android.gcm"><CODE>GCMBaseIntentService</CODE></A> class belongs to the application
+ main package and is named
+ <A HREF="../../../../com/google/android/gcm/GCMConstants.html#DEFAULT_INTENT_SERVICE_CLASS_NAME"><CODE>GCMConstants.DEFAULT_INTENT_SERVICE_CLASS_NAME</CODE></A>. To use a new class,
+ the <A HREF="../../../../com/google/android/gcm/GCMBroadcastReceiver.html#getGCMIntentServiceClassName(Context)"><CODE>getGCMIntentServiceClassName(Context)</CODE></A> must be overridden.
+<P>
+
+<P>
+<HR>
+
+<P>
+
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+
+<A NAME="constructor_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Constructor Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><B><A HREF="../../../../com/google/android/gcm/GCMBroadcastReceiver.html#GCMBroadcastReceiver()">GCMBroadcastReceiver</A></B>()</CODE>
+
+<BR>
+ </TD>
+</TR>
+</TABLE>
+
+<!-- ========== METHOD SUMMARY =========== -->
+
+<A NAME="method_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Method Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>protected java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../com/google/android/gcm/GCMBroadcastReceiver.html#getGCMIntentServiceClassName(Context)">getGCMIntentServiceClassName</A></B>(Context context)</CODE>
+
+<BR>
+ Gets the class name of the intent service that will handle GCM messages.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../com/google/android/gcm/GCMBroadcastReceiver.html#onReceive(Context, Intent)">onReceive</A></B>(Context context,
+ Intent intent)</CODE>
+
+<BR>
+ </TD>
+</TR>
+</TABLE>
+ <A NAME="methods_inherited_from_class_java.lang.Object"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left"><B>Methods inherited from class java.lang.Object</B></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE>clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait</CODE></TD>
+</TR>
+</TABLE>
+
+<P>
+
+<!-- ========= CONSTRUCTOR DETAIL ======== -->
+
+<A NAME="constructor_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Constructor Detail</B></FONT></TH>
+</TR>
+</TABLE>
+
+<A NAME="GCMBroadcastReceiver()"><!-- --></A><H3>
+GCMBroadcastReceiver</H3>
+<PRE>
+public <B>GCMBroadcastReceiver</B>()</PRE>
+<DL>
+</DL>
+
+<!-- ============ METHOD DETAIL ========== -->
+
+<A NAME="method_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Method Detail</B></FONT></TH>
+</TR>
+</TABLE>
+
+<A NAME="onReceive(Context, Intent)"><!-- --></A><H3>
+onReceive</H3>
+<PRE>
+public final void <B>onReceive</B>(Context context,
+ Intent intent)</PRE>
+<DL>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="getGCMIntentServiceClassName(Context)"><!-- --></A><H3>
+getGCMIntentServiceClassName</H3>
+<PRE>
+protected java.lang.String <B>getGCMIntentServiceClassName</B>(Context context)</PRE>
+<DL>
+<DD>Gets the class name of the intent service that will handle GCM messages.
+<P>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<!-- ========= END OF CLASS DATA ========= -->
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../com/google/android/gcm/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../com/google/android/gcm/GCMBaseIntentService.html" title="class in com.google.android.gcm"><B>PREV CLASS</B></A>
+ <A HREF="../../../../com/google/android/gcm/GCMConstants.html" title="class in com.google.android.gcm"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../index.html?com/google/android/gcm/GCMBroadcastReceiver.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="GCMBroadcastReceiver.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+ SUMMARY: NESTED | FIELD | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: FIELD | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+
+</BODY>
+</HTML>
diff --git a/docs/html/guide/google/gcm/client-javadoc/com/google/android/gcm/GCMConstants.html b/docs/html/guide/google/gcm/client-javadoc/com/google/android/gcm/GCMConstants.html
new file mode 100644
index 0000000..feb2225
--- /dev/null
+++ b/docs/html/guide/google/gcm/client-javadoc/com/google/android/gcm/GCMConstants.html
@@ -0,0 +1,652 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_20) on Thu Jun 21 12:06:25 PDT 2012 -->
+<TITLE>
+GCMConstants
+</TITLE>
+
+<META NAME="date" CONTENT="2012-06-21">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+ if (location.href.indexOf('is-external=true') == -1) {
+ parent.document.title="GCMConstants";
+ }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../com/google/android/gcm/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../com/google/android/gcm/GCMBroadcastReceiver.html" title="class in com.google.android.gcm"><B>PREV CLASS</B></A>
+ <A HREF="../../../../com/google/android/gcm/GCMRegistrar.html" title="class in com.google.android.gcm"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../index.html?com/google/android/gcm/GCMConstants.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="GCMConstants.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+ SUMMARY: NESTED | <A HREF="#field_summary">FIELD</A> | CONSTR | <A HREF="#methods_inherited_from_class_java.lang.Object">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: <A HREF="#field_detail">FIELD</A> | CONSTR | METHOD</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<!-- ======== START OF CLASS DATA ======== -->
+<H2>
+<FONT SIZE="-1">
+com.google.android.gcm</FONT>
+<BR>
+Class GCMConstants</H2>
+<PRE>
+java.lang.Object
+ <IMG SRC="../../../../resources/inherit.gif" ALT="extended by "><B>com.google.android.gcm.GCMConstants</B>
+</PRE>
+<HR>
+<DL>
+<DT><PRE>public final class <B>GCMConstants</B><DT>extends java.lang.Object</DL>
+</PRE>
+
+<P>
+Constants used by the GCM library.
+<P>
+
+<P>
+<HR>
+
+<P>
+<!-- =========== FIELD SUMMARY =========== -->
+
+<A NAME="field_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Field Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../com/google/android/gcm/GCMConstants.html#DEFAULT_INTENT_SERVICE_CLASS_NAME">DEFAULT_INTENT_SERVICE_CLASS_NAME</A></B></CODE>
+
+<BR>
+ </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../com/google/android/gcm/GCMConstants.html#ERROR_ACCOUNT_MISSING">ERROR_ACCOUNT_MISSING</A></B></CODE>
+
+<BR>
+ There is no Google account on the phone.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../com/google/android/gcm/GCMConstants.html#ERROR_AUTHENTICATION_FAILED">ERROR_AUTHENTICATION_FAILED</A></B></CODE>
+
+<BR>
+ Bad password.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../com/google/android/gcm/GCMConstants.html#ERROR_INVALID_PARAMETERS">ERROR_INVALID_PARAMETERS</A></B></CODE>
+
+<BR>
+ The request sent by the phone does not contain the expected parameters.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../com/google/android/gcm/GCMConstants.html#ERROR_INVALID_SENDER">ERROR_INVALID_SENDER</A></B></CODE>
+
+<BR>
+ The sender account is not recognized.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../com/google/android/gcm/GCMConstants.html#ERROR_PHONE_REGISTRATION_ERROR">ERROR_PHONE_REGISTRATION_ERROR</A></B></CODE>
+
+<BR>
+ Incorrect phone registration with Google.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../com/google/android/gcm/GCMConstants.html#ERROR_SERVICE_NOT_AVAILABLE">ERROR_SERVICE_NOT_AVAILABLE</A></B></CODE>
+
+<BR>
+ The device can't read the response, or there was a 500/503 from the
+ server that can be retried later.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../com/google/android/gcm/GCMConstants.html#EXTRA_APPLICATION_PENDING_INTENT">EXTRA_APPLICATION_PENDING_INTENT</A></B></CODE>
+
+<BR>
+ Extra used on <A HREF="../../../../com/google/android/gcm/GCMConstants.html#INTENT_TO_GCM_REGISTRATION"><CODE>INTENT_TO_GCM_REGISTRATION</CODE></A> to get the application
+ id.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../com/google/android/gcm/GCMConstants.html#EXTRA_ERROR">EXTRA_ERROR</A></B></CODE>
+
+<BR>
+ Extra used on <A HREF="../../../../com/google/android/gcm/GCMConstants.html#INTENT_FROM_GCM_REGISTRATION_CALLBACK"><CODE>INTENT_FROM_GCM_REGISTRATION_CALLBACK</CODE></A> to indicate
+ an error when the registration fails.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../com/google/android/gcm/GCMConstants.html#EXTRA_REGISTRATION_ID">EXTRA_REGISTRATION_ID</A></B></CODE>
+
+<BR>
+ Extra used on <A HREF="../../../../com/google/android/gcm/GCMConstants.html#INTENT_FROM_GCM_REGISTRATION_CALLBACK"><CODE>INTENT_FROM_GCM_REGISTRATION_CALLBACK</CODE></A> to indicate
+ the registration id when the registration succeeds.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../com/google/android/gcm/GCMConstants.html#EXTRA_SENDER">EXTRA_SENDER</A></B></CODE>
+
+<BR>
+ Extra used on <A HREF="../../../../com/google/android/gcm/GCMConstants.html#INTENT_TO_GCM_REGISTRATION"><CODE>INTENT_TO_GCM_REGISTRATION</CODE></A> to indicate the sender
+ account (a Google email) that owns the application.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../com/google/android/gcm/GCMConstants.html#EXTRA_SPECIAL_MESSAGE">EXTRA_SPECIAL_MESSAGE</A></B></CODE>
+
+<BR>
+ Type of message present in the <A HREF="../../../../com/google/android/gcm/GCMConstants.html#INTENT_FROM_GCM_MESSAGE"><CODE>INTENT_FROM_GCM_MESSAGE</CODE></A> intent.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../com/google/android/gcm/GCMConstants.html#EXTRA_TOTAL_DELETED">EXTRA_TOTAL_DELETED</A></B></CODE>
+
+<BR>
+ Number of messages deleted by the server because the device was idle.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../com/google/android/gcm/GCMConstants.html#EXTRA_UNREGISTERED">EXTRA_UNREGISTERED</A></B></CODE>
+
+<BR>
+ Extra used on <A HREF="../../../../com/google/android/gcm/GCMConstants.html#INTENT_FROM_GCM_REGISTRATION_CALLBACK"><CODE>INTENT_FROM_GCM_REGISTRATION_CALLBACK</CODE></A> to indicate
+ that the application has been unregistered.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../com/google/android/gcm/GCMConstants.html#INTENT_FROM_GCM_LIBRARY_RETRY">INTENT_FROM_GCM_LIBRARY_RETRY</A></B></CODE>
+
+<BR>
+ Intent used by the GCM library to indicate that the registration call
+ should be retried.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../com/google/android/gcm/GCMConstants.html#INTENT_FROM_GCM_MESSAGE">INTENT_FROM_GCM_MESSAGE</A></B></CODE>
+
+<BR>
+ Intent sent by GCM containing a message.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../com/google/android/gcm/GCMConstants.html#INTENT_FROM_GCM_REGISTRATION_CALLBACK">INTENT_FROM_GCM_REGISTRATION_CALLBACK</A></B></CODE>
+
+<BR>
+ Intent sent by GCM indicating with the result of a registration request.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../com/google/android/gcm/GCMConstants.html#INTENT_TO_GCM_REGISTRATION">INTENT_TO_GCM_REGISTRATION</A></B></CODE>
+
+<BR>
+ Intent sent to GCM to register the application.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../com/google/android/gcm/GCMConstants.html#INTENT_TO_GCM_UNREGISTRATION">INTENT_TO_GCM_UNREGISTRATION</A></B></CODE>
+
+<BR>
+ Intent sent to GCM to unregister the application.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../com/google/android/gcm/GCMConstants.html#PERMISSION_GCM_INTENTS">PERMISSION_GCM_INTENTS</A></B></CODE>
+
+<BR>
+ Permission necessary to receive GCM intents.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../com/google/android/gcm/GCMConstants.html#VALUE_DELETED_MESSAGES">VALUE_DELETED_MESSAGES</A></B></CODE>
+
+<BR>
+ Special message indicating the server deleted the pending messages.</TD>
+</TR>
+</TABLE>
+
+<!-- ========== METHOD SUMMARY =========== -->
+
+<A NAME="method_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Method Summary</B></FONT></TH>
+</TR>
+</TABLE>
+ <A NAME="methods_inherited_from_class_java.lang.Object"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left"><B>Methods inherited from class java.lang.Object</B></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE>clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait</CODE></TD>
+</TR>
+</TABLE>
+
+<P>
+
+<!-- ============ FIELD DETAIL =========== -->
+
+<A NAME="field_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Field Detail</B></FONT></TH>
+</TR>
+</TABLE>
+
+<A NAME="INTENT_TO_GCM_REGISTRATION"><!-- --></A><H3>
+INTENT_TO_GCM_REGISTRATION</H3>
+<PRE>
+public static final java.lang.String <B>INTENT_TO_GCM_REGISTRATION</B></PRE>
+<DL>
+<DD>Intent sent to GCM to register the application.
+<P>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../../constant-values.html#com.google.android.gcm.GCMConstants.INTENT_TO_GCM_REGISTRATION">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="INTENT_TO_GCM_UNREGISTRATION"><!-- --></A><H3>
+INTENT_TO_GCM_UNREGISTRATION</H3>
+<PRE>
+public static final java.lang.String <B>INTENT_TO_GCM_UNREGISTRATION</B></PRE>
+<DL>
+<DD>Intent sent to GCM to unregister the application.
+<P>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../../constant-values.html#com.google.android.gcm.GCMConstants.INTENT_TO_GCM_UNREGISTRATION">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="INTENT_FROM_GCM_REGISTRATION_CALLBACK"><!-- --></A><H3>
+INTENT_FROM_GCM_REGISTRATION_CALLBACK</H3>
+<PRE>
+public static final java.lang.String <B>INTENT_FROM_GCM_REGISTRATION_CALLBACK</B></PRE>
+<DL>
+<DD>Intent sent by GCM indicating with the result of a registration request.
+<P>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../../constant-values.html#com.google.android.gcm.GCMConstants.INTENT_FROM_GCM_REGISTRATION_CALLBACK">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="INTENT_FROM_GCM_LIBRARY_RETRY"><!-- --></A><H3>
+INTENT_FROM_GCM_LIBRARY_RETRY</H3>
+<PRE>
+public static final java.lang.String <B>INTENT_FROM_GCM_LIBRARY_RETRY</B></PRE>
+<DL>
+<DD>Intent used by the GCM library to indicate that the registration call
+ should be retried.
+<P>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../../constant-values.html#com.google.android.gcm.GCMConstants.INTENT_FROM_GCM_LIBRARY_RETRY">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="INTENT_FROM_GCM_MESSAGE"><!-- --></A><H3>
+INTENT_FROM_GCM_MESSAGE</H3>
+<PRE>
+public static final java.lang.String <B>INTENT_FROM_GCM_MESSAGE</B></PRE>
+<DL>
+<DD>Intent sent by GCM containing a message.
+<P>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../../constant-values.html#com.google.android.gcm.GCMConstants.INTENT_FROM_GCM_MESSAGE">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="EXTRA_SENDER"><!-- --></A><H3>
+EXTRA_SENDER</H3>
+<PRE>
+public static final java.lang.String <B>EXTRA_SENDER</B></PRE>
+<DL>
+<DD>Extra used on <A HREF="../../../../com/google/android/gcm/GCMConstants.html#INTENT_TO_GCM_REGISTRATION"><CODE>INTENT_TO_GCM_REGISTRATION</CODE></A> to indicate the sender
+ account (a Google email) that owns the application.
+<P>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../../constant-values.html#com.google.android.gcm.GCMConstants.EXTRA_SENDER">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="EXTRA_APPLICATION_PENDING_INTENT"><!-- --></A><H3>
+EXTRA_APPLICATION_PENDING_INTENT</H3>
+<PRE>
+public static final java.lang.String <B>EXTRA_APPLICATION_PENDING_INTENT</B></PRE>
+<DL>
+<DD>Extra used on <A HREF="../../../../com/google/android/gcm/GCMConstants.html#INTENT_TO_GCM_REGISTRATION"><CODE>INTENT_TO_GCM_REGISTRATION</CODE></A> to get the application
+ id.
+<P>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../../constant-values.html#com.google.android.gcm.GCMConstants.EXTRA_APPLICATION_PENDING_INTENT">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="EXTRA_UNREGISTERED"><!-- --></A><H3>
+EXTRA_UNREGISTERED</H3>
+<PRE>
+public static final java.lang.String <B>EXTRA_UNREGISTERED</B></PRE>
+<DL>
+<DD>Extra used on <A HREF="../../../../com/google/android/gcm/GCMConstants.html#INTENT_FROM_GCM_REGISTRATION_CALLBACK"><CODE>INTENT_FROM_GCM_REGISTRATION_CALLBACK</CODE></A> to indicate
+ that the application has been unregistered.
+<P>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../../constant-values.html#com.google.android.gcm.GCMConstants.EXTRA_UNREGISTERED">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="EXTRA_ERROR"><!-- --></A><H3>
+EXTRA_ERROR</H3>
+<PRE>
+public static final java.lang.String <B>EXTRA_ERROR</B></PRE>
+<DL>
+<DD>Extra used on <A HREF="../../../../com/google/android/gcm/GCMConstants.html#INTENT_FROM_GCM_REGISTRATION_CALLBACK"><CODE>INTENT_FROM_GCM_REGISTRATION_CALLBACK</CODE></A> to indicate
+ an error when the registration fails. See constants starting with ERROR_
+ for possible values.
+<P>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../../constant-values.html#com.google.android.gcm.GCMConstants.EXTRA_ERROR">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="EXTRA_REGISTRATION_ID"><!-- --></A><H3>
+EXTRA_REGISTRATION_ID</H3>
+<PRE>
+public static final java.lang.String <B>EXTRA_REGISTRATION_ID</B></PRE>
+<DL>
+<DD>Extra used on <A HREF="../../../../com/google/android/gcm/GCMConstants.html#INTENT_FROM_GCM_REGISTRATION_CALLBACK"><CODE>INTENT_FROM_GCM_REGISTRATION_CALLBACK</CODE></A> to indicate
+ the registration id when the registration succeeds.
+<P>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../../constant-values.html#com.google.android.gcm.GCMConstants.EXTRA_REGISTRATION_ID">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="EXTRA_SPECIAL_MESSAGE"><!-- --></A><H3>
+EXTRA_SPECIAL_MESSAGE</H3>
+<PRE>
+public static final java.lang.String <B>EXTRA_SPECIAL_MESSAGE</B></PRE>
+<DL>
+<DD>Type of message present in the <A HREF="../../../../com/google/android/gcm/GCMConstants.html#INTENT_FROM_GCM_MESSAGE"><CODE>INTENT_FROM_GCM_MESSAGE</CODE></A> intent.
+ This extra is only set for special messages sent from GCM, not for
+ messages originated from the application.
+<P>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../../constant-values.html#com.google.android.gcm.GCMConstants.EXTRA_SPECIAL_MESSAGE">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="VALUE_DELETED_MESSAGES"><!-- --></A><H3>
+VALUE_DELETED_MESSAGES</H3>
+<PRE>
+public static final java.lang.String <B>VALUE_DELETED_MESSAGES</B></PRE>
+<DL>
+<DD>Special message indicating the server deleted the pending messages.
+<P>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../../constant-values.html#com.google.android.gcm.GCMConstants.VALUE_DELETED_MESSAGES">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="EXTRA_TOTAL_DELETED"><!-- --></A><H3>
+EXTRA_TOTAL_DELETED</H3>
+<PRE>
+public static final java.lang.String <B>EXTRA_TOTAL_DELETED</B></PRE>
+<DL>
+<DD>Number of messages deleted by the server because the device was idle.
+ Present only on messages of special type
+ <A HREF="../../../../com/google/android/gcm/GCMConstants.html#VALUE_DELETED_MESSAGES"><CODE>VALUE_DELETED_MESSAGES</CODE></A>
+<P>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../../constant-values.html#com.google.android.gcm.GCMConstants.EXTRA_TOTAL_DELETED">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="PERMISSION_GCM_INTENTS"><!-- --></A><H3>
+PERMISSION_GCM_INTENTS</H3>
+<PRE>
+public static final java.lang.String <B>PERMISSION_GCM_INTENTS</B></PRE>
+<DL>
+<DD>Permission necessary to receive GCM intents.
+<P>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../../constant-values.html#com.google.android.gcm.GCMConstants.PERMISSION_GCM_INTENTS">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="DEFAULT_INTENT_SERVICE_CLASS_NAME"><!-- --></A><H3>
+DEFAULT_INTENT_SERVICE_CLASS_NAME</H3>
+<PRE>
+public static final java.lang.String <B>DEFAULT_INTENT_SERVICE_CLASS_NAME</B></PRE>
+<DL>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../../com/google/android/gcm/GCMBroadcastReceiver.html" title="class in com.google.android.gcm"><CODE>GCMBroadcastReceiver</CODE></A>,
+<A HREF="../../../../constant-values.html#com.google.android.gcm.GCMConstants.DEFAULT_INTENT_SERVICE_CLASS_NAME">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="ERROR_SERVICE_NOT_AVAILABLE"><!-- --></A><H3>
+ERROR_SERVICE_NOT_AVAILABLE</H3>
+<PRE>
+public static final java.lang.String <B>ERROR_SERVICE_NOT_AVAILABLE</B></PRE>
+<DL>
+<DD>The device can't read the response, or there was a 500/503 from the
+ server that can be retried later. The application should use exponential
+ back off and retry.
+<P>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../../constant-values.html#com.google.android.gcm.GCMConstants.ERROR_SERVICE_NOT_AVAILABLE">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="ERROR_ACCOUNT_MISSING"><!-- --></A><H3>
+ERROR_ACCOUNT_MISSING</H3>
+<PRE>
+public static final java.lang.String <B>ERROR_ACCOUNT_MISSING</B></PRE>
+<DL>
+<DD>There is no Google account on the phone. The application should ask the
+ user to open the account manager and add a Google account.
+<P>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../../constant-values.html#com.google.android.gcm.GCMConstants.ERROR_ACCOUNT_MISSING">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="ERROR_AUTHENTICATION_FAILED"><!-- --></A><H3>
+ERROR_AUTHENTICATION_FAILED</H3>
+<PRE>
+public static final java.lang.String <B>ERROR_AUTHENTICATION_FAILED</B></PRE>
+<DL>
+<DD>Bad password. The application should ask the user to enter his/her
+ password, and let user retry manually later. Fix on the device side.
+<P>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../../constant-values.html#com.google.android.gcm.GCMConstants.ERROR_AUTHENTICATION_FAILED">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="ERROR_INVALID_PARAMETERS"><!-- --></A><H3>
+ERROR_INVALID_PARAMETERS</H3>
+<PRE>
+public static final java.lang.String <B>ERROR_INVALID_PARAMETERS</B></PRE>
+<DL>
+<DD>The request sent by the phone does not contain the expected parameters.
+ This phone doesn't currently support GCM.
+<P>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../../constant-values.html#com.google.android.gcm.GCMConstants.ERROR_INVALID_PARAMETERS">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="ERROR_INVALID_SENDER"><!-- --></A><H3>
+ERROR_INVALID_SENDER</H3>
+<PRE>
+public static final java.lang.String <B>ERROR_INVALID_SENDER</B></PRE>
+<DL>
+<DD>The sender account is not recognized. Fix on the device side.
+<P>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../../constant-values.html#com.google.android.gcm.GCMConstants.ERROR_INVALID_SENDER">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="ERROR_PHONE_REGISTRATION_ERROR"><!-- --></A><H3>
+ERROR_PHONE_REGISTRATION_ERROR</H3>
+<PRE>
+public static final java.lang.String <B>ERROR_PHONE_REGISTRATION_ERROR</B></PRE>
+<DL>
+<DD>Incorrect phone registration with Google. This phone doesn't currently
+ support GCM.
+<P>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../../constant-values.html#com.google.android.gcm.GCMConstants.ERROR_PHONE_REGISTRATION_ERROR">Constant Field Values</A></DL>
+</DL>
+<!-- ========= END OF CLASS DATA ========= -->
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../com/google/android/gcm/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../com/google/android/gcm/GCMBroadcastReceiver.html" title="class in com.google.android.gcm"><B>PREV CLASS</B></A>
+ <A HREF="../../../../com/google/android/gcm/GCMRegistrar.html" title="class in com.google.android.gcm"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../index.html?com/google/android/gcm/GCMConstants.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="GCMConstants.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+ SUMMARY: NESTED | <A HREF="#field_summary">FIELD</A> | CONSTR | <A HREF="#methods_inherited_from_class_java.lang.Object">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: <A HREF="#field_detail">FIELD</A> | CONSTR | METHOD</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+
+</BODY>
+</HTML>
diff --git a/docs/html/guide/google/gcm/client-javadoc/com/google/android/gcm/GCMRegistrar.html b/docs/html/guide/google/gcm/client-javadoc/com/google/android/gcm/GCMRegistrar.html
new file mode 100644
index 0000000..a933bc6
--- /dev/null
+++ b/docs/html/guide/google/gcm/client-javadoc/com/google/android/gcm/GCMRegistrar.html
@@ -0,0 +1,445 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_20) on Thu Jun 21 12:06:25 PDT 2012 -->
+<TITLE>
+GCMRegistrar
+</TITLE>
+
+<META NAME="date" CONTENT="2012-06-21">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+ if (location.href.indexOf('is-external=true') == -1) {
+ parent.document.title="GCMRegistrar";
+ }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../com/google/android/gcm/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../com/google/android/gcm/GCMConstants.html" title="class in com.google.android.gcm"><B>PREV CLASS</B></A>
+ NEXT CLASS</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../index.html?com/google/android/gcm/GCMRegistrar.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="GCMRegistrar.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+ SUMMARY: NESTED | FIELD | CONSTR | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: FIELD | CONSTR | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<!-- ======== START OF CLASS DATA ======== -->
+<H2>
+<FONT SIZE="-1">
+com.google.android.gcm</FONT>
+<BR>
+Class GCMRegistrar</H2>
+<PRE>
+java.lang.Object
+ <IMG SRC="../../../../resources/inherit.gif" ALT="extended by "><B>com.google.android.gcm.GCMRegistrar</B>
+</PRE>
+<HR>
+<DL>
+<DT><PRE>public final class <B>GCMRegistrar</B><DT>extends java.lang.Object</DL>
+</PRE>
+
+<P>
+Utilities for device registration.
+ <p>
+ <strong>Note:</strong> this class uses a private <CODE>SharedPreferences</CODE>
+ object to keep track of the registration token.
+<P>
+
+<P>
+<HR>
+
+<P>
+
+<!-- ========== METHOD SUMMARY =========== -->
+
+<A NAME="method_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Method Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../com/google/android/gcm/GCMRegistrar.html#checkDevice(Context)">checkDevice</A></B>(Context context)</CODE>
+
+<BR>
+ Checks if the device has the proper dependencies installed.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../com/google/android/gcm/GCMRegistrar.html#checkManifest(Context)">checkManifest</A></B>(Context context)</CODE>
+
+<BR>
+ Checks that the application manifest is properly configured.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../com/google/android/gcm/GCMRegistrar.html#getRegistrationId(Context)">getRegistrationId</A></B>(Context context)</CODE>
+
+<BR>
+ Gets the current registration id for application on GCM service.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static boolean</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../com/google/android/gcm/GCMRegistrar.html#isRegistered(Context)">isRegistered</A></B>(Context context)</CODE>
+
+<BR>
+ Checks whether the application was successfully registered on GCM
+ service.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static boolean</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../com/google/android/gcm/GCMRegistrar.html#isRegisteredOnServer(Context)">isRegisteredOnServer</A></B>(Context context)</CODE>
+
+<BR>
+ Checks whether the device was successfully registered in the server side.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../com/google/android/gcm/GCMRegistrar.html#onDestroy(Context)">onDestroy</A></B>(Context context)</CODE>
+
+<BR>
+ Clear internal resources.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../com/google/android/gcm/GCMRegistrar.html#register(Context, java.lang.String...)">register</A></B>(Context context,
+ java.lang.String... senderIds)</CODE>
+
+<BR>
+ Initiate messaging registration for the current application.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../com/google/android/gcm/GCMRegistrar.html#setRegisteredOnServer(Context, boolean)">setRegisteredOnServer</A></B>(Context context,
+ boolean flag)</CODE>
+
+<BR>
+ Sets whether the device was successfully registered in the server side.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../com/google/android/gcm/GCMRegistrar.html#unregister(Context)">unregister</A></B>(Context context)</CODE>
+
+<BR>
+ Unregister the application.</TD>
+</TR>
+</TABLE>
+ <A NAME="methods_inherited_from_class_java.lang.Object"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left"><B>Methods inherited from class java.lang.Object</B></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE>clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait</CODE></TD>
+</TR>
+</TABLE>
+
+<P>
+
+<!-- ============ METHOD DETAIL ========== -->
+
+<A NAME="method_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Method Detail</B></FONT></TH>
+</TR>
+</TABLE>
+
+<A NAME="checkDevice(Context)"><!-- --></A><H3>
+checkDevice</H3>
+<PRE>
+public static void <B>checkDevice</B>(Context context)</PRE>
+<DL>
+<DD>Checks if the device has the proper dependencies installed.
+ <p>
+ This method should be called when the application starts to verify that
+ the device supports GCM.
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>context</CODE> - application context.
+<DT><B>Throws:</B>
+<DD><CODE>java.lang.UnsupportedOperationException</CODE> - if the device does not support GCM.</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="checkManifest(Context)"><!-- --></A><H3>
+checkManifest</H3>
+<PRE>
+public static void <B>checkManifest</B>(Context context)</PRE>
+<DL>
+<DD>Checks that the application manifest is properly configured.
+ <p>
+ A proper configuration means:
+ <ol>
+ <li>It creates a custom permission called
+ <code>PACKAGE_NAME.permission.C2D_MESSAGE</code>.
+ <li>It defines at least one <CODE>BroadcastReceiver</CODE> with category
+ <code>PACKAGE_NAME</code>.
+ <li>The <CODE>BroadcastReceiver</CODE>(s) uses the
+ permission.
+ <li>The <CODE>BroadcastReceiver</CODE>(s) handles the 3 GCM intents
+ (,
+ ,
+ and ).
+ </ol>
+ ...where <code>PACKAGE_NAME</code> is the application package.
+ <p>
+ This method should be used during development time to verify that the
+ manifest is properly set up, but it doesn't need to be called once the
+ application is deployed to the users' devices.
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>context</CODE> - application context.
+<DT><B>Throws:</B>
+<DD><CODE>java.lang.IllegalStateException</CODE> - if any of the conditions above is not met.</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="register(Context, java.lang.String...)"><!-- --></A><H3>
+register</H3>
+<PRE>
+public static void <B>register</B>(Context context,
+ java.lang.String... senderIds)</PRE>
+<DL>
+<DD>Initiate messaging registration for the current application.
+ <p>
+ The result will be returned as an
+ <A HREF="../../../../com/google/android/gcm/GCMConstants.html#INTENT_FROM_GCM_REGISTRATION_CALLBACK"><CODE>GCMConstants.INTENT_FROM_GCM_REGISTRATION_CALLBACK</CODE></A> intent with
+ either a <A HREF="../../../../com/google/android/gcm/GCMConstants.html#EXTRA_REGISTRATION_ID"><CODE>GCMConstants.EXTRA_REGISTRATION_ID</CODE></A> or
+ <A HREF="../../../../com/google/android/gcm/GCMConstants.html#EXTRA_ERROR"><CODE>GCMConstants.EXTRA_ERROR</CODE></A>.
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>context</CODE> - application context.<DD><CODE>senderIds</CODE> - Google Project ID of the accounts authorized to send
+ messages to this application.
+<DT><B>Throws:</B>
+<DD><CODE>java.lang.IllegalStateException</CODE> - if device does not have all GCM
+ dependencies installed.</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="unregister(Context)"><!-- --></A><H3>
+unregister</H3>
+<PRE>
+public static void <B>unregister</B>(Context context)</PRE>
+<DL>
+<DD>Unregister the application.
+ <p>
+ The result will be returned as an
+ <A HREF="../../../../com/google/android/gcm/GCMConstants.html#INTENT_FROM_GCM_REGISTRATION_CALLBACK"><CODE>GCMConstants.INTENT_FROM_GCM_REGISTRATION_CALLBACK</CODE></A> intent with an
+ <A HREF="../../../../com/google/android/gcm/GCMConstants.html#EXTRA_UNREGISTERED"><CODE>GCMConstants.EXTRA_UNREGISTERED</CODE></A> extra.
+<P>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="onDestroy(Context)"><!-- --></A><H3>
+onDestroy</H3>
+<PRE>
+public static void <B>onDestroy</B>(Context context)</PRE>
+<DL>
+<DD>Clear internal resources.
+
+ <p>
+ This method should be called by the main activity's <code>onDestroy()</code>
+ method.
+<P>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="getRegistrationId(Context)"><!-- --></A><H3>
+getRegistrationId</H3>
+<PRE>
+public static java.lang.String <B>getRegistrationId</B>(Context context)</PRE>
+<DL>
+<DD>Gets the current registration id for application on GCM service.
+ <p>
+ If result is empty, the registration has failed.
+<P>
+<DD><DL>
+
+<DT><B>Returns:</B><DD>registration id, or empty string if the registration is not
+ complete.</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="isRegistered(Context)"><!-- --></A><H3>
+isRegistered</H3>
+<PRE>
+public static boolean <B>isRegistered</B>(Context context)</PRE>
+<DL>
+<DD>Checks whether the application was successfully registered on GCM
+ service.
+<P>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="setRegisteredOnServer(Context, boolean)"><!-- --></A><H3>
+setRegisteredOnServer</H3>
+<PRE>
+public static void <B>setRegisteredOnServer</B>(Context context,
+ boolean flag)</PRE>
+<DL>
+<DD>Sets whether the device was successfully registered in the server side.
+<P>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="isRegisteredOnServer(Context)"><!-- --></A><H3>
+isRegisteredOnServer</H3>
+<PRE>
+public static boolean <B>isRegisteredOnServer</B>(Context context)</PRE>
+<DL>
+<DD>Checks whether the device was successfully registered in the server side.
+<P>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<!-- ========= END OF CLASS DATA ========= -->
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../com/google/android/gcm/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../com/google/android/gcm/GCMConstants.html" title="class in com.google.android.gcm"><B>PREV CLASS</B></A>
+ NEXT CLASS</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../index.html?com/google/android/gcm/GCMRegistrar.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="GCMRegistrar.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+ SUMMARY: NESTED | FIELD | CONSTR | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: FIELD | CONSTR | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+
+</BODY>
+</HTML>
diff --git a/docs/html/guide/google/gcm/client-javadoc/com/google/android/gcm/package-frame.html b/docs/html/guide/google/gcm/client-javadoc/com/google/android/gcm/package-frame.html
new file mode 100644
index 0000000..9dc665f
--- /dev/null
+++ b/docs/html/guide/google/gcm/client-javadoc/com/google/android/gcm/package-frame.html
@@ -0,0 +1,38 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_20) on Thu Jun 21 12:06:25 PDT 2012 -->
+<TITLE>
+com.google.android.gcm
+</TITLE>
+
+<META NAME="date" CONTENT="2012-06-21">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
+
+
+</HEAD>
+
+<BODY BGCOLOR="white">
+<FONT size="+1" CLASS="FrameTitleFont">
+<A HREF="../../../../com/google/android/gcm/package-summary.html" target="classFrame">com.google.android.gcm</A></FONT>
+<TABLE BORDER="0" WIDTH="100%" SUMMARY="">
+<TR>
+<TD NOWRAP><FONT size="+1" CLASS="FrameHeadingFont">
+Classes</FONT>
+<FONT CLASS="FrameItemFont">
+<BR>
+<A HREF="GCMBaseIntentService.html" title="class in com.google.android.gcm" target="classFrame">GCMBaseIntentService</A>
+<BR>
+<A HREF="GCMBroadcastReceiver.html" title="class in com.google.android.gcm" target="classFrame">GCMBroadcastReceiver</A>
+<BR>
+<A HREF="GCMConstants.html" title="class in com.google.android.gcm" target="classFrame">GCMConstants</A>
+<BR>
+<A HREF="GCMRegistrar.html" title="class in com.google.android.gcm" target="classFrame">GCMRegistrar</A></FONT></TD>
+</TR>
+</TABLE>
+
+
+</BODY>
+</HTML>
diff --git a/docs/html/guide/google/gcm/client-javadoc/com/google/android/gcm/package-summary.html b/docs/html/guide/google/gcm/client-javadoc/com/google/android/gcm/package-summary.html
new file mode 100644
index 0000000..2b15b81
--- /dev/null
+++ b/docs/html/guide/google/gcm/client-javadoc/com/google/android/gcm/package-summary.html
@@ -0,0 +1,167 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_20) on Thu Jun 21 12:06:25 PDT 2012 -->
+<TITLE>
+com.google.android.gcm
+</TITLE>
+
+<META NAME="date" CONTENT="2012-06-21">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+ if (location.href.indexOf('is-external=true') == -1) {
+ parent.document.title="com.google.android.gcm";
+ }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../com/google/android/gcm/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV PACKAGE
+ NEXT PACKAGE</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../index.html?com/google/android/gcm/package-summary.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="package-summary.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<H2>
+Package com.google.android.gcm
+</H2>
+
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Class Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD WIDTH="15%"><B><A HREF="../../../../com/google/android/gcm/GCMBaseIntentService.html" title="class in com.google.android.gcm">GCMBaseIntentService</A></B></TD>
+<TD>Skeleton for application-specific <CODE>IntentService</CODE>s responsible for
+ handling communication from Google Cloud Messaging service.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD WIDTH="15%"><B><A HREF="../../../../com/google/android/gcm/GCMBroadcastReceiver.html" title="class in com.google.android.gcm">GCMBroadcastReceiver</A></B></TD>
+<TD><CODE>BroadcastReceiver</CODE> that receives GCM messages and delivers them to
+ an application-specific <A HREF="../../../../com/google/android/gcm/GCMBaseIntentService.html" title="class in com.google.android.gcm"><CODE>GCMBaseIntentService</CODE></A> subclass.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD WIDTH="15%"><B><A HREF="../../../../com/google/android/gcm/GCMConstants.html" title="class in com.google.android.gcm">GCMConstants</A></B></TD>
+<TD>Constants used by the GCM library.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD WIDTH="15%"><B><A HREF="../../../../com/google/android/gcm/GCMRegistrar.html" title="class in com.google.android.gcm">GCMRegistrar</A></B></TD>
+<TD>Utilities for device registration.</TD>
+</TR>
+</TABLE>
+
+
+<P>
+<DL>
+</DL>
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../com/google/android/gcm/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV PACKAGE
+ NEXT PACKAGE</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../index.html?com/google/android/gcm/package-summary.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="package-summary.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+
+</BODY>
+</HTML>
diff --git a/docs/html/guide/google/gcm/client-javadoc/com/google/android/gcm/package-tree.html b/docs/html/guide/google/gcm/client-javadoc/com/google/android/gcm/package-tree.html
new file mode 100644
index 0000000..f36a8a69
--- /dev/null
+++ b/docs/html/guide/google/gcm/client-javadoc/com/google/android/gcm/package-tree.html
@@ -0,0 +1,150 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_20) on Thu Jun 21 12:06:25 PDT 2012 -->
+<TITLE>
+com.google.android.gcm Class Hierarchy
+</TITLE>
+
+<META NAME="date" CONTENT="2012-06-21">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+ if (location.href.indexOf('is-external=true') == -1) {
+ parent.document.title="com.google.android.gcm Class Hierarchy";
+ }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../com/google/android/gcm/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Tree</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../index.html?com/google/android/gcm/package-tree.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="package-tree.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<CENTER>
+<H2>
+Hierarchy For Package com.google.android.gcm
+</H2>
+</CENTER>
+<H2>
+Class Hierarchy
+</H2>
+<UL>
+<LI TYPE="circle">java.lang.Object<UL>
+<LI TYPE="circle">BroadcastReceiver<UL>
+<LI TYPE="circle">com.google.android.gcm.<A HREF="../../../../com/google/android/gcm/GCMBroadcastReceiver.html" title="class in com.google.android.gcm"><B>GCMBroadcastReceiver</B></A></UL>
+<LI TYPE="circle">com.google.android.gcm.<A HREF="../../../../com/google/android/gcm/GCMConstants.html" title="class in com.google.android.gcm"><B>GCMConstants</B></A><LI TYPE="circle">com.google.android.gcm.<A HREF="../../../../com/google/android/gcm/GCMRegistrar.html" title="class in com.google.android.gcm"><B>GCMRegistrar</B></A><LI TYPE="circle">IntentService<UL>
+<LI TYPE="circle">com.google.android.gcm.<A HREF="../../../../com/google/android/gcm/GCMBaseIntentService.html" title="class in com.google.android.gcm"><B>GCMBaseIntentService</B></A></UL>
+</UL>
+</UL>
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../com/google/android/gcm/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Tree</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../index.html?com/google/android/gcm/package-tree.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="package-tree.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+
+</BODY>
+</HTML>
diff --git a/docs/html/guide/google/gcm/client-javadoc/constant-values.html b/docs/html/guide/google/gcm/client-javadoc/constant-values.html
new file mode 100644
index 0000000..171c6a1
--- /dev/null
+++ b/docs/html/guide/google/gcm/client-javadoc/constant-values.html
@@ -0,0 +1,308 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_20) on Thu Jun 21 12:06:25 PDT 2012 -->
+<TITLE>
+Constant Field Values
+</TITLE>
+
+<META NAME="date" CONTENT="2012-06-21">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+ if (location.href.indexOf('is-external=true') == -1) {
+ parent.document.title="Constant Field Values";
+ }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="com/google/android/gcm/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html?constant-values.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="constant-values.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<CENTER>
+<H1>
+Constant Field Values</H1>
+</CENTER>
+<HR SIZE="4" NOSHADE>
+<B>Contents</B><UL>
+<LI><A HREF="#com.google">com.google.*</A>
+</UL>
+
+<A NAME="com.google"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left"><FONT SIZE="+2">
+com.google.*</FONT></TH>
+</TR>
+</TABLE>
+
+<P>
+
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left" COLSPAN="3">com.google.android.gcm.<A HREF="com/google/android/gcm/GCMBaseIntentService.html" title="class in com.google.android.gcm">GCMBaseIntentService</A></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="com.google.android.gcm.GCMBaseIntentService.TAG"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final java.lang.String</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="com/google/android/gcm/GCMBaseIntentService.html#TAG">TAG</A></CODE></TD>
+<TD ALIGN="right"><CODE>"GCMBaseIntentService"</CODE></TD>
+</TR>
+</FONT></TD>
+</TR>
+</TABLE>
+
+<P>
+
+<P>
+
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left" COLSPAN="3">com.google.android.gcm.<A HREF="com/google/android/gcm/GCMConstants.html" title="class in com.google.android.gcm">GCMConstants</A></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="com.google.android.gcm.GCMConstants.DEFAULT_INTENT_SERVICE_CLASS_NAME"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final java.lang.String</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="com/google/android/gcm/GCMConstants.html#DEFAULT_INTENT_SERVICE_CLASS_NAME">DEFAULT_INTENT_SERVICE_CLASS_NAME</A></CODE></TD>
+<TD ALIGN="right"><CODE>".GCMIntentService"</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="com.google.android.gcm.GCMConstants.ERROR_ACCOUNT_MISSING"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final java.lang.String</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="com/google/android/gcm/GCMConstants.html#ERROR_ACCOUNT_MISSING">ERROR_ACCOUNT_MISSING</A></CODE></TD>
+<TD ALIGN="right"><CODE>"ACCOUNT_MISSING"</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="com.google.android.gcm.GCMConstants.ERROR_AUTHENTICATION_FAILED"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final java.lang.String</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="com/google/android/gcm/GCMConstants.html#ERROR_AUTHENTICATION_FAILED">ERROR_AUTHENTICATION_FAILED</A></CODE></TD>
+<TD ALIGN="right"><CODE>"AUTHENTICATION_FAILED"</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="com.google.android.gcm.GCMConstants.ERROR_INVALID_PARAMETERS"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final java.lang.String</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="com/google/android/gcm/GCMConstants.html#ERROR_INVALID_PARAMETERS">ERROR_INVALID_PARAMETERS</A></CODE></TD>
+<TD ALIGN="right"><CODE>"INVALID_PARAMETERS"</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="com.google.android.gcm.GCMConstants.ERROR_INVALID_SENDER"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final java.lang.String</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="com/google/android/gcm/GCMConstants.html#ERROR_INVALID_SENDER">ERROR_INVALID_SENDER</A></CODE></TD>
+<TD ALIGN="right"><CODE>"INVALID_SENDER"</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="com.google.android.gcm.GCMConstants.ERROR_PHONE_REGISTRATION_ERROR"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final java.lang.String</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="com/google/android/gcm/GCMConstants.html#ERROR_PHONE_REGISTRATION_ERROR">ERROR_PHONE_REGISTRATION_ERROR</A></CODE></TD>
+<TD ALIGN="right"><CODE>"PHONE_REGISTRATION_ERROR"</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="com.google.android.gcm.GCMConstants.ERROR_SERVICE_NOT_AVAILABLE"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final java.lang.String</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="com/google/android/gcm/GCMConstants.html#ERROR_SERVICE_NOT_AVAILABLE">ERROR_SERVICE_NOT_AVAILABLE</A></CODE></TD>
+<TD ALIGN="right"><CODE>"SERVICE_NOT_AVAILABLE"</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="com.google.android.gcm.GCMConstants.EXTRA_APPLICATION_PENDING_INTENT"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final java.lang.String</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="com/google/android/gcm/GCMConstants.html#EXTRA_APPLICATION_PENDING_INTENT">EXTRA_APPLICATION_PENDING_INTENT</A></CODE></TD>
+<TD ALIGN="right"><CODE>"app"</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="com.google.android.gcm.GCMConstants.EXTRA_ERROR"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final java.lang.String</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="com/google/android/gcm/GCMConstants.html#EXTRA_ERROR">EXTRA_ERROR</A></CODE></TD>
+<TD ALIGN="right"><CODE>"error"</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="com.google.android.gcm.GCMConstants.EXTRA_REGISTRATION_ID"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final java.lang.String</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="com/google/android/gcm/GCMConstants.html#EXTRA_REGISTRATION_ID">EXTRA_REGISTRATION_ID</A></CODE></TD>
+<TD ALIGN="right"><CODE>"registration_id"</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="com.google.android.gcm.GCMConstants.EXTRA_SENDER"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final java.lang.String</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="com/google/android/gcm/GCMConstants.html#EXTRA_SENDER">EXTRA_SENDER</A></CODE></TD>
+<TD ALIGN="right"><CODE>"sender"</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="com.google.android.gcm.GCMConstants.EXTRA_SPECIAL_MESSAGE"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final java.lang.String</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="com/google/android/gcm/GCMConstants.html#EXTRA_SPECIAL_MESSAGE">EXTRA_SPECIAL_MESSAGE</A></CODE></TD>
+<TD ALIGN="right"><CODE>"message_type"</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="com.google.android.gcm.GCMConstants.EXTRA_TOTAL_DELETED"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final java.lang.String</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="com/google/android/gcm/GCMConstants.html#EXTRA_TOTAL_DELETED">EXTRA_TOTAL_DELETED</A></CODE></TD>
+<TD ALIGN="right"><CODE>"total_deleted"</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="com.google.android.gcm.GCMConstants.EXTRA_UNREGISTERED"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final java.lang.String</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="com/google/android/gcm/GCMConstants.html#EXTRA_UNREGISTERED">EXTRA_UNREGISTERED</A></CODE></TD>
+<TD ALIGN="right"><CODE>"unregistered"</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="com.google.android.gcm.GCMConstants.INTENT_FROM_GCM_LIBRARY_RETRY"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final java.lang.String</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="com/google/android/gcm/GCMConstants.html#INTENT_FROM_GCM_LIBRARY_RETRY">INTENT_FROM_GCM_LIBRARY_RETRY</A></CODE></TD>
+<TD ALIGN="right"><CODE>"com.google.android.gcm.intent.RETRY"</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="com.google.android.gcm.GCMConstants.INTENT_FROM_GCM_MESSAGE"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final java.lang.String</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="com/google/android/gcm/GCMConstants.html#INTENT_FROM_GCM_MESSAGE">INTENT_FROM_GCM_MESSAGE</A></CODE></TD>
+<TD ALIGN="right"><CODE>"com.google.android.c2dm.intent.RECEIVE"</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="com.google.android.gcm.GCMConstants.INTENT_FROM_GCM_REGISTRATION_CALLBACK"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final java.lang.String</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="com/google/android/gcm/GCMConstants.html#INTENT_FROM_GCM_REGISTRATION_CALLBACK">INTENT_FROM_GCM_REGISTRATION_CALLBACK</A></CODE></TD>
+<TD ALIGN="right"><CODE>"com.google.android.c2dm.intent.REGISTRATION"</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="com.google.android.gcm.GCMConstants.INTENT_TO_GCM_REGISTRATION"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final java.lang.String</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="com/google/android/gcm/GCMConstants.html#INTENT_TO_GCM_REGISTRATION">INTENT_TO_GCM_REGISTRATION</A></CODE></TD>
+<TD ALIGN="right"><CODE>"com.google.android.c2dm.intent.REGISTER"</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="com.google.android.gcm.GCMConstants.INTENT_TO_GCM_UNREGISTRATION"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final java.lang.String</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="com/google/android/gcm/GCMConstants.html#INTENT_TO_GCM_UNREGISTRATION">INTENT_TO_GCM_UNREGISTRATION</A></CODE></TD>
+<TD ALIGN="right"><CODE>"com.google.android.c2dm.intent.UNREGISTER"</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="com.google.android.gcm.GCMConstants.PERMISSION_GCM_INTENTS"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final java.lang.String</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="com/google/android/gcm/GCMConstants.html#PERMISSION_GCM_INTENTS">PERMISSION_GCM_INTENTS</A></CODE></TD>
+<TD ALIGN="right"><CODE>"com.google.android.c2dm.permission.SEND"</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="com.google.android.gcm.GCMConstants.VALUE_DELETED_MESSAGES"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final java.lang.String</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="com/google/android/gcm/GCMConstants.html#VALUE_DELETED_MESSAGES">VALUE_DELETED_MESSAGES</A></CODE></TD>
+<TD ALIGN="right"><CODE>"deleted_messages"</CODE></TD>
+</TR>
+</FONT></TD>
+</TR>
+</TABLE>
+
+<P>
+
+<P>
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="com/google/android/gcm/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html?constant-values.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="constant-values.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+
+</BODY>
+</HTML>
diff --git a/docs/html/guide/google/gcm/client-javadoc/deprecated-list.html b/docs/html/guide/google/gcm/client-javadoc/deprecated-list.html
new file mode 100644
index 0000000..ebdcc26
--- /dev/null
+++ b/docs/html/guide/google/gcm/client-javadoc/deprecated-list.html
@@ -0,0 +1,142 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_20) on Thu Jun 21 12:06:25 PDT 2012 -->
+<TITLE>
+Deprecated List
+</TITLE>
+
+<META NAME="date" CONTENT="2012-06-21">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+ if (location.href.indexOf('is-external=true') == -1) {
+ parent.document.title="Deprecated List";
+ }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="com/google/android/gcm/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Deprecated</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html?deprecated-list.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="deprecated-list.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<CENTER>
+<H2>
+<B>Deprecated API</B></H2>
+</CENTER>
+<HR SIZE="4" NOSHADE>
+<B>Contents</B><UL>
+</UL>
+
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="com/google/android/gcm/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Deprecated</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html?deprecated-list.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="deprecated-list.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+
+</BODY>
+</HTML>
diff --git a/docs/html/guide/google/gcm/client-javadoc/help-doc.html b/docs/html/guide/google/gcm/client-javadoc/help-doc.html
new file mode 100644
index 0000000..0dc47eb
--- /dev/null
+++ b/docs/html/guide/google/gcm/client-javadoc/help-doc.html
@@ -0,0 +1,209 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_20) on Thu Jun 21 12:06:25 PDT 2012 -->
+<TITLE>
+API Help
+</TITLE>
+
+<META NAME="date" CONTENT="2012-06-21">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+ if (location.href.indexOf('is-external=true') == -1) {
+ parent.document.title="API Help";
+ }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="com/google/android/gcm/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Help</B></FONT> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html?help-doc.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="help-doc.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<CENTER>
+<H1>
+How This API Document Is Organized</H1>
+</CENTER>
+This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.<H3>
+Package</H3>
+<BLOCKQUOTE>
+
+<P>
+Each package has a page that contains a list of its classes and interfaces, with a summary for each. This page can contain four categories:<UL>
+<LI>Interfaces (italic)<LI>Classes<LI>Enums<LI>Exceptions<LI>Errors<LI>Annotation Types</UL>
+</BLOCKQUOTE>
+<H3>
+Class/Interface</H3>
+<BLOCKQUOTE>
+
+<P>
+Each class, interface, nested class and nested interface has its own separate page. Each of these pages has three sections consisting of a class/interface description, summary tables, and detailed member descriptions:<UL>
+<LI>Class inheritance diagram<LI>Direct Subclasses<LI>All Known Subinterfaces<LI>All Known Implementing Classes<LI>Class/interface declaration<LI>Class/interface description
+<P>
+<LI>Nested Class Summary<LI>Field Summary<LI>Constructor Summary<LI>Method Summary
+<P>
+<LI>Field Detail<LI>Constructor Detail<LI>Method Detail</UL>
+Each summary entry contains the first sentence from the detailed description for that item. The summary entries are alphabetical, while the detailed descriptions are in the order they appear in the source code. This preserves the logical groupings established by the programmer.</BLOCKQUOTE>
+</BLOCKQUOTE>
+<H3>
+Annotation Type</H3>
+<BLOCKQUOTE>
+
+<P>
+Each annotation type has its own separate page with the following sections:<UL>
+<LI>Annotation Type declaration<LI>Annotation Type description<LI>Required Element Summary<LI>Optional Element Summary<LI>Element Detail</UL>
+</BLOCKQUOTE>
+</BLOCKQUOTE>
+<H3>
+Enum</H3>
+<BLOCKQUOTE>
+
+<P>
+Each enum has its own separate page with the following sections:<UL>
+<LI>Enum declaration<LI>Enum description<LI>Enum Constant Summary<LI>Enum Constant Detail</UL>
+</BLOCKQUOTE>
+<H3>
+Tree (Class Hierarchy)</H3>
+<BLOCKQUOTE>
+There is a <A HREF="overview-tree.html">Class Hierarchy</A> page for all packages, plus a hierarchy for each package. Each hierarchy page contains a list of classes and a list of interfaces. The classes are organized by inheritance structure starting with <code>java.lang.Object</code>. The interfaces do not inherit from <code>java.lang.Object</code>.<UL>
+<LI>When viewing the Overview page, clicking on "Tree" displays the hierarchy for all packages.<LI>When viewing a particular package, class or interface page, clicking "Tree" displays the hierarchy for only that package.</UL>
+</BLOCKQUOTE>
+<H3>
+Deprecated API</H3>
+<BLOCKQUOTE>
+The <A HREF="deprecated-list.html">Deprecated API</A> page lists all of the API that have been deprecated. A deprecated API is not recommended for use, generally due to improvements, and a replacement API is usually given. Deprecated APIs may be removed in future implementations.</BLOCKQUOTE>
+<H3>
+Index</H3>
+<BLOCKQUOTE>
+The <A HREF="index-all.html">Index</A> contains an alphabetic list of all classes, interfaces, constructors, methods, and fields.</BLOCKQUOTE>
+<H3>
+Prev/Next</H3>
+These links take you to the next or previous class, interface, package, or related page.<H3>
+Frames/No Frames</H3>
+These links show and hide the HTML frames. All pages are available with or without frames.
+<P>
+<H3>
+Serialized Form</H3>
+Each serializable or externalizable class has a description of its serialization fields and methods. This information is of interest to re-implementors, not to developers using the API. While there is no link in the navigation bar, you can get to this information by going to any serialized class and clicking "Serialized Form" in the "See also" section of the class description.
+<P>
+<H3>
+Constant Field Values</H3>
+The <a href="constant-values.html">Constant Field Values</a> page lists the static final fields and their values.
+<P>
+<FONT SIZE="-1">
+<EM>
+This help file applies to API documentation generated using the standard doclet.</EM>
+</FONT>
+<BR>
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="com/google/android/gcm/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Help</B></FONT> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html?help-doc.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="help-doc.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+
+</BODY>
+</HTML>
diff --git a/docs/html/guide/google/gcm/client-javadoc/index-all.html b/docs/html/guide/google/gcm/client-javadoc/index-all.html
new file mode 100644
index 0000000..43b8e4e
--- /dev/null
+++ b/docs/html/guide/google/gcm/client-javadoc/index-all.html
@@ -0,0 +1,331 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_20) on Thu Jun 21 12:06:25 PDT 2012 -->
+<TITLE>
+Index
+</TITLE>
+
+<META NAME="date" CONTENT="2012-06-21">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="./stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+ if (location.href.indexOf('is-external=true') == -1) {
+ parent.document.title="Index";
+ }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="./com/google/android/gcm/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="./overview-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="./deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Index</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="./help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="./index.html?index-all.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="index-all.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="./allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="./allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<A HREF="#_C_">C</A> <A HREF="#_D_">D</A> <A HREF="#_E_">E</A> <A HREF="#_G_">G</A> <A HREF="#_I_">I</A> <A HREF="#_O_">O</A> <A HREF="#_P_">P</A> <A HREF="#_R_">R</A> <A HREF="#_S_">S</A> <A HREF="#_T_">T</A> <A HREF="#_U_">U</A> <A HREF="#_V_">V</A> <HR>
+<A NAME="_C_"><!-- --></A><H2>
+<B>C</B></H2>
+<DL>
+<DT><A HREF="./com/google/android/gcm/GCMRegistrar.html#checkDevice(Context)"><B>checkDevice(Context)</B></A> -
+Static method in class com.google.android.gcm.<A HREF="./com/google/android/gcm/GCMRegistrar.html" title="class in com.google.android.gcm">GCMRegistrar</A>
+<DD>Checks if the device has the proper dependencies installed.
+<DT><A HREF="./com/google/android/gcm/GCMRegistrar.html#checkManifest(Context)"><B>checkManifest(Context)</B></A> -
+Static method in class com.google.android.gcm.<A HREF="./com/google/android/gcm/GCMRegistrar.html" title="class in com.google.android.gcm">GCMRegistrar</A>
+<DD>Checks that the application manifest is properly configured.
+<DT><A HREF="./com/google/android/gcm/package-summary.html"><B>com.google.android.gcm</B></A> - package com.google.android.gcm<DD> </DL>
+<HR>
+<A NAME="_D_"><!-- --></A><H2>
+<B>D</B></H2>
+<DL>
+<DT><A HREF="./com/google/android/gcm/GCMConstants.html#DEFAULT_INTENT_SERVICE_CLASS_NAME"><B>DEFAULT_INTENT_SERVICE_CLASS_NAME</B></A> -
+Static variable in class com.google.android.gcm.<A HREF="./com/google/android/gcm/GCMConstants.html" title="class in com.google.android.gcm">GCMConstants</A>
+<DD>
+</DL>
+<HR>
+<A NAME="_E_"><!-- --></A><H2>
+<B>E</B></H2>
+<DL>
+<DT><A HREF="./com/google/android/gcm/GCMConstants.html#ERROR_ACCOUNT_MISSING"><B>ERROR_ACCOUNT_MISSING</B></A> -
+Static variable in class com.google.android.gcm.<A HREF="./com/google/android/gcm/GCMConstants.html" title="class in com.google.android.gcm">GCMConstants</A>
+<DD>There is no Google account on the phone.
+<DT><A HREF="./com/google/android/gcm/GCMConstants.html#ERROR_AUTHENTICATION_FAILED"><B>ERROR_AUTHENTICATION_FAILED</B></A> -
+Static variable in class com.google.android.gcm.<A HREF="./com/google/android/gcm/GCMConstants.html" title="class in com.google.android.gcm">GCMConstants</A>
+<DD>Bad password.
+<DT><A HREF="./com/google/android/gcm/GCMConstants.html#ERROR_INVALID_PARAMETERS"><B>ERROR_INVALID_PARAMETERS</B></A> -
+Static variable in class com.google.android.gcm.<A HREF="./com/google/android/gcm/GCMConstants.html" title="class in com.google.android.gcm">GCMConstants</A>
+<DD>The request sent by the phone does not contain the expected parameters.
+<DT><A HREF="./com/google/android/gcm/GCMConstants.html#ERROR_INVALID_SENDER"><B>ERROR_INVALID_SENDER</B></A> -
+Static variable in class com.google.android.gcm.<A HREF="./com/google/android/gcm/GCMConstants.html" title="class in com.google.android.gcm">GCMConstants</A>
+<DD>The sender account is not recognized.
+<DT><A HREF="./com/google/android/gcm/GCMConstants.html#ERROR_PHONE_REGISTRATION_ERROR"><B>ERROR_PHONE_REGISTRATION_ERROR</B></A> -
+Static variable in class com.google.android.gcm.<A HREF="./com/google/android/gcm/GCMConstants.html" title="class in com.google.android.gcm">GCMConstants</A>
+<DD>Incorrect phone registration with Google.
+<DT><A HREF="./com/google/android/gcm/GCMConstants.html#ERROR_SERVICE_NOT_AVAILABLE"><B>ERROR_SERVICE_NOT_AVAILABLE</B></A> -
+Static variable in class com.google.android.gcm.<A HREF="./com/google/android/gcm/GCMConstants.html" title="class in com.google.android.gcm">GCMConstants</A>
+<DD>The device can't read the response, or there was a 500/503 from the
+ server that can be retried later.
+<DT><A HREF="./com/google/android/gcm/GCMConstants.html#EXTRA_APPLICATION_PENDING_INTENT"><B>EXTRA_APPLICATION_PENDING_INTENT</B></A> -
+Static variable in class com.google.android.gcm.<A HREF="./com/google/android/gcm/GCMConstants.html" title="class in com.google.android.gcm">GCMConstants</A>
+<DD>Extra used on <A HREF="./com/google/android/gcm/GCMConstants.html#INTENT_TO_GCM_REGISTRATION"><CODE>GCMConstants.INTENT_TO_GCM_REGISTRATION</CODE></A> to get the application
+ id.
+<DT><A HREF="./com/google/android/gcm/GCMConstants.html#EXTRA_ERROR"><B>EXTRA_ERROR</B></A> -
+Static variable in class com.google.android.gcm.<A HREF="./com/google/android/gcm/GCMConstants.html" title="class in com.google.android.gcm">GCMConstants</A>
+<DD>Extra used on <A HREF="./com/google/android/gcm/GCMConstants.html#INTENT_FROM_GCM_REGISTRATION_CALLBACK"><CODE>GCMConstants.INTENT_FROM_GCM_REGISTRATION_CALLBACK</CODE></A> to indicate
+ an error when the registration fails.
+<DT><A HREF="./com/google/android/gcm/GCMConstants.html#EXTRA_REGISTRATION_ID"><B>EXTRA_REGISTRATION_ID</B></A> -
+Static variable in class com.google.android.gcm.<A HREF="./com/google/android/gcm/GCMConstants.html" title="class in com.google.android.gcm">GCMConstants</A>
+<DD>Extra used on <A HREF="./com/google/android/gcm/GCMConstants.html#INTENT_FROM_GCM_REGISTRATION_CALLBACK"><CODE>GCMConstants.INTENT_FROM_GCM_REGISTRATION_CALLBACK</CODE></A> to indicate
+ the registration id when the registration succeeds.
+<DT><A HREF="./com/google/android/gcm/GCMConstants.html#EXTRA_SENDER"><B>EXTRA_SENDER</B></A> -
+Static variable in class com.google.android.gcm.<A HREF="./com/google/android/gcm/GCMConstants.html" title="class in com.google.android.gcm">GCMConstants</A>
+<DD>Extra used on <A HREF="./com/google/android/gcm/GCMConstants.html#INTENT_TO_GCM_REGISTRATION"><CODE>GCMConstants.INTENT_TO_GCM_REGISTRATION</CODE></A> to indicate the sender
+ account (a Google email) that owns the application.
+<DT><A HREF="./com/google/android/gcm/GCMConstants.html#EXTRA_SPECIAL_MESSAGE"><B>EXTRA_SPECIAL_MESSAGE</B></A> -
+Static variable in class com.google.android.gcm.<A HREF="./com/google/android/gcm/GCMConstants.html" title="class in com.google.android.gcm">GCMConstants</A>
+<DD>Type of message present in the <A HREF="./com/google/android/gcm/GCMConstants.html#INTENT_FROM_GCM_MESSAGE"><CODE>GCMConstants.INTENT_FROM_GCM_MESSAGE</CODE></A> intent.
+<DT><A HREF="./com/google/android/gcm/GCMConstants.html#EXTRA_TOTAL_DELETED"><B>EXTRA_TOTAL_DELETED</B></A> -
+Static variable in class com.google.android.gcm.<A HREF="./com/google/android/gcm/GCMConstants.html" title="class in com.google.android.gcm">GCMConstants</A>
+<DD>Number of messages deleted by the server because the device was idle.
+<DT><A HREF="./com/google/android/gcm/GCMConstants.html#EXTRA_UNREGISTERED"><B>EXTRA_UNREGISTERED</B></A> -
+Static variable in class com.google.android.gcm.<A HREF="./com/google/android/gcm/GCMConstants.html" title="class in com.google.android.gcm">GCMConstants</A>
+<DD>Extra used on <A HREF="./com/google/android/gcm/GCMConstants.html#INTENT_FROM_GCM_REGISTRATION_CALLBACK"><CODE>GCMConstants.INTENT_FROM_GCM_REGISTRATION_CALLBACK</CODE></A> to indicate
+ that the application has been unregistered.
+</DL>
+<HR>
+<A NAME="_G_"><!-- --></A><H2>
+<B>G</B></H2>
+<DL>
+<DT><A HREF="./com/google/android/gcm/GCMBaseIntentService.html" title="class in com.google.android.gcm"><B>GCMBaseIntentService</B></A> - Class in <A HREF="./com/google/android/gcm/package-summary.html">com.google.android.gcm</A><DD>Skeleton for application-specific <CODE>IntentService</CODE>s responsible for
+ handling communication from Google Cloud Messaging service.<DT><A HREF="./com/google/android/gcm/GCMBaseIntentService.html#GCMBaseIntentService(java.lang.String)"><B>GCMBaseIntentService(String)</B></A> -
+Constructor for class com.google.android.gcm.<A HREF="./com/google/android/gcm/GCMBaseIntentService.html" title="class in com.google.android.gcm">GCMBaseIntentService</A>
+<DD>Subclasses must create a public no-arg constructor and pass the
+ sender id to be used for registration.
+<DT><A HREF="./com/google/android/gcm/GCMBroadcastReceiver.html" title="class in com.google.android.gcm"><B>GCMBroadcastReceiver</B></A> - Class in <A HREF="./com/google/android/gcm/package-summary.html">com.google.android.gcm</A><DD><CODE>BroadcastReceiver</CODE> that receives GCM messages and delivers them to
+ an application-specific <A HREF="./com/google/android/gcm/GCMBaseIntentService.html" title="class in com.google.android.gcm"><CODE>GCMBaseIntentService</CODE></A> subclass.<DT><A HREF="./com/google/android/gcm/GCMBroadcastReceiver.html#GCMBroadcastReceiver()"><B>GCMBroadcastReceiver()</B></A> -
+Constructor for class com.google.android.gcm.<A HREF="./com/google/android/gcm/GCMBroadcastReceiver.html" title="class in com.google.android.gcm">GCMBroadcastReceiver</A>
+<DD>
+<DT><A HREF="./com/google/android/gcm/GCMConstants.html" title="class in com.google.android.gcm"><B>GCMConstants</B></A> - Class in <A HREF="./com/google/android/gcm/package-summary.html">com.google.android.gcm</A><DD>Constants used by the GCM library.<DT><A HREF="./com/google/android/gcm/GCMRegistrar.html" title="class in com.google.android.gcm"><B>GCMRegistrar</B></A> - Class in <A HREF="./com/google/android/gcm/package-summary.html">com.google.android.gcm</A><DD>Utilities for device registration.<DT><A HREF="./com/google/android/gcm/GCMBroadcastReceiver.html#getGCMIntentServiceClassName(Context)"><B>getGCMIntentServiceClassName(Context)</B></A> -
+Method in class com.google.android.gcm.<A HREF="./com/google/android/gcm/GCMBroadcastReceiver.html" title="class in com.google.android.gcm">GCMBroadcastReceiver</A>
+<DD>Gets the class name of the intent service that will handle GCM messages.
+<DT><A HREF="./com/google/android/gcm/GCMRegistrar.html#getRegistrationId(Context)"><B>getRegistrationId(Context)</B></A> -
+Static method in class com.google.android.gcm.<A HREF="./com/google/android/gcm/GCMRegistrar.html" title="class in com.google.android.gcm">GCMRegistrar</A>
+<DD>Gets the current registration id for application on GCM service.
+</DL>
+<HR>
+<A NAME="_I_"><!-- --></A><H2>
+<B>I</B></H2>
+<DL>
+<DT><A HREF="./com/google/android/gcm/GCMConstants.html#INTENT_FROM_GCM_LIBRARY_RETRY"><B>INTENT_FROM_GCM_LIBRARY_RETRY</B></A> -
+Static variable in class com.google.android.gcm.<A HREF="./com/google/android/gcm/GCMConstants.html" title="class in com.google.android.gcm">GCMConstants</A>
+<DD>Intent used by the GCM library to indicate that the registration call
+ should be retried.
+<DT><A HREF="./com/google/android/gcm/GCMConstants.html#INTENT_FROM_GCM_MESSAGE"><B>INTENT_FROM_GCM_MESSAGE</B></A> -
+Static variable in class com.google.android.gcm.<A HREF="./com/google/android/gcm/GCMConstants.html" title="class in com.google.android.gcm">GCMConstants</A>
+<DD>Intent sent by GCM containing a message.
+<DT><A HREF="./com/google/android/gcm/GCMConstants.html#INTENT_FROM_GCM_REGISTRATION_CALLBACK"><B>INTENT_FROM_GCM_REGISTRATION_CALLBACK</B></A> -
+Static variable in class com.google.android.gcm.<A HREF="./com/google/android/gcm/GCMConstants.html" title="class in com.google.android.gcm">GCMConstants</A>
+<DD>Intent sent by GCM indicating with the result of a registration request.
+<DT><A HREF="./com/google/android/gcm/GCMConstants.html#INTENT_TO_GCM_REGISTRATION"><B>INTENT_TO_GCM_REGISTRATION</B></A> -
+Static variable in class com.google.android.gcm.<A HREF="./com/google/android/gcm/GCMConstants.html" title="class in com.google.android.gcm">GCMConstants</A>
+<DD>Intent sent to GCM to register the application.
+<DT><A HREF="./com/google/android/gcm/GCMConstants.html#INTENT_TO_GCM_UNREGISTRATION"><B>INTENT_TO_GCM_UNREGISTRATION</B></A> -
+Static variable in class com.google.android.gcm.<A HREF="./com/google/android/gcm/GCMConstants.html" title="class in com.google.android.gcm">GCMConstants</A>
+<DD>Intent sent to GCM to unregister the application.
+<DT><A HREF="./com/google/android/gcm/GCMRegistrar.html#isRegistered(Context)"><B>isRegistered(Context)</B></A> -
+Static method in class com.google.android.gcm.<A HREF="./com/google/android/gcm/GCMRegistrar.html" title="class in com.google.android.gcm">GCMRegistrar</A>
+<DD>Checks whether the application was successfully registered on GCM
+ service.
+<DT><A HREF="./com/google/android/gcm/GCMRegistrar.html#isRegisteredOnServer(Context)"><B>isRegisteredOnServer(Context)</B></A> -
+Static method in class com.google.android.gcm.<A HREF="./com/google/android/gcm/GCMRegistrar.html" title="class in com.google.android.gcm">GCMRegistrar</A>
+<DD>Checks whether the device was successfully registered in the server side.
+</DL>
+<HR>
+<A NAME="_O_"><!-- --></A><H2>
+<B>O</B></H2>
+<DL>
+<DT><A HREF="./com/google/android/gcm/GCMBaseIntentService.html#onDeletedMessages(Context, int)"><B>onDeletedMessages(Context, int)</B></A> -
+Method in class com.google.android.gcm.<A HREF="./com/google/android/gcm/GCMBaseIntentService.html" title="class in com.google.android.gcm">GCMBaseIntentService</A>
+<DD>Called when the GCM server tells pending messages have been deleted
+ because the device was idle.
+<DT><A HREF="./com/google/android/gcm/GCMRegistrar.html#onDestroy(Context)"><B>onDestroy(Context)</B></A> -
+Static method in class com.google.android.gcm.<A HREF="./com/google/android/gcm/GCMRegistrar.html" title="class in com.google.android.gcm">GCMRegistrar</A>
+<DD>Clear internal resources.
+<DT><A HREF="./com/google/android/gcm/GCMBaseIntentService.html#onError(Context, java.lang.String)"><B>onError(Context, String)</B></A> -
+Method in class com.google.android.gcm.<A HREF="./com/google/android/gcm/GCMBaseIntentService.html" title="class in com.google.android.gcm">GCMBaseIntentService</A>
+<DD>Called on registration or unregistration error.
+<DT><A HREF="./com/google/android/gcm/GCMBaseIntentService.html#onHandleIntent(Intent)"><B>onHandleIntent(Intent)</B></A> -
+Method in class com.google.android.gcm.<A HREF="./com/google/android/gcm/GCMBaseIntentService.html" title="class in com.google.android.gcm">GCMBaseIntentService</A>
+<DD>
+<DT><A HREF="./com/google/android/gcm/GCMBaseIntentService.html#onMessage(Context, Intent)"><B>onMessage(Context, Intent)</B></A> -
+Method in class com.google.android.gcm.<A HREF="./com/google/android/gcm/GCMBaseIntentService.html" title="class in com.google.android.gcm">GCMBaseIntentService</A>
+<DD>Called when a cloud message has been received.
+<DT><A HREF="./com/google/android/gcm/GCMBroadcastReceiver.html#onReceive(Context, Intent)"><B>onReceive(Context, Intent)</B></A> -
+Method in class com.google.android.gcm.<A HREF="./com/google/android/gcm/GCMBroadcastReceiver.html" title="class in com.google.android.gcm">GCMBroadcastReceiver</A>
+<DD>
+<DT><A HREF="./com/google/android/gcm/GCMBaseIntentService.html#onRecoverableError(Context, java.lang.String)"><B>onRecoverableError(Context, String)</B></A> -
+Method in class com.google.android.gcm.<A HREF="./com/google/android/gcm/GCMBaseIntentService.html" title="class in com.google.android.gcm">GCMBaseIntentService</A>
+<DD>Called on a registration error that could be retried.
+<DT><A HREF="./com/google/android/gcm/GCMBaseIntentService.html#onRegistered(Context, java.lang.String)"><B>onRegistered(Context, String)</B></A> -
+Method in class com.google.android.gcm.<A HREF="./com/google/android/gcm/GCMBaseIntentService.html" title="class in com.google.android.gcm">GCMBaseIntentService</A>
+<DD>Called after a device has been registered.
+<DT><A HREF="./com/google/android/gcm/GCMBaseIntentService.html#onUnregistered(Context, java.lang.String)"><B>onUnregistered(Context, String)</B></A> -
+Method in class com.google.android.gcm.<A HREF="./com/google/android/gcm/GCMBaseIntentService.html" title="class in com.google.android.gcm">GCMBaseIntentService</A>
+<DD>Called after a device has been unregistered.
+</DL>
+<HR>
+<A NAME="_P_"><!-- --></A><H2>
+<B>P</B></H2>
+<DL>
+<DT><A HREF="./com/google/android/gcm/GCMConstants.html#PERMISSION_GCM_INTENTS"><B>PERMISSION_GCM_INTENTS</B></A> -
+Static variable in class com.google.android.gcm.<A HREF="./com/google/android/gcm/GCMConstants.html" title="class in com.google.android.gcm">GCMConstants</A>
+<DD>Permission necessary to receive GCM intents.
+</DL>
+<HR>
+<A NAME="_R_"><!-- --></A><H2>
+<B>R</B></H2>
+<DL>
+<DT><A HREF="./com/google/android/gcm/GCMRegistrar.html#register(Context, java.lang.String...)"><B>register(Context, String...)</B></A> -
+Static method in class com.google.android.gcm.<A HREF="./com/google/android/gcm/GCMRegistrar.html" title="class in com.google.android.gcm">GCMRegistrar</A>
+<DD>Initiate messaging registration for the current application.
+</DL>
+<HR>
+<A NAME="_S_"><!-- --></A><H2>
+<B>S</B></H2>
+<DL>
+<DT><A HREF="./com/google/android/gcm/GCMRegistrar.html#setRegisteredOnServer(Context, boolean)"><B>setRegisteredOnServer(Context, boolean)</B></A> -
+Static method in class com.google.android.gcm.<A HREF="./com/google/android/gcm/GCMRegistrar.html" title="class in com.google.android.gcm">GCMRegistrar</A>
+<DD>Sets whether the device was successfully registered in the server side.
+</DL>
+<HR>
+<A NAME="_T_"><!-- --></A><H2>
+<B>T</B></H2>
+<DL>
+<DT><A HREF="./com/google/android/gcm/GCMBaseIntentService.html#TAG"><B>TAG</B></A> -
+Static variable in class com.google.android.gcm.<A HREF="./com/google/android/gcm/GCMBaseIntentService.html" title="class in com.google.android.gcm">GCMBaseIntentService</A>
+<DD>
+</DL>
+<HR>
+<A NAME="_U_"><!-- --></A><H2>
+<B>U</B></H2>
+<DL>
+<DT><A HREF="./com/google/android/gcm/GCMRegistrar.html#unregister(Context)"><B>unregister(Context)</B></A> -
+Static method in class com.google.android.gcm.<A HREF="./com/google/android/gcm/GCMRegistrar.html" title="class in com.google.android.gcm">GCMRegistrar</A>
+<DD>Unregister the application.
+</DL>
+<HR>
+<A NAME="_V_"><!-- --></A><H2>
+<B>V</B></H2>
+<DL>
+<DT><A HREF="./com/google/android/gcm/GCMConstants.html#VALUE_DELETED_MESSAGES"><B>VALUE_DELETED_MESSAGES</B></A> -
+Static variable in class com.google.android.gcm.<A HREF="./com/google/android/gcm/GCMConstants.html" title="class in com.google.android.gcm">GCMConstants</A>
+<DD>Special message indicating the server deleted the pending messages.
+</DL>
+<HR>
+<A HREF="#_C_">C</A> <A HREF="#_D_">D</A> <A HREF="#_E_">E</A> <A HREF="#_G_">G</A> <A HREF="#_I_">I</A> <A HREF="#_O_">O</A> <A HREF="#_P_">P</A> <A HREF="#_R_">R</A> <A HREF="#_S_">S</A> <A HREF="#_T_">T</A> <A HREF="#_U_">U</A> <A HREF="#_V_">V</A>
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="./com/google/android/gcm/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="./overview-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="./deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Index</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="./help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="./index.html?index-all.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="index-all.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="./allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="./allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+
+</BODY>
+</HTML>
diff --git a/docs/html/guide/google/gcm/client-javadoc/index.html b/docs/html/guide/google/gcm/client-javadoc/index.html
new file mode 100644
index 0000000..a7753f7
--- /dev/null
+++ b/docs/html/guide/google/gcm/client-javadoc/index.html
@@ -0,0 +1,38 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc on Thu Jun 21 12:06:25 PDT 2012-->
+<TITLE>
+Generated Documentation (Untitled)
+</TITLE>
+
+
+<SCRIPT type="text/javascript">
+ targetPage = "" + window.location.search;
+ if (targetPage != "" && targetPage != "undefined")
+ targetPage = targetPage.substring(1);
+ if (targetPage.indexOf(":") != -1)
+ targetPage = "undefined";
+ function loadFrames() {
+ if (targetPage != "" && targetPage != "undefined")
+ top.classFrame.location = top.targetPage;
+ }
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+</HEAD>
+<FRAMESET cols="20%,80%" title="" onLoad="top.loadFrames()">
+<FRAME src="allclasses-frame.html" name="packageFrame" title="All classes and interfaces (except non-static nested types)">
+<FRAME src="com/google/android/gcm/package-summary.html" name="classFrame" title="Package, class and interface descriptions" scrolling="yes">
+<NOFRAMES>
+<H2>
+Frame Alert</H2>
+
+<P>
+This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client.
+<BR>
+Link to<A HREF="com/google/android/gcm/package-summary.html">Non-frame version.</A>
+</NOFRAMES>
+</FRAMESET>
+</HTML>
diff --git a/docs/html/guide/google/gcm/client-javadoc/overview-tree.html b/docs/html/guide/google/gcm/client-javadoc/overview-tree.html
new file mode 100644
index 0000000..6ea6fb3
--- /dev/null
+++ b/docs/html/guide/google/gcm/client-javadoc/overview-tree.html
@@ -0,0 +1,152 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_20) on Thu Jun 21 12:06:25 PDT 2012 -->
+<TITLE>
+Class Hierarchy
+</TITLE>
+
+<META NAME="date" CONTENT="2012-06-21">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+ if (location.href.indexOf('is-external=true') == -1) {
+ parent.document.title="Class Hierarchy";
+ }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="com/google/android/gcm/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Tree</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html?overview-tree.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="overview-tree.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<CENTER>
+<H2>
+Hierarchy For All Packages</H2>
+</CENTER>
+<DL>
+<DT><B>Package Hierarchies:</B><DD><A HREF="com/google/android/gcm/package-tree.html">com.google.android.gcm</A></DL>
+<HR>
+<H2>
+Class Hierarchy
+</H2>
+<UL>
+<LI TYPE="circle">java.lang.Object<UL>
+<LI TYPE="circle">BroadcastReceiver<UL>
+<LI TYPE="circle">com.google.android.gcm.<A HREF="com/google/android/gcm/GCMBroadcastReceiver.html" title="class in com.google.android.gcm"><B>GCMBroadcastReceiver</B></A></UL>
+<LI TYPE="circle">com.google.android.gcm.<A HREF="com/google/android/gcm/GCMConstants.html" title="class in com.google.android.gcm"><B>GCMConstants</B></A><LI TYPE="circle">com.google.android.gcm.<A HREF="com/google/android/gcm/GCMRegistrar.html" title="class in com.google.android.gcm"><B>GCMRegistrar</B></A><LI TYPE="circle">IntentService<UL>
+<LI TYPE="circle">com.google.android.gcm.<A HREF="com/google/android/gcm/GCMBaseIntentService.html" title="class in com.google.android.gcm"><B>GCMBaseIntentService</B></A></UL>
+</UL>
+</UL>
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="com/google/android/gcm/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Tree</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html?overview-tree.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="overview-tree.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+
+</BODY>
+</HTML>
diff --git a/docs/html/guide/google/gcm/client-javadoc/package-list b/docs/html/guide/google/gcm/client-javadoc/package-list
new file mode 100644
index 0000000..149691e
--- /dev/null
+++ b/docs/html/guide/google/gcm/client-javadoc/package-list
@@ -0,0 +1 @@
+com.google.android.gcm
diff --git a/docs/html/guide/google/gcm/client-javadoc/resources/inherit.gif b/docs/html/guide/google/gcm/client-javadoc/resources/inherit.gif
new file mode 100644
index 0000000..c814867
--- /dev/null
+++ b/docs/html/guide/google/gcm/client-javadoc/resources/inherit.gif
Binary files differ
diff --git a/docs/html/guide/google/gcm/client-javadoc/stylesheet.css b/docs/html/guide/google/gcm/client-javadoc/stylesheet.css
new file mode 100644
index 0000000..6ea9e51
--- /dev/null
+++ b/docs/html/guide/google/gcm/client-javadoc/stylesheet.css
@@ -0,0 +1,29 @@
+/* Javadoc style sheet */
+
+/* Define colors, fonts and other style attributes here to override the defaults */
+
+/* Page background color */
+body { background-color: #FFFFFF; color:#000000 }
+
+/* Headings */
+h1 { font-size: 145% }
+
+/* Table colors */
+.TableHeadingColor { background: #CCCCFF; color:#000000 } /* Dark mauve */
+.TableSubHeadingColor { background: #EEEEFF; color:#000000 } /* Light mauve */
+.TableRowColor { background: #FFFFFF; color:#000000 } /* White */
+
+/* Font used in left-hand frame lists */
+.FrameTitleFont { font-size: 100%; font-family: Helvetica, Arial, sans-serif; color:#000000 }
+.FrameHeadingFont { font-size: 90%; font-family: Helvetica, Arial, sans-serif; color:#000000 }
+.FrameItemFont { font-size: 90%; font-family: Helvetica, Arial, sans-serif; color:#000000 }
+
+/* Navigation bar fonts and colors */
+.NavBarCell1 { background-color:#EEEEFF; color:#000000} /* Light mauve */
+.NavBarCell1Rev { background-color:#00008B; color:#FFFFFF} /* Dark Blue */
+.NavBarFont1 { font-family: Arial, Helvetica, sans-serif; color:#000000;color:#000000;}
+.NavBarFont1Rev { font-family: Arial, Helvetica, sans-serif; color:#FFFFFF;color:#FFFFFF;}
+
+.NavBarCell2 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF; color:#000000}
+.NavBarCell3 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF; color:#000000}
+
diff --git a/docs/html/guide/google/gcm/demo.jd b/docs/html/guide/google/gcm/demo.jd
new file mode 100644
index 0000000..2e1e975
--- /dev/null
+++ b/docs/html/guide/google/gcm/demo.jd
@@ -0,0 +1,259 @@
+page.title=GCM Demo Application
+@jd:body
+
+<div id="qv-wrapper">
+<div id="qv">
+
+<h2>Quickview</h2>
+
+<ul>
+<li>Build and run the GCM demo app.</li>
+<li>Understand how to set up both the client and server sides of a GCM app.</li>
+<li>Become familiar with the GCM helper libraries.</li>
+</ul>
+
+
+<h2>In this document</h2>
+
+<ol>
+ <li><a href="#requirements">Requirements</a> </li>
+ <li><a href="#gcm-setup">Setting Up GCM</a></li>
+ <li><a href="#server-setup">Setting Up the Server</a>
+ <ol>
+ <li><a href="#webserver-setup">Using a standard web server</a></li>
+ <li><a href="#appengine-setup">Using App Engine for Java</a></li>
+ </ol>
+ </li>
+ <li><a href="#device-setup">Setting Up the Device</a></li>
+</ol>
+
+</div>
+</div>
+
+<p>The Google Cloud Messaging (GCM) Demo demonstrates how to use the Google Cloud Messaging framework in your Android application. This tutorial walks you through setting up and running the demo.</p>
+
+
+<p>This demo consists of the following pieces: </p>
+<ul>
+ <li>A web server containing a page where you can send messages.</li>
+ <li>An Android application that receives and displays such messages.</li>
+</ul>
+<p>Here is the API reference documentation for the helper libraries on which the demo is based:</p>
+<ul>
+ <li><a href="{@docRoot}guide/google/gcm/client-javadoc/index.html">Client Reference</a></li>
+ <li><a href="{@docRoot}guide/google/gcm/server-javadoc/index.html">Server Reference</a></li>
+</ul>
+<h2 id="requirements">Requirements</h2>
+<p>For the web server:</p>
+<ul>
+ <li> <a href="http://ant.apache.org/">Ant 1.8</a> (it might work with earlier versions, but it's not guaranteed).</li>
+ <li>One of the following:
+ <ul>
+ <li>A running web server compatible with Servlets API version 2.5, such as <a href="http://tomcat.apache.org/">Tomcat 6</a> or <a href="http://jetty.codehaus.org/">Jetty</a>, or</li>
+ <li><a href="http://code.google.com/appengine/">Java App Engine SDK</a> version 1.6 or later.</li>
+ </ul>
+ </li>
+ <li>A Google account registered to use GCM.</li>
+ <li>The API key for that account.</li>
+</ul>
+<p>For the Android application:</p>
+<ul>
+ <li>Emulator (or device) running Android 2.2 with Google APIs.</li>
+ <li>The Google API project ID of the account registered to use GCM.</li>
+</ul>
+<h2 id="gcm-setup">Setting Up GCM</h2>
+<p>Before proceeding with the server and client setup, it's necessary to register a Google account with the Google API Console, enable Google Cloud Messaging in GCM, and obtain an API key from the <a href="https://code.google.com/apis/console">Google API Console</a>.</p>
+<p>For instructions on how to set up GCM, see <a href="gs.html">Getting Started</a>.</p>
+
+
+<h2 id="server-setup">Setting Up the Server</h2>
+<p>This section describes the different options for setting up a server.</p>
+<h3 id="webserver-setup">Using a standard web server</h3>
+<p>To set up the server using a standard, servlet-compliant web server:</p>
+<ol>
+ <li> From the SDK Manager, install <strong>Extras > Google Cloud Messaging for Android Library</strong>.
+
+
+ <p>This creates a <code>gcm</code> directory under <code><em>YOUR_SDK_ROOT</em>/extras/google/</code> containing these subdirectories: <code>gcm-client</code>, <code>gcm-demo-appengine</code>, <code>gcm-demo-client</code>, <code>gcm-demo-server</code>, and <code>gcm-server</code>.</p>
+ </li>
+
+ <li>In a text editor, edit the <code>gcm-demo-server/WebContent/WEB-INF/classes/api.key</code> and replace the existing text with the API key obtained above.</li>
+ <li>In a shell window, go to the <code>gcm-demo-server</code> directory.</li>
+ <li>Generate the server's WAR file by running <code>ant war</code>:</li>
+
+ <pre class="prettyprint">$ ant war
+
+Buildfile:build.xml
+
+init:
+ [mkdir] Created dir: build/classes
+ [mkdir] Created dir: dist
+
+compile:
+ [javac] Compiling 6 source files to build/classes
+
+war:
+ [war] Building war: <strong>dist/gcm-demo.war</strong>
+
+BUILD SUCCESSFUL
+Total time: 0 seconds
+</pre>
+
+ <li>Deploy the <code>dist/gcm-demo.war</code> to your running server. For instance, if you're using Jetty, copy <code>gcm-demo.war</code> to the <code>webapps</code> directory of the Jetty installation.</li>
+ <li>Open the server's main page in a browser. The URL depends on the server you're using and your machine's IP address, but it will be something like <code>http://192.168.1.10:8080/gcm-demo/home</code>, where <code>gcm-demo</code> is the application context and <code>/home</code> is the path of the main servlet.
+
+ </li>
+</ol>
+<p class="note"><strong>Note:</strong> You can get the IP by running <code>ifconfig</code> on Linux or MacOS, or <code>ipconfig</code> on Windows. </p>
+<p><img src="{@docRoot}images/gcm/gcm-demo-homepage.png" class="screenshot" /></p>
+<p> You server is now ready.</p>
+<h3 id="appengine-setup">Using App Engine for Java</h3>
+
+<p>To set up the server using a standard App Engine for Java:</p>
+<ol>
+ <li> From the SDK Manager, install <strong>Extras > Google Cloud Messaging for Android Library</strong>.
+ <p>This creates a <code>gcm</code> directory under <code><em>YOUR_SDK_ROOT</em>/extras/google/</code> containing these subdirectories: <code>gcm-client</code>, <code>gcm-demo-appengine</code>, <code>gcm-demo-client</code>, <code>gcm-demo-server</code>, and <code>gcm-server</code>.</p>
+ </li>
+ <li>In a text editor, edit the <code>gcm-demo-appengine/src/com/google/android/gcm/demo/server/ApiKeyInitializer.java</code> and replace the existing text with the API key obtained above.
+ <p class="note"><strong>Note:</strong> The API key value set in that class will be used just once to create a persistent entity on App Engine. If you deploy the application, you can use App Engine's <code>Datastore Viewer</code> to change it later.</p>
+
+ </li>
+ <li>In a shell window, go to the <code>gcm-api-server</code> directory.</li>
+ <li>Start the development App Engine server by <code>ant runserver</code>, using the <code>-Dsdk.dir</code> to indicate the location of the App Engine SDK and <code>-Dserver.host</code> to set your server's hostname or IP address:</li>
+
+<pre class="prettyprint">
+$ ant -Dsdk.dir=/opt/google/appengine-java-sdk runserver -Dserver.host=192.168.1.10
+Buildfile: gcm-demo-appengine/build.xml
+
+init:
+ [mkdir] Created dir: gcm-demo-appengine/dist
+
+copyjars:
+
+compile:
+
+datanucleusenhance:
+ [enhance] DataNucleus Enhancer (version 1.1.4) : Enhancement of classes
+ [enhance] DataNucleus Enhancer completed with success for 0 classes. Timings : input=28 ms, enhance=0 ms, total=28 ms. Consult the log for full details
+ [enhance] DataNucleus Enhancer completed and no classes were enhanced. Consult the log for full details
+
+runserver:
+ [java] Jun 15, 2012 8:46:06 PM com.google.apphosting.utils.jetty.JettyLogger info
+ [java] INFO: Logging to JettyLogger(null) via com.google.apphosting.utils.jetty.JettyLogger
+ [java] Jun 15, 2012 8:46:06 PM com.google.apphosting.utils.config.AppEngineWebXmlReader readAppEngineWebXml
+ [java] INFO: Successfully processed gcm-demo-appengine/WebContent/WEB-INF/appengine-web.xml
+ [java] Jun 15, 2012 8:46:06 PM com.google.apphosting.utils.config.AbstractConfigXmlReader readConfigXml
+ [java] INFO: Successfully processed gcm-demo-appengine/WebContent/WEB-INF/web.xml
+ [java] Jun 15, 2012 8:46:09 PM com.google.android.gcm.demo.server.ApiKeyInitializer contextInitialized
+ [java] SEVERE: Created fake key. Please go to App Engine admin console, change its value to your API Key (the entity type is 'Settings' and its field to be changed is 'ApiKey'), then restart the server!
+ [java] Jun 15, 2012 8:46:09 PM com.google.appengine.tools.development.DevAppServerImpl start
+ [java] INFO: The server is running at http://192.168.1.10:8080/
+ [java] Jun 15, 2012 8:46:09 PM com.google.appengine.tools.development.DevAppServerImpl start
+ [java] INFO: The admin console is running at http://192.168.1.10:8080/_ah/admin
+</pre>
+
+ <li>Open the server's main page in a browser. The URL depends on the server you're using and your machine's IP address, but it will be something like <code>http://192.168.1.10:8080/home</code>, where <code>/home</code> is the path of the main servlet.</li>
+
+ <p class="note"><strong>Note:</strong> You can get the IP by running <code>ifconfig</code> on Linux or MacOS, or <code>ipconfig</code> on Windows.</p>
+
+ <p><img src="{@docRoot}images/gcm/gcm-demo-homepage-appengine.png" class="screenshot" /></p>
+</ol>
+<p> You server is now ready.</p>
+<h2 id="device-setup">Setting Up the Device</h2>
+<p>To set up the device:</p>
+<ol>
+ <li> From the SDK Manager, install <strong>Extras > Google Cloud Messaging for Android Library</strong>.
+ <p>This creates a <code>gcm</code> directory under <code><em>YOUR_SDK_ROOT</em>/extras/google</code> containing these subdirectories: <code>gcm-client</code>, <code>gcm-demo-appengine</code>, <code>gcm-demo-client</code>, <code>gcm-demo-server</code>, <code>gcm-server</code>, and <code>source.properties</code>.</p>
+ </li>
+ <li>Using a text editor, open <code>gcm-demo-client/src/com/google/android/gcm/demo/app/CommonUtilities.java</code> and set the proper values for the <code>SENDER_ID</code> and <code>SERVER_URL</code> constants. For example:</li>
+
+<pre class="prettyprint pretty-java">
+static final String SERVER_URL = "http://192.168.1.10:8080/gcm-demo";
+static final String SENDER_ID = "4815162342";</pre>
+<p>Note that the <code>SERVER_URL</code> is the URL for the server and the application's context (or just server, if you are using App Engine), and it does not include the forward slash (<code>/</code>). Also note that <code>SENDER_ID</code> is the Google API project ID you obtained in the server setup steps above.</p>
+
+ <li>In a shell window, go to the <code>gcm-demo-client</code> directory.</li>
+ <li>Use the SDK's <code>android</code> tool to generate the <code>ant</code> build files:</li>
+
+<pre class="prettyprint">
+$ android update project --name GCMDemo -p . --target android-16
+Updated project.properties
+Updated local.properties
+Updated file ./build.xml
+Updated file ./proguard-project.txt
+</pre>
+<p>If this command fails becase <code>android-16</code> is not recognized, try a different target (as long as it is at least <code>android-15</code>).</p>
+
+<li>Use <code>ant</code> to build the application's APK file:</li>
+
+ <pre class="prettyprint">
+$ ant clean debug
+Buildfile: build.xml
+
+...
+
+
+-do-debug:
+[zipalign] Running zip align on final apk...
+ [echo] Debug Package: bin/GCMDemo-debug.apk
+[propertyfile] Creating new property file: <strong>bin/build.prop</strong>
+[propertyfile] Updating property file: bin/build.prop
+[propertyfile] Updating property file: bin/build.prop
+[propertyfile] Updating property file: bin/build.prop
+
+-post-build:
+
+debug:
+
+BUILD SUCCESSFUL
+Total time: 3 seconds
+ </pre>
+
+<li>Start the Android emulator:</li>
+<pre class="prettyprint">$emulator -avd my_avd
+</pre>
+
+<p> This example assumes there is an AVD (Android Virtual Device) named <code>my_avd</code> previously configured with Android 2.2 and Google APIs level 8. For more information on how to run an Android emulator, see <a href="{@docRoot}tools/devices/index.html">Managing Virtual Devices</a> in the Android Developers Guide.</p>
+
+<li>Make sure there is a Google account added to the emulator. It doesn't have to be any account (like the <code>senderId</code>) in particular. </li>
+
+<p> If the emulator is running Android 4.0.4 or later, this step is optional as GCM does not require an account from this version on.</p>
+
+<li>Install the application in the emulator:</li>
+
+<pre class="prettyprint">
+$ ant installd
+Buildfile: gcm-demo-client/build.xml
+
+-set-mode-check:
+
+-set-debug-files:
+
+install:
+ [echo] Installing gcm-demo-client/bin/GCMDemo-debug.apk onto default emulator or device...
+ [exec] 1719 KB/s (47158 bytes in 0.026s)
+ [exec] pkg: /data/local/tmp/GCMDemo-debug.apk
+ [exec] Success
+
+installd:
+
+BUILD SUCCESSFUL
+Total time: 3 seconds
+</pre>
+ <li>In the emulator, launch the GCM Demo app. The initial screen should look like this:</li>
+ <p><img src="{@docRoot}images/gcm/gcm-avd-home-auto-reg.png" class="screenshot" /></p>
+<p class="note"><strong>Note:</strong> What happened? When the device received a registration callback intent from GCM, it contacted the server to register itself, using the register servlet and passing the registration ID received from GCM; the server then saved the registration ID to use it to send messages to the phone.</p>
+<li> Now go back to your browser and refresh the page. It will show that there is one device registered:</li>
+
+<p><img src="{@docRoot}images/gcm/gcm-device-reg.png" class="screenshot" /></p>
+
+<li>Click on <strong>Send Message</strong>. The browser should show:</li>
+<p><img src="{@docRoot}images/gcm/gcm-sent-server.png" class="screenshot" /></p>
+
+<p>And in your emulator:</p>
+
+<p><img src="{@docRoot}images/gcm/gcm-avd-first-msg.png" class="screenshot" /></p>
+
+<p class="note"><strong>Note:</strong> What happened? When you clicked the button, the web server sent a message to GCM addressed to your device (more specifically, to the registration ID returned by GCM during the registration step). The device then received the message and displayed in the main activity; it also issued a system notification so the user would be notified even if the demo application was not running.</p>
+</ol>
+
diff --git a/docs/html/guide/google/gcm/gcm.jd b/docs/html/guide/google/gcm/gcm.jd
new file mode 100644
index 0000000..d871fb4
--- /dev/null
+++ b/docs/html/guide/google/gcm/gcm.jd
@@ -0,0 +1,943 @@
+page.title=GCM Architectural Overview
+@jd:body
+
+<div id="qv-wrapper">
+<div id="qv">
+
+<h2>Quickview</h2>
+
+<ul>
+<li>Get an introduction to key GCM terms and concepts.</li>
+<li>Learn the basic features of a GCM application.</li>
+<li>Understand the role of the 3rd-party application server, and how to send messages and process results.</li>
+</ul>
+
+
+<h2>In this document</h2>
+
+<ol class="toc">
+ <li><a href="#intro">Introduction</a> </li>
+ <li><a href="#arch">Architectural Overview</a>
+ <ol>
+ <li><a href="#lifecycle">Lifecycle Flow</a></li>
+ <li><a href="#user">What Does the User See?</a></li>
+ </ol>
+ </li>
+ <li><a href="#writing_apps">Writing Android Applications that use GCM</a>
+ <ol>
+ <li><a href="#manifest">Creating the Manifest</a></li>
+ <li><a href="#registering">Registering for GCM</a></li>
+ <li><a href="#unregistering">Unregistering from GCM</a></li>
+ <li><a href="#handling_intents">Handling Intents sent by GCM</a>
+ <ol>
+ <li><a href="#handling_reg">Handling Registration Results</a></li>
+ <li><a href="#received_data">Handling Received Data</a></li>
+ </ol>
+ </li>
+ <li><a href="#testing">Developing and Testing Your Android Applications</a></li>
+ </ol>
+ </li>
+ <li><a href="#server">Role of the 3rd-party Application Server</a>
+ <ol class="toc">
+ <li><a href="#send-msg">Sending Messages</a>
+ <ol>
+ <li><a href="#request">Request format</a></li>
+ <li><a href="#response">Response format</a></li>
+ </ol>
+ </li>
+ </ol>
+ <li><a href="#stats">Viewing statistics</a>
+ </li>
+ <li><a href="#example">Examples</a></li>
+</ol>
+
+
+
+</div>
+</div>
+
+<p>Google Cloud Messaging for Android (GCM) is a service that helps
+developers send data from servers to their Android applications on Android devices. This could be a lightweight message telling the Android application that there is new data to be fetched from the server (for instance, a movie uploaded by a friend), or it could be a message containing up to 4kb of payload data (so apps like instant messaging can consume the message directly). The GCM service handles all aspects of queueing of
+ messages and delivery to the target Android application running on the target
+ device.</p>
+<p class="note"> To jump right into using GCM with your Android
+ applications, see the instructions in <a href="gs.html">Getting Started</a>.</p>
+
+
+
+
+<h2 id="intro">Introduction</h2>
+
+<p>Here are the primary characteristics of Google Cloud
+Messaging (GCM):</p>
+
+<ul>
+ <li>It allows 3rd-party application servers to send messages to
+their Android applications.</li>
+ <li>GCM makes no guarantees about delivery or the order of messages.</li>
+ <li>An Android application on an Android device doesn't need to be running to receive
+messages. The system will wake up the Android application via Intent broadcast when the message arrives, as long as the application is set up with the proper
+broadcast receiver and permissions.</li>
+ <li>It does not provide any built-in user interface or other handling for
+message data. GCM simply passes raw message data received straight to the
+Android application, which has full control of how to handle it. For example, the
+application might post a notification, display a custom user interface, or
+silently sync data.</li>
+ <li>It requires devices running Android 2.2 or higher that also have the
+Google Play Store application installed, or or an emulator running Android 2.2 with Google APIs. However, you are not limited to deploying your
+Android applications through Google Play Store.</li>
+ <li>It uses an existing connection for Google services. For pre-3.0 devices, this requires users to
+set up their Google account on their mobile devices. A Google account is not a requirement on devices running Android 4.0.4 or higher.</li>
+</ul>
+<h2 id="arch">Architectural Overview</h2>
+<p>This section gives an overview of how GCM works. </p>
+<p>This table summarizes the key terms and concepts involved in GCM. It is
+divided into these categories:</p>
+<ul>
+ <li><strong>Components</strong> — The physical entities that play a role in
+GCM.</li>
+ <li><strong>Credentials</strong> — The IDs and tokens that are used in
+different stages of GCM to ensure that all parties have been authenticated, and
+that the message is going to the correct place.</li>
+</ul>
+
+<table>
+ <tr>
+ <th colspan="2">Components</th>
+ </tr>
+ <tr>
+ <td width="165"><strong>Mobile Device</strong></td>
+ <td width="1176">The device that is running an Android application that uses
+GCM. This must be a 2.2 Android device that has Google Play Store installed, and it must
+have at least one logged in Google account if the device is running a version lower than Android 4.0.4. Alternatively, for testing you can use an emulator running Android 2.2 with Google APIs.</td>
+ </tr>
+ <tr>
+ <td><strong>3rd-party Application Server</strong></td>
+ <td>An application server that developers set up as part of implementing
+GCM in their applications. The 3rd-party application server sends data to an
+Android application on the device via the GCM server.</td>
+ </tr>
+ <tr>
+ <td><strong>GCM Servers</strong></td>
+ <td>The Google servers involved in taking messages from the 3rd-party
+application server and sending them to the device. </td>
+ </tr>
+ <tr>
+ <th colspan="2"><strong>Credentials</strong></th>
+ </tr>
+ <tr>
+ <td><strong>Sender ID</strong></td>
+ <td>A project ID you acquire from the API console, as described in <a href="gs.html#create-proj">Getting Started</a>. The sender
+ID is used in the <a href="#registering">registration process</a> to identify an
+Android application that is permitted to send messages to the device.</td>
+ </tr>
+ <tr>
+ <td><strong>Application ID</strong></td>
+ <td>The Android application that is registering to receive messages. The Android application
+is identified by the package name from the <a href="#manifest">manifest</a>.
+This ensures that the messages are targeted to the correct Android application.</td>
+ </tr>
+ <tr>
+ <td><strong>Registration ID</strong></td>
+ <td>An ID issued by the GCM servers to the Android application that allows
+it to receive messages. Once the Android application has the registration ID, it sends
+it to the 3rd-party application server, which uses it to identify each device
+that has registered to receive messages for a given Android application. In other words,
+a registration ID is tied to a particular Android application running on a particular
+device.</td>
+ </tr>
+ <tr>
+ <td><strong>Google User Account</strong></td>
+ <td>For GCM to work, the mobile device must include at least one Google account if the device is running a version lower than Android 4.0.4.</td>
+ </tr>
+ <tr>
+ <td><strong>Sender Auth Token</strong></td>
+ <td>An API key that is saved on the 3rd-party application
+server that gives the application server authorized access to Google services.
+The API key is included in the header of POST requests that send messages.</td>
+ </tr>
+</table>
+
+<h3 id="lifecycle">Lifecycle Flow</h3>
+
+<p>Here are the primary processes involved in cloud-to-device messaging:</p>
+
+<ul>
+ <li><a href="#register">Enabling GCM</a>. An Android application running on a
+mobile device registers to receive messages.</li>
+ <li><a href="#push-process">Sending a message</a>. A 3rd-party application
+server sends messages to the device.</li>
+ <li><a href="#receiving">Receiving a message</a>. An Android application
+receives a message from a GCM server.</li>
+</ul>
+
+<p>These processes are described in more detail below.</p>
+
+<h4 id="register">Enabling GCM</h4>
+
+<p>This is the sequence of events that occurs when an Android application
+running on a mobile device registers to receive messages:<span
+class="red-text"></span></p>
+
+<ol>
+ <li>The first time the Android application needs to use the messaging service, it
+fires off a registration Intent to a GCM server.
+ <p>This registration Intent
+(<code>com.google.android.c2dm.intent.REGISTER</code>) includes the sender ID, and the Android application ID.</p>
+<p class="note"><strong>Note:</strong> Because there is no lifecycle method that is called when the application is run for
+the first time, the registration intent should be sent on <code>onCreate()</code>, but only if the application is not registered yet.
+</p>
+ </li>
+ <li>If the registration is successful, the GCM server broadcasts a <code>com.google.android.c2dm.intent.REGISTRATION</code> intent which gives the Android application a registration
+ID.
+ <p>The Android application should store this ID for later use (for instance, to check on <code>onCreate()</code> if it is already registered).
+Note that Google may periodically refresh the registration ID, so you should design your Android application
+with the understanding that the <code>com.google.android.c2dm.intent.REGISTRATION</code> intent may be called
+multiple times. Your Android application needs to be able to respond
+accordingly.</p></li>
+ <li>To complete the registration, the Android application sends the registration ID to
+the application server. The application server typically stores the registration
+ID in a database. </li>
+</ol>
+
+<p>The registration ID lasts until the Android application explicitly unregisters
+itself, or until Google refreshes the registration ID for your Android application.</p>
+
+<p class="note"><strong>Note:</strong> When users uninstall an application, it is not automatically unregistered on GCM. It is only unregistered when the GCM server tries to send a message to the device and the device answers that the application is uninstalled. At that point, you server should mark the device as unregistered (the server will receive a <code><a href="#unreg_device">NotRegistered</a></code> error).
+ <p>
+Note that it might take a few minutes for the registration ID to be completed removed from the GCM server. So if the 3rd party server sends a message during this time, it will get a valid message ID, even though the message will not be delivered to the device.</p>
+</p>
+
+<h4 id="push-process">Sending a Message</h4>
+
+<p>For an application server to send a message to an Android application, the following things must be in
+place:</p>
+
+<ul>
+ <li>The Android application has a registration ID that allows it to receive messages
+for a particular device.</li>
+ <li>The 3rd-party application server has stored the registration ID.</li>
+
+
+
+<li>An API key. This is something that the developer must have already
+set up on the application server for the Android application (for more discussion, see
+<a href="#server">Role of the 3rd-party Application Server</a>). Now it will
+get used to send messages to the device. </li>
+</ul>
+
+<p>Here is the sequence of events that occurs when the application server sends a
+message:</p>
+
+<ol>
+ <li>The application server sends a message to GCM servers.</li>
+ <li>Google enqueues and stores the message in case the device is
+offline.</li>
+ <li>When the device is online, Google sends the message to the device. </li>
+ <li>On the device, the system broadcasts the message to the specified
+Android application via Intent broadcast with proper permissions, so that only the
+targeted Android application gets the message. This wakes the Android application up. The
+Android application does not need to be running beforehand to receive the message.</li>
+ <li>The Android application processes the message. If the Android application is doing
+non-trivial processing, you may want to grab a {@link android.os.PowerManager.WakeLock} and do any processing in a Service.</li>
+</ol>
+
+<p> An Android application can unregister GCM if it no longer wants to receive
+messages.</p>
+
+<h4 id="receiving">Receiving a Message</h4>
+
+<p>This is the sequence of events that occurs when an Android application
+installed on a mobile device receives a message:</p>
+
+<ol>
+ <li>The system receives the incoming message and extracts the raw key/value
+pairs from the message payload, if any.</li>
+ <li>The system passes the key/value pairs to the targeted Android application
+in a <code>com.google.android.c2dm.intent.RECEIVE</code> Intent as a set of
+extras.</li>
+ <li>The Android application extracts the raw data
+from the <code>com.google.android.c2dm.intent.RECEIVE</code><code> </code>Intent by key and processes the data.</li>
+</ol>
+
+<h3 id="user">What Does the User See?</h3>
+
+<p>When mobile device users install Android applications that include GCM, the Google Play Store will inform them that the Android application
+includes GCM. They must approve the use of this feature to install the
+Android application. </p>
+
+<h2 id="writing_apps">Writing Android Applications that Use GCM</h2>
+
+<p>To write Android applications that use GCM, you must have an application
+server that can perform the tasks described in <a href="#server">Role of the
+3rd-party Application Server</a>. This section describes the steps you take to
+create a client application that uses GCM.</p>
+
+<p>Remember that there is no user interface associated with GCM.
+However you choose to process messages in your Android application is up to you.</p>
+
+<p>There are two primary steps involved in writing a client Android application:</p>
+
+<ul>
+ <li>Creating a manifest that contains the permissions the Android application needs to
+use GCM.</li>
+ <li>Implementing your code. To use GCM, this implementation must
+include:
+ <ul>
+ <li>Code to start and stop the registration service.</li>
+ <li>Receivers for the <code>com.google.android.c2dm.intent.RECEIVE</code> and <code>com.google.android.c2dm.intent.REGISTRATION</code> intents.</li>
+ </ul>
+ </li>
+</ul>
+
+<h3 id="manifest">Creating the Manifest</h3>
+
+<p>Every Android application must have an <code>AndroidManifest.xml</code> file (with
+precisely that name) in its root directory. The manifest presents essential
+information about the Android application to the Android system, information the
+system must have before it can run any of the Android application's code (for more
+discussion of the manifest file, see the <a href="{@docRoot}guide/topics/manifest/manifest-intro.html">Android Developers Guide</a>. To use the GCM feature, the
+manifest must include the following:</p>
+
+<ul>
+ <li>The <code>com.google.android.c2dm.permission.RECEIVE</code> permission so the Android application can register and receive messages.</li>
+ <li>The <code>android.permission.INTERNET</code> permission so the Android application can send the registration ID to the 3rd party server.</li>
+ <li>The <code>android.permission.GET_ACCOUNTS</code> permission as GCM requires a Google account (necessary only if if the device is running a version lower than Android 4.0.4)</li>
+ <li>The <code>android.permission.WAKE_LOCK</code> permission so the application can keep the processor from sleeping when a message is received.</li>
+ <li>An <code>applicationPackage + ".permission.C2D_MESSAGE</code> permission to prevent other Android applications from registering and receiving the Android application's
+messages. The permission name must exactly match this pattern—otherwise the Android application will not receive the messages.</li>
+ <li>A receiver for <code>com.google.android.c2dm.intent.RECEIVE</code> and <code>com.google.android.c2dm.intent.REGISTRATION</code>, with the category set
+as <code>applicationPackage</code>. The receiver should require the <code>com.google.android.c2dm.SEND</code> permission, so that only the GCM
+Framework can send a message to it. Note that both registration and the receiving
+of messages are implemented as <a href="{@docRoot}guide/components/intents-filters.html">Intents</a>.</li>
+ <li>An intent service to handle the intents received by the broadcast receiver.</li>
+ <li>If the GCM feature is critical to the Android application's function, be sure to
+set <code>android:minSdkVersion="8"</code> in the manifest. This
+ensures that the Android application cannot be installed in an environment in which it
+could not run properly. </li>
+</ul>
+
+<p>Here are excerpts from a manifest that supports GCM:</p>
+
+<pre class="prettyprint pretty-xml">
+<manifest package="com.example.gcm" ...>
+
+ <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="16"/>
+ <uses-permission android:name="android.permission.INTERNET" />
+ <uses-permission android:name="android.permission.GET_ACCOUNTS" />
+ <uses-permission android:name="android.permission.WAKE_LOCK" />
+ <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
+
+ <permission android:name="com.example.gcm.permission.C2D_MESSAGE"
+ android:protectionLevel="signature" />
+ <uses-permission android:name="com.example.gcm.permission.C2D_MESSAGE" />
+
+ <application ...>
+ <receiver
+ android:name=".MyBroadcastReceiver"
+ android:permission="com.google.android.c2dm.permission.SEND" >
+ <intent-filter>
+ <action android:name="com.google.android.c2dm.intent.RECEIVE" />
+ <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
+ <category android:name="com.example.gcm" />
+ </intent-filter>
+ </receiver>
+ <service android:name=".MyIntentService" />
+ </application>
+
+</manifest>
+</pre>
+<h3 id="registering">Registering for GCM</h3>
+
+<p>An Android application needs to register with GCM servers before it can receive messages. To register, the application sends an Intent
+(<code>com.google.android.c2dm.intent.REGISTER</code>), with 2 extra parameters:
+</p>
+
+<ul>
+ <li><code>sender</code> is the project ID of the account authorized to send messages
+to the Android application. </li>
+ <li><code>app</code> is the Android application's ID, set with a <code>PendingIntent</code> to
+allow the registration service to extract Android application information. </li>
+</ul>
+
+<p>For example:</p>
+
+<pre class="prettyprint pretty-java">Intent registrationIntent = new Intent("com.google.android.c2dm.intent.REGISTER");
+// sets the app name in the intent
+registrationIntent.putExtra("app", PendingIntent.getBroadcast(this, 0, new Intent(), 0));
+registrationIntent.putExtra("sender", senderID);
+startService(registrationIntent);</pre>
+
+<p>This intent will be asynchronously sent to the GCM server, and the response will be delivered to
+the application as a <code>com.google.android.c2dm.intent.REGISTRATION</code> intent containing
+the registration ID assigned to the Android application running on that particular device.</p>
+
+<p>Registration is not complete until the Android application sends the registration ID
+to the 3rd-party application server, which in turn will use the registration ID to send
+messages to the application.</p>
+
+<h3 id="unregistering">Unregistering from GCM</h3>
+
+<p>To unregister from GCM, do the following:</p>
+
+<pre class="prettyprint pretty-java">Intent unregIntent = new Intent("com.google.android.c2dm.intent.UNREGISTER");
+unregIntent.putExtra("app", PendingIntent.getBroadcast(this, 0, new Intent(), 0));
+startService(unregIntent);
+</pre>
+
+<p>Similar to the registration request, this intent is sent asynchronously, and the response comes as a <code>com.google.android.c2dm.intent.REGISTRATION</code> intent.
+
+
+<h3 id="handling_intents">Handling Intents sent by GCM</h3>
+
+<p>As discussed in <a href="#manifest">Creating the Manifest</a>, the manifest
+defines a broadcast receiver for the <code>com.google.android.c2dm.intent.REGISTRATION</code> and <code>com.google.android.c2dm.intent.RECEIVE</code> intents.
+These <a href="{@docRoot}guide/components/intents-filters.html">intents</a> are sent by GCM to indicate that a device was registered (or unregistered), or to deliver messages, respectively.</p>
+
+<p>Handling these intents might require I/O operations (such as network calls to the 3rd party server), and
+such operations should not be done in the receiver's <code>onReceive()</code> method.
+You may be tempted to spawn a new thread directly, but there are no guarantees that the process will run long enough for the thread to finish the work.
+Thus the recommended way to handle the intents is to delegate them to a service, such as an {@link android.app.IntentService}.
+For example:</p>
+
+
+<pre class="prettyprint pretty-java">
+public class MyBroadcastReceiver extends BroadcastReceiver {
+
+ @Override
+ public final void onReceive(Context context, Intent intent) {
+ MyIntentService.runIntentInService(context, intent);
+ setResult(Activity.RESULT_OK, null, null);
+ }
+}
+</pre>
+
+<p>Then in <code>MyIntentService</code>:</p>
+<pre class="prettyprint pretty-java">
+public class MyIntentService extends IntentService {
+
+ private static PowerManager.WakeLock sWakeLock;
+ private static final Object LOCK = MyIntentService.class;
+
+ static void runIntentInService(Context context, Intent intent) {
+ synchronized(LOCK) {
+ if (sWakeLock == null) {
+ PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
+ sWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "my_wakelock");
+ }
+ }
+ sWakeLock.acquire();
+ intent.setClassName(context, MyIntentService.class.getName());
+ context.startService(intent);
+ }
+
+ @Override
+ public final void onHandleIntent(Intent intent) {
+ try {
+ String action = intent.getAction();
+ if (action.equals("com.google.android.c2dm.intent.REGISTRATION")) {
+ handleRegistration(intent);
+ } else if (action.equals("com.google.android.c2dm.intent.RECEIVE")) {
+ handleMessage(intent);
+ }
+ } finally {
+ synchronized(LOCK) {
+ sWakeLock.release();
+ }
+ }
+ }
+}
+</pre>
+
+<p class="note"><strong>Note:</strong> your application must acquire a wake lock before starting the service—otherwise the device could be put to sleep before the service is started.</p>
+
+<h4 id="handling_reg">Handling Registration Results</h4>
+
+<p>When a <code>com.google.android.c2dm.intent.REGISTRATION</code> intent is received, it could potentially contain 3 extras: <code>registration_id</code>, <code>error</code>, and <code>unregistered</code>.
+
+<p>When a registration succeeds, <code>registration_id</code> contains the registration ID and the other extras are not set.
+The application must ensure that the 3rd-party server receives the registration ID. It may do so by saving the registration ID and sending it to the server.
+If the network is down or there are errors, the application should retry sending the registration ID when the network is up again or the next time it starts.</p>
+
+<p class="note"><strong>Note:</strong> Although the <code>com.google.android.c2dm.intent.REGISTRATION</code> intent is typically received after a request was made by the application,
+Google may periodically refresh the registration ID. So the application must be prepared to handle it at any time.</p>
+
+<p>When an unregistration succeeds, only the <code>unregistered</code> extra is set, and similar to the registration workflow,
+the application must contact the 3rd-party server to remove the registration ID (note that the registration ID is not available in the intent,
+but the application should have saved the registration ID when it got it).<p>
+
+<p>If the application request (be it register or unregister) fails, the <code>error</code> will be set with an error code, and the other extras will not be set.
+
+Here are the possible error codes:</p>
+
+<table>
+ <tr>
+ <th>Error Code</th>
+ <th>Description</th>
+ </tr>
+ <tr>
+ <td><code>SERVICE_NOT_AVAILABLE</code></td>
+ <td>The device can't read the response, or there was a 500/503 from the
+server that can be retried later. The Android application should use exponential back-off and retry. See <a href="adv.html#retry">Advanced Topics</a> for more information. </td>
+ </tr>
+ <tr>
+ <td><code>ACCOUNT_MISSING</code></td>
+ <td>There is no Google account on the phone. The Android application should ask the
+user to open the account manager and add a Google account. Fix on the device
+side.</td>
+ </tr>
+ <tr>
+ <td><code>AUTHENTICATION_FAILED</code></td>
+ <td>Bad Google Account password. The Android application should ask the user to enter his/her Google Account
+password, and let the user retry manually later. Fix on the device side.</td>
+ </tr>
+ <tr>
+ <td><code>INVALID_SENDER</code></td>
+ <td>The sender account is not recognized. This must be fixed on the Android application side. The developer must fix the application to provide the right <code>sender</code> extra in the <code>com.google.android.c2dm.intent.REGISTER</code> intent.</td>
+ </tr>
+ <tr>
+ <td><code>PHONE_REGISTRATION_ERROR</code></td>
+ <td> Incorrect phone registration with Google. This
+phone doesn't currently support GCM.</td>
+ </tr>
+ <tr>
+ <td><code>INVALID_PARAMETERS</code></td>
+ <td>The request sent by the phone does not contain the expected parameters. This phone doesn't currently support GCM.</td>
+ </tr>
+</table>
+
+
+
+
+<p>Here's an example on how to handle the registration in the <code>MyIntentService</code> example:</p>
+
+<pre class="prettyprint pretty-java">
+private void handleRegistration(Intent intent) {
+ String registrationId = intent.getStringExtra("registration_id");
+ String error = intent.getStringExtra("error");
+ String unregistered = intent.getStringExtra("unregistered");
+ // registration succeeded
+ if (registrationId != null) {
+ // store registration ID on shared preferences
+ // notify 3rd-party server about the registered ID
+ }
+
+ // unregistration succeeded
+ if (unregistered != null) {
+ // get old registration ID from shared preferences
+ // notify 3rd-party server about the unregistered ID
+ }
+
+ // last operation (registration or unregistration) returned an error;
+ if (error != null) {
+ if ("SERVICE_NOT_AVAILABLE".equals(error)) {
+ // optionally retry using exponential back-off
+ // (see <a href="adv.html#retry">Advanced Topics</a>)
+ } else {
+ // Unrecoverable error, log it
+ Log.i(TAG, "Received error: " + error);
+ }
+ }
+}</pre>
+
+<h4 id="received_data">Handling Received Data</h4>
+
+<p>The <code>com.google.android.c2dm.intent.RECEIVE</code> intent is used by GCM to
+deliver the messages sent by the 3rd-party server to the application running in the device.
+If the server included key-pair values in the <code>data</code> parameter, they are available as
+extras in this intent, with the keys being the extra names.
+
+<p>Here is an example, again using the <code>MyIntentReceiver</code> class:</p>
+
+<pre class="prettyprint pretty-java">
+private void handleMessage(Intent intent) {
+ // server sent 2 key-value pairs, score and time
+ String score = intent.getExtra("score");
+ String time = intent.getExtra("time");
+ // generates a system notification to display the score and time
+}</pre>
+
+<h3 id="testing">Developing and Testing Your Android Applications</h3>
+
+<p>Here are some guidelines for developing and testing an Android application
+that uses the GCM feature:</p>
+
+<ul>
+ <li>To develop and test your Android applications, you need to run and debug the
+applications on an Android 2.2 system image that includes the necessary
+underlying Google services. </li>
+ <li>To develop and debug on an actual device, you need a device running an
+Android 2.2 system image that includes the Google Play Store application. </li>
+ <li>To develop and test on the Android Emulator, you need to download the
+Android 2.2 version of the Google APIs Add-On into your SDK using the <em>Android
+SDK and AVD Manager</em>. Specifically, you need to download the component named
+"Google APIs by Google Inc, Android API 8". Then, you need to set up
+an AVD that uses that system image. </li>
+ <li>If the GCM feature is critical to the Android application's function, be sure to
+set <code>android:minSdkVersion="8"</code> in the manifest. This
+ensures that the Android application cannot be installed in an environment in which it
+could not run properly. </li>
+</ul>
+
+<h2 id="server">Role of the 3rd-party Application Server</h2>
+
+<p>Before you can write client Android applications that use the GCM feature, you must
+have an application server that meets the following criteria:</p>
+
+<ul>
+ <li>Able to communicate with your client.</li>
+ <li>Able to fire off HTTPS requests to the GCM server.</li>
+ <li>Able to handle requests and resend then as needed, using <a href="http://en.wikipedia.org/wiki/Exponential_backoff">exponential back-off.</a></li>
+ <li>Able to store the API key and client registration IDs. The
+API key is included in the header of POST requests that send
+messages.</li>
+</ul>
+
+<h3 id="send-msg">Sending Messages</h3>
+<p>This section describes how the 3rd-party application server sends messages to one or more mobile devices. Note the following:</p>
+<ul>
+ <li>A 3rd-party application server can either send messages to a single device or to multiple devices. A message sent to multiple devices simultaneously is called a <em>multicast message</em>.</li>
+
+ <li>You have 2 choices in how you construct requests and responses: plain text or JSON.</li>
+ <li>However, to send multicast messages, you must use JSON. Plain text will not work.</li>
+</ul>
+<p>Before the 3rd-party application server can send a message to an
+ Android application, it must have received a registration ID from it.</p>
+<h4 id="request">Request format</h4>
+<p>To send a message, the application server issues a POST request to <code>https://android.googleapis.com/gcm/send</code>.</p>
+<p>A message request is made of 2 parts: HTTP header and HTTP body.</p>
+
+<p>The HTTP header must contain the following headers:</p>
+<ul>
+ <li><code>Authorization</code>: key=YOUR_API_KEY</li>
+ <li><code>Content-Type</code>: <code>application/json</code> for JSON; <code>application/x-www-form-urlencoded;charset=UTF-8</code> for plain text.
+ </li>
+</ul>
+
+<p>For example:
+</p>
+<pre>Content-Type:application/json
+Authorization:key=AIzaSyB-1uEai2WiUapxCs2Q0GZYzPu7Udno5aA
+
+{
+ "registration_id" : "APA91bHun4MxP5egoKMwt2KZFBaFUH-1RYqx...",
+ "data" : {
+ ...
+ },
+}</pre>
+<p class="note">
+ <p><strong>Note:</strong> If <code>Content-Type</code> is omitted, the format is assumed to be plain text.</p>
+</p>
+
+<p>The HTTP body content depends on whether you're using JSON or plain text. For JSON, it must contain a string representing a JSON object with the following fields:</p>
+<table>
+ <tr>
+ <th>Field</th>
+ <th>Description</th>
+ </tr>
+ <tr>
+ <td><code>registration_ids</code></td>
+ <td>A string array with the list of devices (registration IDs) receiving the message. It must contain at least 1 and at most 1000 registration IDs. To send a multicast message, you must use JSON. For sending a single message to a single device, you could use a JSON object with just 1 registration id, or plain text (see below). Required.</td>
+ </tr>
+ <tr>
+ <td><code>collapse_key</code></td>
+ <td>An arbitrary string (such as "Updates Available") that is used to collapse a group of like messages
+when the device is offline, so that only the last message gets sent to the
+client. This is intended to avoid sending too many messages to the phone when it
+comes back online. Note that since there is no guarantee of the order in which
+messages get sent, the "last" message may not actually be the last
+message sent by the application server. See <a href="adv.html#collapsible">Advanced Topics</a> for more discussion of this topic. Optional, unless you are using the <code>time_to_live</code> parameter—in that case, you must also specify a <code>collapse_key</code>.</td>
+ </tr>
+ <tr>
+ <td><code>data</code></td>
+ <td>A JSON object whose fields represents the key-value pairs of the message's payload data. If present, the payload data it will be
+included in the Intent as application data, with the key being the extra's name. For instance, <code>"data":{"score":"3x1"}</code> would result in an intent extra named <code>score</code> whose value is the string <code>3x1</code>
+There is no limit on the number of key/value pairs, though there is a limit on the total size of the message. Optional.</td>
+ </tr>
+ <tr>
+ <td><code>delay_while_idle</code></td>
+ <td>If included, indicates that the message should not be sent immediately
+if the device is idle. The server will wait for the device to become active, and
+then only the last message for each <code>collapse_key</code> value will be
+sent. Optional. The default value is <code>false</code>, and must be a JSON boolean.</td>
+ </tr>
+ <tr>
+ <td><code>time_to_live</code></td>
+ <td>How long (in seconds) the message should be kept on GCM storage if the device is offline. Optional (default time-to-live is 4 weeks, and must be set as a JSON number). If you use this parameter, you must also specify a <code>collapse_key</code>.</td>
+ </tr>
+</table>
+
+<p>If you are using plain text instead of JSON, the message fields must be set as HTTP parameters sent in the body, and their syntax is slightly different, as described below:
+<table>
+ <tr>
+ <th>Field</th>
+ <th>Description</th>
+ </tr>
+ <tr>
+ <td><code>registration_id</code></td>
+ <td>Must contain the registration ID of the single device receiving the message. Required.</td>
+ </tr>
+ <tr>
+ <td><code>collapse_key</code></td>
+ <td>Same as JSON (see previous table). Optional.</td>
+ </tr>
+ <tr>
+ <td><code>data.<key></code></td>
+ <td>Payload data, expressed as parameters prefixed with <code>data.</code> and suffixed as the key. For instance, a parameter of <code>data.score=3x1</code> would result in an intent extra named <code>score</code> whose value is the string <code>3x1</code>. There is no limit on the number of key/value parameters, though there is a limit on the total size of the message. Optional.</td>
+ </tr>
+ <tr>
+ <td><code>delay_while_idle</code></td>
+ <td>Should be represented as <code>1</code> or <code>true</code> for <code>true</code>, anything else for <code>false</code>. Optional. The default value is <code>false</code>.</td>
+ </tr>
+ <tr>
+ <td><code>time_to_live</code></td>
+ <td>Same as JSON (see previous table). Optional.</td>
+ </tr>
+</table>
+
+
+
+ <h4 id="example-requests">Example requests</h4>
+ <p>Here is the smallest possible request (a message without any parameters and just one recipient) using JSON:</p>
+ <pre class="prettyprint pretty-json">{ "registration_ids": [ "42" ] }</pre>
+
+ <p>And here the same example using plain text:</p>
+ <pre class="prettyprint">registration_id=42</pre>
+
+ <p> Here is a message with a payload and 6 recipients:</p>
+ <pre class="prettyprint pretty-HTML">{ "data": {
+ "score": "5x1",
+ "time": "15:10"
+ },
+ "registration_ids": ["4", "8", "15", "16", "23", "42"]
+}</pre>
+ <p>Here is a message with all optional fields set and 6 recipients:</p>
+ <pre class="prettyprint pretty-json">{ "collapse_key": "score_update",
+ "time_to_live": 108,
+ "delay_while_idle": true,
+ "data": {
+ "score": "4x8",
+ "time": "15:16.2342"
+ },
+ "registration_ids":["4", "8", "15", "16", "23", "42"]
+}</pre>
+ <p>And here is the same message using plain-text format (but just 1 recipient): </p>
+
+ <pre class="prettyprint">collapse_key=score_update&time_to_live=108&delay_while_idle=1&data.score=4x8&data.time=15:16.2342&registration_id=42
+ </pre>
+
+ <p class="note"><strong>Note:</strong> If your organization has a firewall that restricts the traffic to or from the Internet, you'll need to configure it to allow connectivity with GCM. The ports to open are: 5228, 5229, and 5230. GCM typically only uses 5228, but it sometimes uses 5229 and 5230.
+GCM doesn't provide specific IPs. It changes IPs frequently. We recommend against using ACLs but if you must use them, take a broad approach such as the method suggested in <a href="http://support.google.com/code/bin/answer.py?hl=en&answer=62464">this support link</a>.
+</p>
+
+<h4 id="response">Response format</h4>
+
+<p>There are two possible outcomes when trying to send a message:</p>
+<ul>
+ <li>The message is processed successfully.</li>
+ <li>The GCM server rejects the request.</li>
+</ul>
+
+<p>When the messge is processed successfully, the HTTP response has a 200 status and the body contains more information about the status of the message (including possible errors). When the request is rejected,
+the HTTP response contains a non-200 status code (such as 400, 401, or 503).</p>
+
+<p>The following table summarizes the statuses that the HTTP response header might contain. Click the troubleshoot link for advice on how to deal with each type of error.</p>
+<table border=1>
+ <tr>
+ <th>Response</th>
+ <th>Description</th>
+ </tr>
+ <tr>
+ <td>200</td>
+ <td>Message was processed successfully. The response body will contain more details about the message status, but its format will depend whether the request was JSON or plain text. See <a href="#success">Interpreting a success response</a> for more details.</td>
+ </tr>
+ <tr>
+ <td>400</td>
+ <td><span id="internal-source-marker_0.2">Only applies for JSON requests. Indicates that the request could not be parsed as JSON, or it contained invalid fields (for instance, passing a string where a number was expected). The exact failure reason is described in the response and the problem should be addressed before the request can be retried.</td>
+ </tr>
+ <tr>
+ <td>401</td>
+ <td>There was an error authenticating the sender account. <a href="#auth_error">Troubleshoot</a></td>
+ </tr>
+ <tr>
+ <td>500</td>
+ <td>There was an internal error in the GCM server while trying to process the request. <a href="#internal_error">Troubleshoot</a></td>
+ </tr>
+ <tr>
+ <td>503</td>
+ <td>Indicates that the server is temporarily unavailable (i.e., because of timeouts, etc ). Sender must retry later, honoring any <code>Retry-After</code> header
+ included in the response. Application servers must implement exponential back-off. The GCM server took too long to process the request. <a href="#internal_error">Troubleshoot</a></td>
+ </tr>
+</table>
+
+<h4 id="success">Interpreting a success response</h4>
+<p>When a JSON request is successful (HTTP status code 200), the response body contains a JSON object with the following fields:</p>
+<table>
+ <tr>
+ <th>Field</th>
+ <th>Description</th>
+ </tr>
+ <tr>
+ <td><code>multicast_id</code></td>
+ <td>Unique ID (number) identifying the multicast message.</td>
+ </tr>
+ <tr>
+ <td><code>success</code></td>
+ <td>Number of messages that were processed without an error.</td>
+ </tr>
+ <tr>
+ <td><code>failure</code></td>
+ <td>Number of messages that could not be processed.</td>
+ </tr>
+ <tr>
+ <td><code>canonical_ids</code></td>
+ <td>Number of results that contain a canonical registration ID. See <a href="adv.html#canonical">Advanced Topics</a> for more discussion of this topic.</td>
+ </tr>
+ <tr>
+ <td><code>results</code></td>
+ <td>Array of objects representing the status of the messages processed. The objects are listed in the same order as the request (i.e., for each registration ID in the request, its result is listed in the same index in the response) and they can have these fields:<br>
+ <ul>
+ <li><code>message_id</code>: String representing the message when it was successfully processed.</li>
+ <li><code>registration_id</code>: If set, means that GCM processed the message but it has another canonical registration ID for that device, so sender should replace the IDs on future requests (otherwise they might be rejected). This field is never set if there is an error in the request.<br />
+ </li>
+ <li><code>error</code>: String describing an error that occurred while processing the message for that recipient. The possible values are the same as documented in the above table, plus "Unavailable" (meaning GCM servers were busy and could not process the message for that particular recipient, so it could be retried).</li>
+ </ul></td>
+ </tr>
+</table>
+<p>If the value of <code>failure</code> and <code>canonical_ids</code> is 0, it's not necessary to parse the remainder of the response. Otherwise, we recommend that you iterate through the results field and do the following for each object in that list:</p>
+<ul>
+ <li>If <code>message_id</code> is set, check for <code>registration_id</code>:
+ <ul>
+ <li>If <code>registration_id</code> is set, replace the original ID with the new value (canonical ID) in your server database. Note that the original ID is not part of the result, so you need to obtain it from the list of <code>registration_ids</code> passed in the request (using the same index).</li>
+ </ul>
+ </li>
+ <li>Otherwise, get the value of <code>error</code>:
+ <ul>
+ <li>If it is <code>Unavailable</code>, you could retry to send it in another request.</li>
+ <li>If it is <code>NotRegistered</code>, you should remove the registration ID from your server database because the application was uninstalled from the device.</li>
+ <li>Otherwise, there is something wrong in the registration ID passed in the request; it is probably a non-recoverable error that will also require removing the registration from the server database. See <a href="#error_codes">Interpreting an error response</a> for all possible error values.</li>
+ </ul>
+ </li>
+</ul>
+
+<p>When a plain-text request is successful (HTTP status code 200), the response body contains 1 or 2 lines in the form of key/value pairs.
+The first line is always available and its content is either <code>id=<em>ID of sent message</em></code> or <code>Error=<em>GCM error code</em></code>. The second line, if available,
+has the format of <code>registration_id=<em>canonical ID</em></code>. The second line is optional, and it can only be sent if the first line is not an error. We recommend handling the plain-text response in a similar way as handling the JSON response:</p>
+<ul>
+ <li>If first line starts with <code>id</code>, check second line:
+ <ul>
+ <li>If second line starts with <code>registration_id</code>, gets its value and replace the registration IDs in your server database.</li>
+ </ul>
+ </li>
+ <li>Otherwise, get the value of <code>Error</code>:
+ <ul>
+ <li>If it is <code>NotRegistered</code>, remove the registration ID from your server database.</li>
+ <li>Otherwise, there is probably a non-recoverable error (<strong>Note: </strong>Plain-text requests will never return <code>Unavailable</code> as the error code, they would have returned a 500 HTTP status instead).</li>
+ </ul>
+ </li>
+</ul>
+
+<h4 id="error_codes">Interpreting an error response</h4>
+<p>Here are the recommendations for handling the different types of error that might occur when trying to send a message to a device:</p>
+
+<dl>
+<dt id="missing_reg"><strong>Missing Registration ID</strong></dt>
+<dd>Check that the request contains a registration ID (either in the <code>registration_id</code> parameter in a plain text message, or in the <code>registration_ids</code> field in JSON).
+<br/>Happens when error code is <code>MissingRegistration</code>.</dd>
+<dt id="invalid_reg"><strong>Invalid Registration ID</strong></dt>
+<dd>Check the formatting of the registration ID that you pass to the server. Make sure it matches the registration ID the phone receives in the <code>com.google.android.c2dm.intent.REGISTRATION</code> intent and that you're not truncating it or adding additional characters.
+<br/>Happens when error code is <code>InvalidRegistration</code>.</dd>
+<dt id="mismatched_sender"><strong>Mismatched Sender</strong></dt>
+<dd>A registration ID is tied to a certain group of senders. When an application registers for GCM usage, it must specify which senders are allowed to send messages. Make sure you're using one of those when trying to send messages to the device. If you switch to a different sender, the existing registration IDs won't work.
+Happens when error code is <code>MismatchSenderId</code>.</dd>
+<dt id="unreg_device"><strong>Unregistered Device</strong></dt>
+<dd>An existing registration ID may cease to be valid in a number of scenarios, including:
+<ul>
+ <li>If the application manually unregisters by issuing a <span class="prettyprint pretty-java"><code>com.google.android.c2dm.intent.UNREGISTER</code></span><code> </code>intent.</li>
+ <li>If the application is automatically unregistered, which can happen (but is not guaranteed) if the user uninstalls the application.</li>
+ <li>If the registration ID expires. Google might decide to refresh registration IDs. </li>
+</ul>
+For all these cases, you should remove this registration ID from the 3rd-party server and stop using it to send
+messages.
+<br/>Happens when error code is <code>NotRegistered</code>.</dd>
+ <dt id="big_msg"><strong>Message Too Big</strong></dt>
+ <dd>The total size of the payload data that is included in a message can't exceed 4096 bytes. Note that this includes both the size of the keys as well as the values.
+<br/>Happens when error code is <code>MessageTooBig</code>.</dd>
+ <dt id="auth_error"><strong>Authentication Error</strong></dt>
+ <dd>The sender account that you're trying to use to send a message couldn't be authenticated. Possible causes are: request could not be parsed as JSON, or it contained invalid fields (for instance, passing a string where a number was expected). The exact failure reason is described in the response and the problem should be addressed before the request can be retried. Possible causes are: authorization header missing or with invalid syntax, invalid project ID sent as key, key valid but with GCM service disabled, and so on. Check that the Sender Auth Token you're sending inside the <code>Authorization</code> header is the correct API key associated with your project.
+<br/>Happens when the HTTP status code is 401.
+ </dd>
+ <dt id="internal_error"><strong>Internal Server Error/Timeout</strong></dt>
+ <dd>The server encountered an error while trying to process the request or couldn't finish in time. You can retry the same request, but you MUST obey the following requirements:
+<ul>
+ <li>Honor the <code>Retry-After</code> header if it's included in the response from the GCM server.</li>
+ <li>Implement exponential back-off in your retry mechanism. This means an exponentially increasing delay after each failed retry (e.g. if you waited one second before the first retry, wait at least two second before the next one, then 4 seconds and so on). If you're sending multiple messages, delay each one independently by an additional random amount to avoid issuing a new request for all messages at the same time.</li>
+</ul>
+Senders that cause problems risk being blacklisted.
+<br/>Happens when the HTTP status code is 500 or 503; or when the <code>error</code> field of a JSON object in the <code>results</code> array is <code>Unavailable</code>.
+</dd>
+</dl>
+<h4>Example responses</h4>
+<p>This section shows a few examples of responses indicating messages that were processed successfully. See <a href="#example-requests">Example requests</a> for the requests these responses are based on.</p>
+<p> Here is a simple case of a JSON message successfully sent to one recipient without canonical IDs in the response:</p>
+<pre class="prettyprint pretty-json">{ "multicast_id": 108,
+ "success": 1,
+ "failure": 0,
+ "canonical_ids": 0,
+ "results": [
+ { "message_id": "1:08" }
+ ]
+}</pre>
+
+<p>Or if the request was in plain-text format:</p>
+<pre class="prettyprint">id=1:08
+</pre>
+
+<p>Here are JSON results for 6 recipients (IDs 4, 8, 15, 16, 23, and 42 respectively) with 3 messages successfully processed, 1 canonical registration ID returned, and 3 errors:</p>
+<pre class="prettyprint pretty-json">{ "multicast_id": 216,
+ "success": 3,
+ "failure": 3,
+ "canonical_ids": 1,
+ "results": [
+ { "message_id": "1:0408" },
+ { "error": "Unavailable" },
+ { "error": "InvalidRegistration" },
+ { "message_id": "1:1516" },
+ { "message_id": "1:2342", "registration_id": "32" },
+ { "error": "NotRegistered"}
+ ]
+}
+</pre>
+<p> In this example:</p>
+<ul>
+ <li>First message: success, not required.</li>
+ <li>Second message: should be resent (to registration ID 8).</li>
+ <li>Third message: had an unrecoverable error (maybe the value got corrupted in the database).</li>
+ <li>Fourth message: success, nothing required.</li>
+ <li>Fifth message: success, but the registration ID should be updated in the server database (from 23 to 32).</li>
+ <li>Sixth message: registration ID (42) should be removed from the server database because the application was uninstalled from the device.</li>
+</ul>
+<p>Or if just the 4th message above was sent using plain-text format:</p>
+<pre class="prettyprint">Error=InvalidRegistration
+</pre>
+<p>If the 5th message above was also sent using plain-text format:</p>
+<pre class="prettyprint">id=1:2342
+registration_id=32
+</pre>
+
+
+<h3 id="stats">Viewing statistics</h3>
+
+<p>To view statistics and any error messages for your GCM applications:</p>
+<ol>
+ <li> Go to <code><a href="http://play.google.com/apps/publish">play.google.com/apps/publish</a></code>.</li>
+ <li>Login with your developer account.
+ <p>You will see a page that has a list of all of your apps.</p></li>
+ <li> Click on the "statistics" link next to the app for which you want to view GCM stats.
+ <p>Now you are on the statistics page.</p> </li>
+ <li>Go to the drop-down menu and select the GCM metric you want to view.
+ </li>
+</ol>
+<h2 id="example">Examples</h2>
+<p>See the <a href="demo.html">GCM Demo Application</a> document.</p>
+
diff --git a/docs/html/guide/google/gcm/gs.jd b/docs/html/guide/google/gcm/gs.jd
new file mode 100644
index 0000000..5e426c2
--- /dev/null
+++ b/docs/html/guide/google/gcm/gs.jd
@@ -0,0 +1,203 @@
+page.title=GCM: Getting Started
+@jd:body
+
+<div id="qv-wrapper">
+<div id="qv">
+
+<h2>Quickview</h2>
+
+<ul>
+<li>Walk through the steps of creating a GCM app.</li>
+</ul>
+
+
+<h2>In this document</h2>
+
+<ol class="toc">
+<li><a href="#create-proj">Creating a Google API Project</a></li>
+<li><a href="#gcm-service">Enabling the GCM Service</a></li>
+<li><a href="#access-key">Obtaining an API Key</a></li>
+<li><a href="#libs">Installing the Helper Libraries</a></li>
+<li><a href="#android-app">Writing the Android Application</a>
+<li><a href="#server-app">Writing the Server-side Application</a> </li>
+</ol>
+
+</div>
+</div>
+
+<p>This document describes how to write an Android application and the server-side logic, using the helper libraries (<a href="{@docRoot}guide/google/gcm/client-javadoc/index.html">client</a> and <a href="{@docRoot}guide/google/gcm/server-javadoc/index.html">server</a>) provided by GCM.</p>
+
+
+<h2 id="create-proj">Creating a Google API project</h2>
+<p>To create a Google API project:</p>
+<ol>
+ <li>Open the <a href="https://code.google.com/apis/console">Google APIs Console page</a>.
+ </li>
+ <li>If you haven't created an API project yet, this page will prompt you to do so:
+ <p><img src="{@docRoot}images/gcm/gcm-create-api-proj.png" class="screenshot" /></p>
+<p class="note"><strong>Note:</strong> If you already have existing projects, the first page you see will be the <strong>Dashboard</strong> page. From there you can create a new project by opening the project drop-down menu (upper left corner) and choosing <strong>Other projects > Create</strong>.</p></li>
+ <li> Click <strong>Create project</strong>.
+ Your browser URL will change to something like:</li>
+
+<pre> https://code.google.com/apis/console/#project:<strong>4815162342</strong></pre>
+
+ <li> Take note of the value after <code>#project:</code> (4815162342 in this example). This is your project ID, and it will be used later on as the GCM sender ID.</li>
+
+</ol>
+<h2 id="gcm-service">Enabling the GCM Service</h2>
+<p>To enable the GCM service:</p>
+<ol>
+ <li> In the main Google APIs Console page, select <strong>Services</strong>.</li>
+ <li>Turn the <strong>Google Cloud Messaging</strong> toggle to ON.</li>
+ <li>In the Terms of Service page, accept the terms.
+ </li>
+</ol>
+<h2 id="access-key">Obtaining an API Key</h2>
+<p>To obtain an API key:</p>
+<ol>
+ <li> In the main Google APIs Console page, select <strong>API Access</strong>. You will see a screen that resembles the following:</li><br />
+
+<div style="width:408px;margin:1.5em;">
+<div style="width:410px;border:1px solid #DDD;">
+<img src="{@docRoot}images/gcm/gcm-api-access.png" style="width:400px;padding:4px;margin-bottom:0em;">
+</div>
+</div>
+
+ <li>Click <strong>Create new Server key</strong>. The following screen appears:</li><br />
+
+<div style="width:408px;margin:1.5em;">
+<div style="width:410px;border:1px solid #DDD;">
+<img src="{@docRoot}images/gcm/gcm-config-server-key.png" style="width:400px;padding:4px;margin-bottom:0em;">
+</div>
+</div>
+
+ <li>Click <strong>Create</strong>:</li><br />
+
+<div style="width:408px;margin:1.5em;">
+<div style="width:410px;border:1px solid #DDD;">
+<img src="{@docRoot}images/gcm/gcm-api-key.png" style="width:400px;padding:4px;margin-bottom:0em;">
+</div>
+</div>
+
+
+</ol>
+<p> Take note of the <strong>API key</strong> value (<code>YourKeyWillBeShownHere</code>) in this example, as it will be used later on.</p>
+<p class="note"><strong>Note:</strong> If you need to rotate the key, click <strong>Generate new key</strong>. A new key will be created while the old one will still be active for up to 24 hours. If you want to get rid of the old key immediately (for example, if you feel it was compromised), click <strong>Delete key</strong>.</p>
+
+<h2 id="libs">Install the Helper Libraries</h2>
+<p>To perform the steps described in the following sections, you must first install the helper libraries (reference: <a href="{@docRoot}guide/google/gcm/client-javadoc/index.html">client</a> and <a href="{@docRoot}guide/google/gcm/server-javadoc/index.html">server</a>). From the SDK Manager, install <strong>Extras > Google Cloud Messaging for Android Library</strong>. This creates a <code>gcm</code> directory under <code><em>YOUR_SDK_ROOT</em>/extras/google/</code> containing these subdirectories: <code>gcm-client</code>, <code>gcm-demo-appengine</code>, <code>gcm-demo-client</code>, <code>gcm-demo-server</code>, and <code>gcm-server</code>.</p>
+<h2 id="android-app">Writing the Android Application</h2>
+<p>This section describes the steps involved in writing an Android application that uses GCM.</p>
+<h4>Step 1: Copy the gcm.jar file into your application classpath</h4>
+<p> To write your Android application, first copy the <code>gcm.jar</code> file from the SDK's <code>gcm-client/dist</code> directory to your application classpath.</p>
+<h4>Step 2: Make the following changes in the application's Android manifest</h4>
+<ol>
+ <li>GCM requires Android 2.2 or later, so if your application cannot work without GCM, add the following line, where <em>xx</em> is the latest target SDK version:</li>
+
+<pre class="prettyprint pretty-xml"><uses-sdk android:minSdkVersion="8" android:targetSdkVersion="xx"/></pre>
+
+ <li>Declare and use a custom permission so only this application can receive GCM messages:<br>
+ </li>
+
+<pre class="prettyprint pretty-xml"><permission android:name="my_app_package.permission.C2D_MESSAGE" android:protectionLevel="signature" />
+<uses-permission android:name="my_app_package.permission.C2D_MESSAGE" /> </pre>
+<p> This permission must be called <code>my_app_package.permission.C2D_MESSAGE</code> (where <code>my_app_package</code> is the package name of your app as defined by the manifest tag), otherwise it will not work.</p>
+<p class="note"><strong>Note:</strong> This permission is not required if you are targeting your application to 4.1 or above (i.e., minSdkVersion 16)</p>
+
+ <li>Add the permission to receive GCM messages:</li>
+
+<pre class="prettyprint pretty-xml"><uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /></pre>
+
+ <li>Add the following broadcast receiver:</li>
+
+<pre class="prettyprint pretty-xml"><receiver android:name="com.google.android.gcm.GCMBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND" >
+ <intent-filter>
+ <action android:name="com.google.android.c2dm.intent.RECEIVE" />
+ <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
+ <category android:name="my_app_package" />
+ </intent-filter>
+</receiver></pre>
+<p> This broadcast receiver is responsible for handling the 2 intents that can be sent by GCM (<code>com.google.android.c2dm.intent.RECEIVE</code> and <code>com.google.android.c2dm.intent.REGISTRATION</code>) and should be defined in the manifest (rather than programmatically) so that these intents can be received even if the application is not running. By setting the <code>com.google.android.c2dm.permission.SEND</code> permission, you are ensuring that only intents sent by the GCM system framework are sent to the receiver (a regular application cannot issue intents with that permission).</p>
+<p> Notice that <code>android:name</code> in the category tag must be replaced by your application's package name (and the category tag is not required for applications targeted to minSdkVersion 16 and higher).<br>
+ </p>
+
+ <li>Add the following intent service:</li>
+
+
+ <pre class="prettyprint pretty-xml"><service android:name=".GCMIntentService" /></pre>
+
+</ol>
+<p> This intent service will be called by the <code>GCMBroadcastReceiver</code> (which is is provided by GCM library), as shown in the next step. It must be named <code>my_app_package.GCMIntentService</code>, unless you use a subclass of <code>GCMBroadcastReceiver</code> that overrides the method used to name the service.</p>
+<h4><br>
+ Step 3: Write the my_app_package.GCMIntentService class</h4>
+<p>Next write the <code>my_app_package.GCMIntentService</code> class, overriding the following callback methods (which are called by <code>GCMBroadcastReceiver</code>):<br>
+</p>
+<ul>
+ <li><code>onRegistered(Context context, String regId)</code>: Called after a registration intent is received, passes the registration ID assigned by GCM to that device/application pair as parameter. Typically, you should send the <code>regid</code> to your server so it can use it to send messages to this device.</li>
+ <li><code>onUnregistered(Context context, String regId)</code>: Called after the device has been unregistered from GCM. Typically, you should send the <code>regid</code> to the server so it unregisters the device.</li>
+ <li><code>onMessage(Context context, Intent intent)</code>: Called when your server sends a message to GCM, and GCM delivers it to the device. If the message has a payload, its contents are available as extras in the intent.</li>
+ <li><code>onError(Context context, String errorId)</code>: Called when the device tries to register or unregister, but GCM returned an error. Typically, there is nothing to be done other than evaluating the error (returned by errorId) and trying to fix the problem.</li>
+ <li> <code>onRecoverableError(Context context, String errorId)</code>: Called when the device tries to register or unregister, but the GCM servers are unavailable. The GCM library will retry the operation using exponential backup, unless this method is overridden and returns false. This method is optional and should be overridden only if you want to display the message to the user or cancel the retry attempts.
+ </li>
+</ul>
+
+<p class="note"><strong>Note:</strong> The methods above run in the intent service's thread and hence are free to make network calls without the risk of blocking the UI thread.</p>
+
+<h4> Step 4: Write your application's main activity</h4>
+Add the following import statement in your application's main activity:
+<pre class="prettyprint pretty-java">import com.google.android.gcm.GCMRegistrar;</pre>
+<p> In the <code>onCreate()</code> method, add the following code:</p>
+<pre class="prettyprint pretty-java">GCMRegistrar.checkDevice(this);
+GCMRegistrar.checkManifest(this);
+final String regId = GCMRegistrar.getRegistrationId(this);
+if (regId.equals("")) {
+ GCMRegistrar.register(this, SENDER_ID);
+} else {
+ Log.v(TAG, "Already registered");
+}</pre>
+<p>The <code>checkDevice()</code> method verifies that the device supports GCM and throws an exception if it does not (for instance, if it is an emulator that does not contain the Google APIs). Similarly, the <code>checkManifest()</code> method verifies that the application manifest contains meets all the requirements described in <a href="#android-app">Writing the Android Application</a> (this method is only necessary when you are developing the application; once the application is ready to be published, you can remove it).</p>
+
+<p>Once the sanity checks are done, the device calls <code>GCMRegsistrar.register()</code> to register the device, passing the <code>SENDER_ID</code> you got when you signed up for GCM. But since the <code>GCMRegistrar</code> singleton keeps track of the registration ID upon the arrival of registration intents, you can call <code>GCMRegistrar.getRegistrationId()</code> first to check if the device is already registered.</p>
+<p class="note"><strong>Note:</strong> It is possible that the device was successfully registered to GCM but failed to send the registration ID to your server, in which case you should retry. See <a href="adv.html#reg-state">Advanced Topics</a> for more details on how to handle this scenario.</p>
+
+<h2 id="server-app">Writing the Server-side Application</h2>
+
+<p>To write the server-side application:</p>
+<ol>
+ <li> Copy the <code>gcm-server.jar</code> file from the SDK's <code>gcm-server/dist</code> directory to your server classpath.</li>
+ <li>Create a servlet (or other server-side mechanism) that can be used by the Android application to send the registration ID received by GCM . The application might also need to send other information—such as the user's email address or username—so that the server can associate the registration ID with the user owning the device.</li>
+ <li>Similarly, create a servlet used to unregister registration IDs.<br>
+ </li>
+ <li>When the server needs to send a message to the device, it can use the <code>com.google.android.gcm.server.Sender</code> helper class from the GCM library. For example:</li>
+</ol>
+
+<pre class="prettyprint pretty-java">import com.google.android.gcm.server.*;
+
+Sender sender = new Sender(myApiKey);
+Message message = new Message.Builder(regId).build();
+Result result = sender.send(message, 5);</pre>
+
+<p> The snippet above does the following:
+<ul>
+<li>Creates a <code>Sender</code> object using your project's API key.</li>
+<li>Creates a message using a given registration ID (the message builder also has methods to set all message parameters such as the collapse key and payload data).</li>
+<li>Sends the message with a maximum of 5 retry attempts (in case the GCM servers are unavailable), and stores the response on result. </li>
+</ul>
+<p>It's now necessary to parse the result and take the proper action in the following cases:</p>
+<ul>
+ <li>If the message was created but the result returned a canonical registration ID, it's necessary to replace the current registration ID with the canonical one.</li>
+ <li>If the returned error is <code>NotRegistered</code>, it's necessary to remove that registration ID, because the application was uninstalled from the device.</li>
+</ul>
+<p> Here's a code snippet that handles these 2 conditions:</p>
+<pre class="prettyprint pretty-java">
+if (result.getMessageId() != null) {
+ String canonicalRegId = result.getCanonicalRegistrationId();
+ if (canonicalRegId != null) {
+ // same device has more than on registration ID: update database
+ }
+} else {
+ String error = result.getErrorCodeName();
+ if (error.equals(Constants.ERROR_NOT_REGISTERED)) {
+ // application has been removed from device - unregister database
+ }
+}</pre>
diff --git a/docs/html/guide/google/gcm/index.jd b/docs/html/guide/google/gcm/index.jd
new file mode 100644
index 0000000..cba8d0b
--- /dev/null
+++ b/docs/html/guide/google/gcm/index.jd
@@ -0,0 +1,25 @@
+page.title=Google Cloud Messaging for Android
+@jd:body
+
+
+<p><img src="{@docRoot}images/gcm/gcm-logo.png" /></p>
+<p>Google Cloud Messaging for Android (GCM) is a service that helps developers send data from servers to their Android applications on Android devices. This could be a lightweight message telling the Android application that there is new data to be fetched from the server (for instance, a movie uploaded by a friend), or it could be a message containing up to 4kb of payload data (so apps like instant messaging can consume the message directly). The GCM service handles all aspects of queueing of messages and delivery to the target Android application running on the target device.</p>
+
+<p>To learn more about GCM, read the following documents:</p>
+
+<dl>
+ <dt><strong><a href="{@docRoot}guide/google/gcm/gs.html">Getting Started</a></strong></dt>
+ <dd>Read this document to learn the basic steps involved in developing Android applications based on GCM.</dd>
+ <dt><strong><a href="{@docRoot}guide/google/gcm/gcm.html">Architectural Overview</a></strong></dt>
+ <dd>Read this document for a description of the underlying concepts and architecture in GCM.</dd>
+ <dt><strong><a href="{@docRoot}guide/google/gcm/demo.html">Demo App Tutorial</a></strong></dt>
+ <dd>Read this document to walk through setting up and running the GCM demo app.</dd>
+ <dt><strong><a href="{@docRoot}guide/google/gcm/adv.html">Advanced Topics</a></strong></dt>
+ <dd>Read this document to get a more in-depth understanding of key GCM features.</dd>
+ <dt><a href="{@docRoot}guide/google/gcm/c2dm.html"><strong>Migration</strong></a></dt>
+ <dd>Read this document if you are a C2DM developer moving to GCM.</dd>
+</dl>
+
+<p>GCM also provides helper libraries for <a href="{@docRoot}guide/google/gcm/client-javadoc/index.html"><strong>client</strong></a> and <a href="{@docRoot}guide/google/gcm/server-javadoc/index.html"><strong>server</strong></a> development.</p>
+
+
diff --git a/docs/html/guide/google/gcm/server-javadoc/allclasses-frame.html b/docs/html/guide/google/gcm/server-javadoc/allclasses-frame.html
new file mode 100644
index 0000000..d2fe43d
--- /dev/null
+++ b/docs/html/guide/google/gcm/server-javadoc/allclasses-frame.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_20) on Thu Jun 21 12:04:57 PDT 2012 -->
+<TITLE>
+All Classes
+</TITLE>
+
+<META NAME="date" CONTENT="2012-06-21">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+
+
+</HEAD>
+
+<BODY BGCOLOR="white">
+<FONT size="+1" CLASS="FrameHeadingFont">
+<B>All Classes</B></FONT>
+<BR>
+
+<TABLE BORDER="0" WIDTH="100%" SUMMARY="">
+<TR>
+<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="com/google/android/gcm/server/Constants.html" title="class in com.google.android.gcm.server" target="classFrame">Constants</A>
+<BR>
+<A HREF="com/google/android/gcm/server/InvalidRequestException.html" title="class in com.google.android.gcm.server" target="classFrame">InvalidRequestException</A>
+<BR>
+<A HREF="com/google/android/gcm/server/Message.html" title="class in com.google.android.gcm.server" target="classFrame">Message</A>
+<BR>
+<A HREF="com/google/android/gcm/server/Message.Builder.html" title="class in com.google.android.gcm.server" target="classFrame">Message.Builder</A>
+<BR>
+<A HREF="com/google/android/gcm/server/MulticastResult.html" title="class in com.google.android.gcm.server" target="classFrame">MulticastResult</A>
+<BR>
+<A HREF="com/google/android/gcm/server/Result.html" title="class in com.google.android.gcm.server" target="classFrame">Result</A>
+<BR>
+<A HREF="com/google/android/gcm/server/Sender.html" title="class in com.google.android.gcm.server" target="classFrame">Sender</A>
+<BR>
+</FONT></TD>
+</TR>
+</TABLE>
+
+</BODY>
+</HTML>
diff --git a/docs/html/guide/google/gcm/server-javadoc/allclasses-noframe.html b/docs/html/guide/google/gcm/server-javadoc/allclasses-noframe.html
new file mode 100644
index 0000000..0f0dc96
--- /dev/null
+++ b/docs/html/guide/google/gcm/server-javadoc/allclasses-noframe.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_20) on Thu Jun 21 12:04:57 PDT 2012 -->
+<TITLE>
+All Classes
+</TITLE>
+
+<META NAME="date" CONTENT="2012-06-21">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+
+
+</HEAD>
+
+<BODY BGCOLOR="white">
+<FONT size="+1" CLASS="FrameHeadingFont">
+<B>All Classes</B></FONT>
+<BR>
+
+<TABLE BORDER="0" WIDTH="100%" SUMMARY="">
+<TR>
+<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="com/google/android/gcm/server/Constants.html" title="class in com.google.android.gcm.server">Constants</A>
+<BR>
+<A HREF="com/google/android/gcm/server/InvalidRequestException.html" title="class in com.google.android.gcm.server">InvalidRequestException</A>
+<BR>
+<A HREF="com/google/android/gcm/server/Message.html" title="class in com.google.android.gcm.server">Message</A>
+<BR>
+<A HREF="com/google/android/gcm/server/Message.Builder.html" title="class in com.google.android.gcm.server">Message.Builder</A>
+<BR>
+<A HREF="com/google/android/gcm/server/MulticastResult.html" title="class in com.google.android.gcm.server">MulticastResult</A>
+<BR>
+<A HREF="com/google/android/gcm/server/Result.html" title="class in com.google.android.gcm.server">Result</A>
+<BR>
+<A HREF="com/google/android/gcm/server/Sender.html" title="class in com.google.android.gcm.server">Sender</A>
+<BR>
+</FONT></TD>
+</TR>
+</TABLE>
+
+</BODY>
+</HTML>
diff --git a/docs/html/guide/google/gcm/server-javadoc/com/google/android/gcm/server/Constants.html b/docs/html/guide/google/gcm/server-javadoc/com/google/android/gcm/server/Constants.html
new file mode 100644
index 0000000..09ac011
--- /dev/null
+++ b/docs/html/guide/google/gcm/server-javadoc/com/google/android/gcm/server/Constants.html
@@ -0,0 +1,764 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_20) on Thu Jun 21 12:04:56 PDT 2012 -->
+<TITLE>
+Constants
+</TITLE>
+
+<META NAME="date" CONTENT="2012-06-21">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+ if (location.href.indexOf('is-external=true') == -1) {
+ parent.document.title="Constants";
+ }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../com/google/android/gcm/server/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV CLASS
+ <A HREF="../../../../../com/google/android/gcm/server/InvalidRequestException.html" title="class in com.google.android.gcm.server"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../../index.html?com/google/android/gcm/server/Constants.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="Constants.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+ SUMMARY: NESTED | <A HREF="#field_summary">FIELD</A> | CONSTR | <A HREF="#methods_inherited_from_class_java.lang.Object">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: <A HREF="#field_detail">FIELD</A> | CONSTR | METHOD</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<!-- ======== START OF CLASS DATA ======== -->
+<H2>
+<FONT SIZE="-1">
+com.google.android.gcm.server</FONT>
+<BR>
+Class Constants</H2>
+<PRE>
+java.lang.Object
+ <IMG SRC="../../../../../resources/inherit.gif" ALT="extended by "><B>com.google.android.gcm.server.Constants</B>
+</PRE>
+<HR>
+<DL>
+<DT><PRE>public final class <B>Constants</B><DT>extends java.lang.Object</DL>
+</PRE>
+
+<P>
+Constants used on GCM service communication.
+<P>
+
+<P>
+<HR>
+
+<P>
+<!-- =========== FIELD SUMMARY =========== -->
+
+<A NAME="field_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Field Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Constants.html#ERROR_DEVICE_QUOTA_EXCEEDED">ERROR_DEVICE_QUOTA_EXCEEDED</A></B></CODE>
+
+<BR>
+ Too many messages sent by the sender to a specific device.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Constants.html#ERROR_INVALID_REGISTRATION">ERROR_INVALID_REGISTRATION</A></B></CODE>
+
+<BR>
+ Bad registration_id.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Constants.html#ERROR_MESSAGE_TOO_BIG">ERROR_MESSAGE_TOO_BIG</A></B></CODE>
+
+<BR>
+ The payload of the message is too big, see the limitations.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Constants.html#ERROR_MISMATCH_SENDER_ID">ERROR_MISMATCH_SENDER_ID</A></B></CODE>
+
+<BR>
+ The sender_id contained in the registration_id does not match the
+ sender_id used to register with the GCM servers.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Constants.html#ERROR_MISSING_COLLAPSE_KEY">ERROR_MISSING_COLLAPSE_KEY</A></B></CODE>
+
+<BR>
+ Collapse key is required.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Constants.html#ERROR_MISSING_REGISTRATION">ERROR_MISSING_REGISTRATION</A></B></CODE>
+
+<BR>
+ Missing registration_id.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Constants.html#ERROR_NOT_REGISTERED">ERROR_NOT_REGISTERED</A></B></CODE>
+
+<BR>
+ The user has uninstalled the application or turned off notifications.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Constants.html#ERROR_QUOTA_EXCEEDED">ERROR_QUOTA_EXCEEDED</A></B></CODE>
+
+<BR>
+ Too many messages sent by the sender.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Constants.html#ERROR_UNAVAILABLE">ERROR_UNAVAILABLE</A></B></CODE>
+
+<BR>
+ Used to indicate that a particular message could not be sent because
+ the GCM servers were not available.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Constants.html#GCM_SEND_ENDPOINT">GCM_SEND_ENDPOINT</A></B></CODE>
+
+<BR>
+ Endpoint for sending messages.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Constants.html#JSON_CANONICAL_IDS">JSON_CANONICAL_IDS</A></B></CODE>
+
+<BR>
+ JSON-only field representing the number of messages with a canonical
+ registration id.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Constants.html#JSON_ERROR">JSON_ERROR</A></B></CODE>
+
+<BR>
+ JSON-only field representing the error field of an individual request.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Constants.html#JSON_FAILURE">JSON_FAILURE</A></B></CODE>
+
+<BR>
+ JSON-only field representing the number of failed messages.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Constants.html#JSON_MESSAGE_ID">JSON_MESSAGE_ID</A></B></CODE>
+
+<BR>
+ JSON-only field sent by GCM when a message was successfully sent.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Constants.html#JSON_MULTICAST_ID">JSON_MULTICAST_ID</A></B></CODE>
+
+<BR>
+ JSON-only field representing the id of the multicast request.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Constants.html#JSON_PAYLOAD">JSON_PAYLOAD</A></B></CODE>
+
+<BR>
+ JSON-only field representing the payload data.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Constants.html#JSON_REGISTRATION_IDS">JSON_REGISTRATION_IDS</A></B></CODE>
+
+<BR>
+ JSON-only field representing the registration ids.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Constants.html#JSON_RESULTS">JSON_RESULTS</A></B></CODE>
+
+<BR>
+ JSON-only field representing the result of each individual request.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Constants.html#JSON_SUCCESS">JSON_SUCCESS</A></B></CODE>
+
+<BR>
+ JSON-only field representing the number of successful messages.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Constants.html#PARAM_COLLAPSE_KEY">PARAM_COLLAPSE_KEY</A></B></CODE>
+
+<BR>
+ HTTP parameter for collapse key.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Constants.html#PARAM_DELAY_WHILE_IDLE">PARAM_DELAY_WHILE_IDLE</A></B></CODE>
+
+<BR>
+ HTTP parameter for delaying the message delivery if the device is idle.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Constants.html#PARAM_PAYLOAD_PREFIX">PARAM_PAYLOAD_PREFIX</A></B></CODE>
+
+<BR>
+ Prefix to HTTP parameter used to pass key-values in the message payload.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Constants.html#PARAM_REGISTRATION_ID">PARAM_REGISTRATION_ID</A></B></CODE>
+
+<BR>
+ HTTP parameter for registration id.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Constants.html#PARAM_TIME_TO_LIVE">PARAM_TIME_TO_LIVE</A></B></CODE>
+
+<BR>
+ Prefix to HTTP parameter used to set the message time-to-live.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Constants.html#TOKEN_CANONICAL_REG_ID">TOKEN_CANONICAL_REG_ID</A></B></CODE>
+
+<BR>
+ Token returned by GCM when the requested registration id has a canonical
+ value.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Constants.html#TOKEN_ERROR">TOKEN_ERROR</A></B></CODE>
+
+<BR>
+ Token returned by GCM when there was an error sending a message.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Constants.html#TOKEN_MESSAGE_ID">TOKEN_MESSAGE_ID</A></B></CODE>
+
+<BR>
+ Token returned by GCM when a message was successfully sent.</TD>
+</TR>
+</TABLE>
+
+<!-- ========== METHOD SUMMARY =========== -->
+
+<A NAME="method_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Method Summary</B></FONT></TH>
+</TR>
+</TABLE>
+ <A NAME="methods_inherited_from_class_java.lang.Object"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left"><B>Methods inherited from class java.lang.Object</B></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE>clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait</CODE></TD>
+</TR>
+</TABLE>
+
+<P>
+
+<!-- ============ FIELD DETAIL =========== -->
+
+<A NAME="field_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Field Detail</B></FONT></TH>
+</TR>
+</TABLE>
+
+<A NAME="GCM_SEND_ENDPOINT"><!-- --></A><H3>
+GCM_SEND_ENDPOINT</H3>
+<PRE>
+public static final java.lang.String <B>GCM_SEND_ENDPOINT</B></PRE>
+<DL>
+<DD>Endpoint for sending messages.
+<P>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../../../constant-values.html#com.google.android.gcm.server.Constants.GCM_SEND_ENDPOINT">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="PARAM_REGISTRATION_ID"><!-- --></A><H3>
+PARAM_REGISTRATION_ID</H3>
+<PRE>
+public static final java.lang.String <B>PARAM_REGISTRATION_ID</B></PRE>
+<DL>
+<DD>HTTP parameter for registration id.
+<P>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../../../constant-values.html#com.google.android.gcm.server.Constants.PARAM_REGISTRATION_ID">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="PARAM_COLLAPSE_KEY"><!-- --></A><H3>
+PARAM_COLLAPSE_KEY</H3>
+<PRE>
+public static final java.lang.String <B>PARAM_COLLAPSE_KEY</B></PRE>
+<DL>
+<DD>HTTP parameter for collapse key.
+<P>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../../../constant-values.html#com.google.android.gcm.server.Constants.PARAM_COLLAPSE_KEY">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="PARAM_DELAY_WHILE_IDLE"><!-- --></A><H3>
+PARAM_DELAY_WHILE_IDLE</H3>
+<PRE>
+public static final java.lang.String <B>PARAM_DELAY_WHILE_IDLE</B></PRE>
+<DL>
+<DD>HTTP parameter for delaying the message delivery if the device is idle.
+<P>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../../../constant-values.html#com.google.android.gcm.server.Constants.PARAM_DELAY_WHILE_IDLE">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="PARAM_PAYLOAD_PREFIX"><!-- --></A><H3>
+PARAM_PAYLOAD_PREFIX</H3>
+<PRE>
+public static final java.lang.String <B>PARAM_PAYLOAD_PREFIX</B></PRE>
+<DL>
+<DD>Prefix to HTTP parameter used to pass key-values in the message payload.
+<P>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../../../constant-values.html#com.google.android.gcm.server.Constants.PARAM_PAYLOAD_PREFIX">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="PARAM_TIME_TO_LIVE"><!-- --></A><H3>
+PARAM_TIME_TO_LIVE</H3>
+<PRE>
+public static final java.lang.String <B>PARAM_TIME_TO_LIVE</B></PRE>
+<DL>
+<DD>Prefix to HTTP parameter used to set the message time-to-live.
+<P>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../../../constant-values.html#com.google.android.gcm.server.Constants.PARAM_TIME_TO_LIVE">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="ERROR_QUOTA_EXCEEDED"><!-- --></A><H3>
+ERROR_QUOTA_EXCEEDED</H3>
+<PRE>
+public static final java.lang.String <B>ERROR_QUOTA_EXCEEDED</B></PRE>
+<DL>
+<DD>Too many messages sent by the sender. Retry after a while.
+<P>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../../../constant-values.html#com.google.android.gcm.server.Constants.ERROR_QUOTA_EXCEEDED">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="ERROR_DEVICE_QUOTA_EXCEEDED"><!-- --></A><H3>
+ERROR_DEVICE_QUOTA_EXCEEDED</H3>
+<PRE>
+public static final java.lang.String <B>ERROR_DEVICE_QUOTA_EXCEEDED</B></PRE>
+<DL>
+<DD>Too many messages sent by the sender to a specific device.
+ Retry after a while.
+<P>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../../../constant-values.html#com.google.android.gcm.server.Constants.ERROR_DEVICE_QUOTA_EXCEEDED">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="ERROR_MISSING_REGISTRATION"><!-- --></A><H3>
+ERROR_MISSING_REGISTRATION</H3>
+<PRE>
+public static final java.lang.String <B>ERROR_MISSING_REGISTRATION</B></PRE>
+<DL>
+<DD>Missing registration_id.
+ Sender should always add the registration_id to the request.
+<P>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../../../constant-values.html#com.google.android.gcm.server.Constants.ERROR_MISSING_REGISTRATION">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="ERROR_INVALID_REGISTRATION"><!-- --></A><H3>
+ERROR_INVALID_REGISTRATION</H3>
+<PRE>
+public static final java.lang.String <B>ERROR_INVALID_REGISTRATION</B></PRE>
+<DL>
+<DD>Bad registration_id. Sender should remove this registration_id.
+<P>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../../../constant-values.html#com.google.android.gcm.server.Constants.ERROR_INVALID_REGISTRATION">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="ERROR_MISMATCH_SENDER_ID"><!-- --></A><H3>
+ERROR_MISMATCH_SENDER_ID</H3>
+<PRE>
+public static final java.lang.String <B>ERROR_MISMATCH_SENDER_ID</B></PRE>
+<DL>
+<DD>The sender_id contained in the registration_id does not match the
+ sender_id used to register with the GCM servers.
+<P>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../../../constant-values.html#com.google.android.gcm.server.Constants.ERROR_MISMATCH_SENDER_ID">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="ERROR_NOT_REGISTERED"><!-- --></A><H3>
+ERROR_NOT_REGISTERED</H3>
+<PRE>
+public static final java.lang.String <B>ERROR_NOT_REGISTERED</B></PRE>
+<DL>
+<DD>The user has uninstalled the application or turned off notifications.
+ Sender should stop sending messages to this device and delete the
+ registration_id. The client needs to re-register with the GCM servers to
+ receive notifications again.
+<P>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../../../constant-values.html#com.google.android.gcm.server.Constants.ERROR_NOT_REGISTERED">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="ERROR_MESSAGE_TOO_BIG"><!-- --></A><H3>
+ERROR_MESSAGE_TOO_BIG</H3>
+<PRE>
+public static final java.lang.String <B>ERROR_MESSAGE_TOO_BIG</B></PRE>
+<DL>
+<DD>The payload of the message is too big, see the limitations.
+ Reduce the size of the message.
+<P>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../../../constant-values.html#com.google.android.gcm.server.Constants.ERROR_MESSAGE_TOO_BIG">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="ERROR_MISSING_COLLAPSE_KEY"><!-- --></A><H3>
+ERROR_MISSING_COLLAPSE_KEY</H3>
+<PRE>
+public static final java.lang.String <B>ERROR_MISSING_COLLAPSE_KEY</B></PRE>
+<DL>
+<DD>Collapse key is required. Include collapse key in the request.
+<P>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../../../constant-values.html#com.google.android.gcm.server.Constants.ERROR_MISSING_COLLAPSE_KEY">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="ERROR_UNAVAILABLE"><!-- --></A><H3>
+ERROR_UNAVAILABLE</H3>
+<PRE>
+public static final java.lang.String <B>ERROR_UNAVAILABLE</B></PRE>
+<DL>
+<DD>Used to indicate that a particular message could not be sent because
+ the GCM servers were not available. Used only on JSON requests, as in
+ plain text requests unavailability is indicated by a 503 response.
+<P>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../../../constant-values.html#com.google.android.gcm.server.Constants.ERROR_UNAVAILABLE">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="TOKEN_MESSAGE_ID"><!-- --></A><H3>
+TOKEN_MESSAGE_ID</H3>
+<PRE>
+public static final java.lang.String <B>TOKEN_MESSAGE_ID</B></PRE>
+<DL>
+<DD>Token returned by GCM when a message was successfully sent.
+<P>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../../../constant-values.html#com.google.android.gcm.server.Constants.TOKEN_MESSAGE_ID">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="TOKEN_CANONICAL_REG_ID"><!-- --></A><H3>
+TOKEN_CANONICAL_REG_ID</H3>
+<PRE>
+public static final java.lang.String <B>TOKEN_CANONICAL_REG_ID</B></PRE>
+<DL>
+<DD>Token returned by GCM when the requested registration id has a canonical
+ value.
+<P>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../../../constant-values.html#com.google.android.gcm.server.Constants.TOKEN_CANONICAL_REG_ID">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="TOKEN_ERROR"><!-- --></A><H3>
+TOKEN_ERROR</H3>
+<PRE>
+public static final java.lang.String <B>TOKEN_ERROR</B></PRE>
+<DL>
+<DD>Token returned by GCM when there was an error sending a message.
+<P>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../../../constant-values.html#com.google.android.gcm.server.Constants.TOKEN_ERROR">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="JSON_REGISTRATION_IDS"><!-- --></A><H3>
+JSON_REGISTRATION_IDS</H3>
+<PRE>
+public static final java.lang.String <B>JSON_REGISTRATION_IDS</B></PRE>
+<DL>
+<DD>JSON-only field representing the registration ids.
+<P>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../../../constant-values.html#com.google.android.gcm.server.Constants.JSON_REGISTRATION_IDS">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="JSON_PAYLOAD"><!-- --></A><H3>
+JSON_PAYLOAD</H3>
+<PRE>
+public static final java.lang.String <B>JSON_PAYLOAD</B></PRE>
+<DL>
+<DD>JSON-only field representing the payload data.
+<P>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../../../constant-values.html#com.google.android.gcm.server.Constants.JSON_PAYLOAD">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="JSON_SUCCESS"><!-- --></A><H3>
+JSON_SUCCESS</H3>
+<PRE>
+public static final java.lang.String <B>JSON_SUCCESS</B></PRE>
+<DL>
+<DD>JSON-only field representing the number of successful messages.
+<P>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../../../constant-values.html#com.google.android.gcm.server.Constants.JSON_SUCCESS">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="JSON_FAILURE"><!-- --></A><H3>
+JSON_FAILURE</H3>
+<PRE>
+public static final java.lang.String <B>JSON_FAILURE</B></PRE>
+<DL>
+<DD>JSON-only field representing the number of failed messages.
+<P>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../../../constant-values.html#com.google.android.gcm.server.Constants.JSON_FAILURE">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="JSON_CANONICAL_IDS"><!-- --></A><H3>
+JSON_CANONICAL_IDS</H3>
+<PRE>
+public static final java.lang.String <B>JSON_CANONICAL_IDS</B></PRE>
+<DL>
+<DD>JSON-only field representing the number of messages with a canonical
+ registration id.
+<P>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../../../constant-values.html#com.google.android.gcm.server.Constants.JSON_CANONICAL_IDS">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="JSON_MULTICAST_ID"><!-- --></A><H3>
+JSON_MULTICAST_ID</H3>
+<PRE>
+public static final java.lang.String <B>JSON_MULTICAST_ID</B></PRE>
+<DL>
+<DD>JSON-only field representing the id of the multicast request.
+<P>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../../../constant-values.html#com.google.android.gcm.server.Constants.JSON_MULTICAST_ID">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="JSON_RESULTS"><!-- --></A><H3>
+JSON_RESULTS</H3>
+<PRE>
+public static final java.lang.String <B>JSON_RESULTS</B></PRE>
+<DL>
+<DD>JSON-only field representing the result of each individual request.
+<P>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../../../constant-values.html#com.google.android.gcm.server.Constants.JSON_RESULTS">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="JSON_ERROR"><!-- --></A><H3>
+JSON_ERROR</H3>
+<PRE>
+public static final java.lang.String <B>JSON_ERROR</B></PRE>
+<DL>
+<DD>JSON-only field representing the error field of an individual request.
+<P>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../../../constant-values.html#com.google.android.gcm.server.Constants.JSON_ERROR">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="JSON_MESSAGE_ID"><!-- --></A><H3>
+JSON_MESSAGE_ID</H3>
+<PRE>
+public static final java.lang.String <B>JSON_MESSAGE_ID</B></PRE>
+<DL>
+<DD>JSON-only field sent by GCM when a message was successfully sent.
+<P>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../../../constant-values.html#com.google.android.gcm.server.Constants.JSON_MESSAGE_ID">Constant Field Values</A></DL>
+</DL>
+<!-- ========= END OF CLASS DATA ========= -->
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../com/google/android/gcm/server/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV CLASS
+ <A HREF="../../../../../com/google/android/gcm/server/InvalidRequestException.html" title="class in com.google.android.gcm.server"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../../index.html?com/google/android/gcm/server/Constants.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="Constants.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+ SUMMARY: NESTED | <A HREF="#field_summary">FIELD</A> | CONSTR | <A HREF="#methods_inherited_from_class_java.lang.Object">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: <A HREF="#field_detail">FIELD</A> | CONSTR | METHOD</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+
+</BODY>
+</HTML>
diff --git a/docs/html/guide/google/gcm/server-javadoc/com/google/android/gcm/server/InvalidRequestException.html b/docs/html/guide/google/gcm/server-javadoc/com/google/android/gcm/server/InvalidRequestException.html
new file mode 100644
index 0000000..4b3271c
--- /dev/null
+++ b/docs/html/guide/google/gcm/server-javadoc/com/google/android/gcm/server/InvalidRequestException.html
@@ -0,0 +1,310 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_20) on Thu Jun 21 12:04:56 PDT 2012 -->
+<TITLE>
+InvalidRequestException
+</TITLE>
+
+<META NAME="date" CONTENT="2012-06-21">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+ if (location.href.indexOf('is-external=true') == -1) {
+ parent.document.title="InvalidRequestException";
+ }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../com/google/android/gcm/server/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../../com/google/android/gcm/server/Constants.html" title="class in com.google.android.gcm.server"><B>PREV CLASS</B></A>
+ <A HREF="../../../../../com/google/android/gcm/server/Message.html" title="class in com.google.android.gcm.server"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../../index.html?com/google/android/gcm/server/InvalidRequestException.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="InvalidRequestException.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+ SUMMARY: NESTED | FIELD | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: FIELD | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<!-- ======== START OF CLASS DATA ======== -->
+<H2>
+<FONT SIZE="-1">
+com.google.android.gcm.server</FONT>
+<BR>
+Class InvalidRequestException</H2>
+<PRE>
+java.lang.Object
+ <IMG SRC="../../../../../resources/inherit.gif" ALT="extended by ">java.lang.Throwable
+ <IMG SRC="../../../../../resources/inherit.gif" ALT="extended by ">java.lang.Exception
+ <IMG SRC="../../../../../resources/inherit.gif" ALT="extended by ">java.io.IOException
+ <IMG SRC="../../../../../resources/inherit.gif" ALT="extended by "><B>com.google.android.gcm.server.InvalidRequestException</B>
+</PRE>
+<DL>
+<DT><B>All Implemented Interfaces:</B> <DD>java.io.Serializable</DD>
+</DL>
+<HR>
+<DL>
+<DT><PRE>public final class <B>InvalidRequestException</B><DT>extends java.io.IOException</DL>
+</PRE>
+
+<P>
+Exception thrown when GCM returned an error due to an invalid request.
+ <p>
+ This is equivalent to GCM posts that return an HTTP error different of 200.
+<P>
+
+<P>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../../../serialized-form.html#com.google.android.gcm.server.InvalidRequestException">Serialized Form</A></DL>
+<HR>
+
+<P>
+
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+
+<A NAME="constructor_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Constructor Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/InvalidRequestException.html#InvalidRequestException(int)">InvalidRequestException</A></B>(int status)</CODE>
+
+<BR>
+ </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/InvalidRequestException.html#InvalidRequestException(int, java.lang.String)">InvalidRequestException</A></B>(int status,
+ java.lang.String description)</CODE>
+
+<BR>
+ </TD>
+</TR>
+</TABLE>
+
+<!-- ========== METHOD SUMMARY =========== -->
+
+<A NAME="method_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Method Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/InvalidRequestException.html#getDescription()">getDescription</A></B>()</CODE>
+
+<BR>
+ Gets the error description.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/InvalidRequestException.html#getHttpStatusCode()">getHttpStatusCode</A></B>()</CODE>
+
+<BR>
+ Gets the HTTP Status Code.</TD>
+</TR>
+</TABLE>
+ <A NAME="methods_inherited_from_class_java.lang.Throwable"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left"><B>Methods inherited from class java.lang.Throwable</B></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE>fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString</CODE></TD>
+</TR>
+</TABLE>
+ <A NAME="methods_inherited_from_class_java.lang.Object"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left"><B>Methods inherited from class java.lang.Object</B></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE>clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait</CODE></TD>
+</TR>
+</TABLE>
+
+<P>
+
+<!-- ========= CONSTRUCTOR DETAIL ======== -->
+
+<A NAME="constructor_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Constructor Detail</B></FONT></TH>
+</TR>
+</TABLE>
+
+<A NAME="InvalidRequestException(int)"><!-- --></A><H3>
+InvalidRequestException</H3>
+<PRE>
+public <B>InvalidRequestException</B>(int status)</PRE>
+<DL>
+</DL>
+<HR>
+
+<A NAME="InvalidRequestException(int, java.lang.String)"><!-- --></A><H3>
+InvalidRequestException</H3>
+<PRE>
+public <B>InvalidRequestException</B>(int status,
+ java.lang.String description)</PRE>
+<DL>
+</DL>
+
+<!-- ============ METHOD DETAIL ========== -->
+
+<A NAME="method_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Method Detail</B></FONT></TH>
+</TR>
+</TABLE>
+
+<A NAME="getHttpStatusCode()"><!-- --></A><H3>
+getHttpStatusCode</H3>
+<PRE>
+public int <B>getHttpStatusCode</B>()</PRE>
+<DL>
+<DD>Gets the HTTP Status Code.
+<P>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="getDescription()"><!-- --></A><H3>
+getDescription</H3>
+<PRE>
+public java.lang.String <B>getDescription</B>()</PRE>
+<DL>
+<DD>Gets the error description.
+<P>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<!-- ========= END OF CLASS DATA ========= -->
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../com/google/android/gcm/server/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../../com/google/android/gcm/server/Constants.html" title="class in com.google.android.gcm.server"><B>PREV CLASS</B></A>
+ <A HREF="../../../../../com/google/android/gcm/server/Message.html" title="class in com.google.android.gcm.server"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../../index.html?com/google/android/gcm/server/InvalidRequestException.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="InvalidRequestException.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+ SUMMARY: NESTED | FIELD | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: FIELD | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+
+</BODY>
+</HTML>
diff --git a/docs/html/guide/google/gcm/server-javadoc/com/google/android/gcm/server/Message.Builder.html b/docs/html/guide/google/gcm/server-javadoc/com/google/android/gcm/server/Message.Builder.html
new file mode 100644
index 0000000..5952e87
--- /dev/null
+++ b/docs/html/guide/google/gcm/server-javadoc/com/google/android/gcm/server/Message.Builder.html
@@ -0,0 +1,337 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_20) on Thu Jun 21 12:04:57 PDT 2012 -->
+<TITLE>
+Message.Builder
+</TITLE>
+
+<META NAME="date" CONTENT="2012-06-21">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+ if (location.href.indexOf('is-external=true') == -1) {
+ parent.document.title="Message.Builder";
+ }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../com/google/android/gcm/server/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../../com/google/android/gcm/server/Message.html" title="class in com.google.android.gcm.server"><B>PREV CLASS</B></A>
+ <A HREF="../../../../../com/google/android/gcm/server/MulticastResult.html" title="class in com.google.android.gcm.server"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../../index.html?com/google/android/gcm/server/Message.Builder.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="Message.Builder.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+ SUMMARY: NESTED | FIELD | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: FIELD | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<!-- ======== START OF CLASS DATA ======== -->
+<H2>
+<FONT SIZE="-1">
+com.google.android.gcm.server</FONT>
+<BR>
+Class Message.Builder</H2>
+<PRE>
+java.lang.Object
+ <IMG SRC="../../../../../resources/inherit.gif" ALT="extended by "><B>com.google.android.gcm.server.Message.Builder</B>
+</PRE>
+<DL>
+<DT><B>Enclosing class:</B><DD><A HREF="../../../../../com/google/android/gcm/server/Message.html" title="class in com.google.android.gcm.server">Message</A></DD>
+</DL>
+<HR>
+<DL>
+<DT><PRE>public static final class <B>Message.Builder</B><DT>extends java.lang.Object</DL>
+</PRE>
+
+<P>
+<HR>
+
+<P>
+
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+
+<A NAME="constructor_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Constructor Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Message.Builder.html#Message.Builder()">Message.Builder</A></B>()</CODE>
+
+<BR>
+ </TD>
+</TR>
+</TABLE>
+
+<!-- ========== METHOD SUMMARY =========== -->
+
+<A NAME="method_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Method Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> <A HREF="../../../../../com/google/android/gcm/server/Message.Builder.html" title="class in com.google.android.gcm.server">Message.Builder</A></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Message.Builder.html#addData(java.lang.String, java.lang.String)">addData</A></B>(java.lang.String key,
+ java.lang.String value)</CODE>
+
+<BR>
+ Adds a key/value pair to the payload data.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> <A HREF="../../../../../com/google/android/gcm/server/Message.html" title="class in com.google.android.gcm.server">Message</A></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Message.Builder.html#build()">build</A></B>()</CODE>
+
+<BR>
+ </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> <A HREF="../../../../../com/google/android/gcm/server/Message.Builder.html" title="class in com.google.android.gcm.server">Message.Builder</A></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Message.Builder.html#collapseKey(java.lang.String)">collapseKey</A></B>(java.lang.String value)</CODE>
+
+<BR>
+ Sets the collapseKey property.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> <A HREF="../../../../../com/google/android/gcm/server/Message.Builder.html" title="class in com.google.android.gcm.server">Message.Builder</A></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Message.Builder.html#delayWhileIdle(boolean)">delayWhileIdle</A></B>(boolean value)</CODE>
+
+<BR>
+ Sets the delayWhileIdle property (default value is false).</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> <A HREF="../../../../../com/google/android/gcm/server/Message.Builder.html" title="class in com.google.android.gcm.server">Message.Builder</A></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Message.Builder.html#timeToLive(int)">timeToLive</A></B>(int value)</CODE>
+
+<BR>
+ Sets the time to live, in seconds.</TD>
+</TR>
+</TABLE>
+ <A NAME="methods_inherited_from_class_java.lang.Object"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left"><B>Methods inherited from class java.lang.Object</B></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE>clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait</CODE></TD>
+</TR>
+</TABLE>
+
+<P>
+
+<!-- ========= CONSTRUCTOR DETAIL ======== -->
+
+<A NAME="constructor_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Constructor Detail</B></FONT></TH>
+</TR>
+</TABLE>
+
+<A NAME="Message.Builder()"><!-- --></A><H3>
+Message.Builder</H3>
+<PRE>
+public <B>Message.Builder</B>()</PRE>
+<DL>
+</DL>
+
+<!-- ============ METHOD DETAIL ========== -->
+
+<A NAME="method_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Method Detail</B></FONT></TH>
+</TR>
+</TABLE>
+
+<A NAME="collapseKey(java.lang.String)"><!-- --></A><H3>
+collapseKey</H3>
+<PRE>
+public <A HREF="../../../../../com/google/android/gcm/server/Message.Builder.html" title="class in com.google.android.gcm.server">Message.Builder</A> <B>collapseKey</B>(java.lang.String value)</PRE>
+<DL>
+<DD>Sets the collapseKey property.
+<P>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="delayWhileIdle(boolean)"><!-- --></A><H3>
+delayWhileIdle</H3>
+<PRE>
+public <A HREF="../../../../../com/google/android/gcm/server/Message.Builder.html" title="class in com.google.android.gcm.server">Message.Builder</A> <B>delayWhileIdle</B>(boolean value)</PRE>
+<DL>
+<DD>Sets the delayWhileIdle property (default value is false).
+<P>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="timeToLive(int)"><!-- --></A><H3>
+timeToLive</H3>
+<PRE>
+public <A HREF="../../../../../com/google/android/gcm/server/Message.Builder.html" title="class in com.google.android.gcm.server">Message.Builder</A> <B>timeToLive</B>(int value)</PRE>
+<DL>
+<DD>Sets the time to live, in seconds.
+<P>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="addData(java.lang.String, java.lang.String)"><!-- --></A><H3>
+addData</H3>
+<PRE>
+public <A HREF="../../../../../com/google/android/gcm/server/Message.Builder.html" title="class in com.google.android.gcm.server">Message.Builder</A> <B>addData</B>(java.lang.String key,
+ java.lang.String value)</PRE>
+<DL>
+<DD>Adds a key/value pair to the payload data.
+<P>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="build()"><!-- --></A><H3>
+build</H3>
+<PRE>
+public <A HREF="../../../../../com/google/android/gcm/server/Message.html" title="class in com.google.android.gcm.server">Message</A> <B>build</B>()</PRE>
+<DL>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<!-- ========= END OF CLASS DATA ========= -->
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../com/google/android/gcm/server/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../../com/google/android/gcm/server/Message.html" title="class in com.google.android.gcm.server"><B>PREV CLASS</B></A>
+ <A HREF="../../../../../com/google/android/gcm/server/MulticastResult.html" title="class in com.google.android.gcm.server"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../../index.html?com/google/android/gcm/server/Message.Builder.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="Message.Builder.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+ SUMMARY: NESTED | FIELD | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: FIELD | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+
+</BODY>
+</HTML>
diff --git a/docs/html/guide/google/gcm/server-javadoc/com/google/android/gcm/server/Message.html b/docs/html/guide/google/gcm/server-javadoc/com/google/android/gcm/server/Message.html
new file mode 100644
index 0000000..0773686
--- /dev/null
+++ b/docs/html/guide/google/gcm/server-javadoc/com/google/android/gcm/server/Message.html
@@ -0,0 +1,369 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_20) on Thu Jun 21 12:04:57 PDT 2012 -->
+<TITLE>
+Message
+</TITLE>
+
+<META NAME="date" CONTENT="2012-06-21">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+ if (location.href.indexOf('is-external=true') == -1) {
+ parent.document.title="Message";
+ }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../com/google/android/gcm/server/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../../com/google/android/gcm/server/InvalidRequestException.html" title="class in com.google.android.gcm.server"><B>PREV CLASS</B></A>
+ <A HREF="../../../../../com/google/android/gcm/server/Message.Builder.html" title="class in com.google.android.gcm.server"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../../index.html?com/google/android/gcm/server/Message.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="Message.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+ SUMMARY: <A HREF="#nested_class_summary">NESTED</A> | FIELD | CONSTR | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: FIELD | CONSTR | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<!-- ======== START OF CLASS DATA ======== -->
+<H2>
+<FONT SIZE="-1">
+com.google.android.gcm.server</FONT>
+<BR>
+Class Message</H2>
+<PRE>
+java.lang.Object
+ <IMG SRC="../../../../../resources/inherit.gif" ALT="extended by "><B>com.google.android.gcm.server.Message</B>
+</PRE>
+<DL>
+<DT><B>All Implemented Interfaces:</B> <DD>java.io.Serializable</DD>
+</DL>
+<HR>
+<DL>
+<DT><PRE>public final class <B>Message</B><DT>extends java.lang.Object<DT>implements java.io.Serializable</DL>
+</PRE>
+
+<P>
+GCM message.
+
+ <p>
+ Instances of this class are immutable and should be created using a
+ <A HREF="../../../../../com/google/android/gcm/server/Message.Builder.html" title="class in com.google.android.gcm.server"><CODE>Message.Builder</CODE></A>. Examples:
+
+ <strong>Simplest message:</strong>
+ <pre><code>
+ Message message = new Message.Builder().build();
+ </pre></code>
+
+ <strong>Message with optional attributes:</strong>
+ <pre><code>
+ Message message = new Message.Builder()
+ .collapseKey(collapseKey)
+ .timeToLive(3)
+ .delayWhileIdle(true)
+ .build();
+ </pre></code>
+
+ <strong>Message with optional attributes and payload data:</strong>
+ <pre><code>
+ Message message = new Message.Builder()
+ .collapseKey(collapseKey)
+ .timeToLive(3)
+ .delayWhileIdle(true)
+ .addData("key1", "value1")
+ .addData("key2", "value2")
+ .build();
+ </pre></code>
+<P>
+
+<P>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../../../serialized-form.html#com.google.android.gcm.server.Message">Serialized Form</A></DL>
+<HR>
+
+<P>
+<!-- ======== NESTED CLASS SUMMARY ======== -->
+
+<A NAME="nested_class_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Nested Class Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static class</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Message.Builder.html" title="class in com.google.android.gcm.server">Message.Builder</A></B></CODE>
+
+<BR>
+ </TD>
+</TR>
+</TABLE>
+
+<!-- ========== METHOD SUMMARY =========== -->
+
+<A NAME="method_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Method Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Message.html#getCollapseKey()">getCollapseKey</A></B>()</CODE>
+
+<BR>
+ Gets the collapse key.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> java.util.Map<java.lang.String,java.lang.String></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Message.html#getData()">getData</A></B>()</CODE>
+
+<BR>
+ Gets the payload data, which is immutable.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> java.lang.Integer</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Message.html#getTimeToLive()">getTimeToLive</A></B>()</CODE>
+
+<BR>
+ Gets the time to live (in seconds).</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> java.lang.Boolean</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Message.html#isDelayWhileIdle()">isDelayWhileIdle</A></B>()</CODE>
+
+<BR>
+ Gets the delayWhileIdle flag.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Message.html#toString()">toString</A></B>()</CODE>
+
+<BR>
+ </TD>
+</TR>
+</TABLE>
+ <A NAME="methods_inherited_from_class_java.lang.Object"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left"><B>Methods inherited from class java.lang.Object</B></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE>clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait</CODE></TD>
+</TR>
+</TABLE>
+
+<P>
+
+<!-- ============ METHOD DETAIL ========== -->
+
+<A NAME="method_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Method Detail</B></FONT></TH>
+</TR>
+</TABLE>
+
+<A NAME="getCollapseKey()"><!-- --></A><H3>
+getCollapseKey</H3>
+<PRE>
+public java.lang.String <B>getCollapseKey</B>()</PRE>
+<DL>
+<DD>Gets the collapse key.
+<P>
+<DD><DL>
+</DL>
+</DD>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="isDelayWhileIdle()"><!-- --></A><H3>
+isDelayWhileIdle</H3>
+<PRE>
+public java.lang.Boolean <B>isDelayWhileIdle</B>()</PRE>
+<DL>
+<DD>Gets the delayWhileIdle flag.
+<P>
+<DD><DL>
+</DL>
+</DD>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="getTimeToLive()"><!-- --></A><H3>
+getTimeToLive</H3>
+<PRE>
+public java.lang.Integer <B>getTimeToLive</B>()</PRE>
+<DL>
+<DD>Gets the time to live (in seconds).
+<P>
+<DD><DL>
+</DL>
+</DD>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="getData()"><!-- --></A><H3>
+getData</H3>
+<PRE>
+public java.util.Map<java.lang.String,java.lang.String> <B>getData</B>()</PRE>
+<DL>
+<DD>Gets the payload data, which is immutable.
+<P>
+<DD><DL>
+</DL>
+</DD>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="toString()"><!-- --></A><H3>
+toString</H3>
+<PRE>
+public java.lang.String <B>toString</B>()</PRE>
+<DL>
+<DD><DL>
+<DT><B>Overrides:</B><DD><CODE>toString</CODE> in class <CODE>java.lang.Object</CODE></DL>
+</DD>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<!-- ========= END OF CLASS DATA ========= -->
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../com/google/android/gcm/server/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../../com/google/android/gcm/server/InvalidRequestException.html" title="class in com.google.android.gcm.server"><B>PREV CLASS</B></A>
+ <A HREF="../../../../../com/google/android/gcm/server/Message.Builder.html" title="class in com.google.android.gcm.server"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../../index.html?com/google/android/gcm/server/Message.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="Message.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+ SUMMARY: <A HREF="#nested_class_summary">NESTED</A> | FIELD | CONSTR | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: FIELD | CONSTR | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+
+</BODY>
+</HTML>
diff --git a/docs/html/guide/google/gcm/server-javadoc/com/google/android/gcm/server/MulticastResult.html b/docs/html/guide/google/gcm/server-javadoc/com/google/android/gcm/server/MulticastResult.html
new file mode 100644
index 0000000..f9df609
--- /dev/null
+++ b/docs/html/guide/google/gcm/server-javadoc/com/google/android/gcm/server/MulticastResult.html
@@ -0,0 +1,397 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_20) on Thu Jun 21 12:04:57 PDT 2012 -->
+<TITLE>
+MulticastResult
+</TITLE>
+
+<META NAME="date" CONTENT="2012-06-21">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+ if (location.href.indexOf('is-external=true') == -1) {
+ parent.document.title="MulticastResult";
+ }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../com/google/android/gcm/server/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../../com/google/android/gcm/server/Message.Builder.html" title="class in com.google.android.gcm.server"><B>PREV CLASS</B></A>
+ <A HREF="../../../../../com/google/android/gcm/server/Result.html" title="class in com.google.android.gcm.server"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../../index.html?com/google/android/gcm/server/MulticastResult.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="MulticastResult.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+ SUMMARY: NESTED | FIELD | CONSTR | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: FIELD | CONSTR | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<!-- ======== START OF CLASS DATA ======== -->
+<H2>
+<FONT SIZE="-1">
+com.google.android.gcm.server</FONT>
+<BR>
+Class MulticastResult</H2>
+<PRE>
+java.lang.Object
+ <IMG SRC="../../../../../resources/inherit.gif" ALT="extended by "><B>com.google.android.gcm.server.MulticastResult</B>
+</PRE>
+<DL>
+<DT><B>All Implemented Interfaces:</B> <DD>java.io.Serializable</DD>
+</DL>
+<HR>
+<DL>
+<DT><PRE>public final class <B>MulticastResult</B><DT>extends java.lang.Object<DT>implements java.io.Serializable</DL>
+</PRE>
+
+<P>
+Result of a GCM multicast message request .
+<P>
+
+<P>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../../../serialized-form.html#com.google.android.gcm.server.MulticastResult">Serialized Form</A></DL>
+<HR>
+
+<P>
+
+<!-- ========== METHOD SUMMARY =========== -->
+
+<A NAME="method_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Method Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/MulticastResult.html#getCanonicalIds()">getCanonicalIds</A></B>()</CODE>
+
+<BR>
+ Gets the number of successful messages that also returned a canonical
+ registration id.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/MulticastResult.html#getFailure()">getFailure</A></B>()</CODE>
+
+<BR>
+ Gets the number of failed messages.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> long</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/MulticastResult.html#getMulticastId()">getMulticastId</A></B>()</CODE>
+
+<BR>
+ Gets the multicast id.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> java.util.List<<A HREF="../../../../../com/google/android/gcm/server/Result.html" title="class in com.google.android.gcm.server">Result</A>></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/MulticastResult.html#getResults()">getResults</A></B>()</CODE>
+
+<BR>
+ Gets the results of each individual message, which is immutable.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> java.util.List<java.lang.Long></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/MulticastResult.html#getRetryMulticastIds()">getRetryMulticastIds</A></B>()</CODE>
+
+<BR>
+ Gets additional ids if more than one multicast message was sent.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/MulticastResult.html#getSuccess()">getSuccess</A></B>()</CODE>
+
+<BR>
+ Gets the number of successful messages.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/MulticastResult.html#getTotal()">getTotal</A></B>()</CODE>
+
+<BR>
+ Gets the total number of messages sent, regardless of the status.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/MulticastResult.html#toString()">toString</A></B>()</CODE>
+
+<BR>
+ </TD>
+</TR>
+</TABLE>
+ <A NAME="methods_inherited_from_class_java.lang.Object"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left"><B>Methods inherited from class java.lang.Object</B></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE>clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait</CODE></TD>
+</TR>
+</TABLE>
+
+<P>
+
+<!-- ============ METHOD DETAIL ========== -->
+
+<A NAME="method_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Method Detail</B></FONT></TH>
+</TR>
+</TABLE>
+
+<A NAME="getMulticastId()"><!-- --></A><H3>
+getMulticastId</H3>
+<PRE>
+public long <B>getMulticastId</B>()</PRE>
+<DL>
+<DD>Gets the multicast id.
+<P>
+<DD><DL>
+</DL>
+</DD>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="getSuccess()"><!-- --></A><H3>
+getSuccess</H3>
+<PRE>
+public int <B>getSuccess</B>()</PRE>
+<DL>
+<DD>Gets the number of successful messages.
+<P>
+<DD><DL>
+</DL>
+</DD>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="getTotal()"><!-- --></A><H3>
+getTotal</H3>
+<PRE>
+public int <B>getTotal</B>()</PRE>
+<DL>
+<DD>Gets the total number of messages sent, regardless of the status.
+<P>
+<DD><DL>
+</DL>
+</DD>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="getFailure()"><!-- --></A><H3>
+getFailure</H3>
+<PRE>
+public int <B>getFailure</B>()</PRE>
+<DL>
+<DD>Gets the number of failed messages.
+<P>
+<DD><DL>
+</DL>
+</DD>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="getCanonicalIds()"><!-- --></A><H3>
+getCanonicalIds</H3>
+<PRE>
+public int <B>getCanonicalIds</B>()</PRE>
+<DL>
+<DD>Gets the number of successful messages that also returned a canonical
+ registration id.
+<P>
+<DD><DL>
+</DL>
+</DD>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="getResults()"><!-- --></A><H3>
+getResults</H3>
+<PRE>
+public java.util.List<<A HREF="../../../../../com/google/android/gcm/server/Result.html" title="class in com.google.android.gcm.server">Result</A>> <B>getResults</B>()</PRE>
+<DL>
+<DD>Gets the results of each individual message, which is immutable.
+<P>
+<DD><DL>
+</DL>
+</DD>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="getRetryMulticastIds()"><!-- --></A><H3>
+getRetryMulticastIds</H3>
+<PRE>
+public java.util.List<java.lang.Long> <B>getRetryMulticastIds</B>()</PRE>
+<DL>
+<DD>Gets additional ids if more than one multicast message was sent.
+<P>
+<DD><DL>
+</DL>
+</DD>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="toString()"><!-- --></A><H3>
+toString</H3>
+<PRE>
+public java.lang.String <B>toString</B>()</PRE>
+<DL>
+<DD><DL>
+<DT><B>Overrides:</B><DD><CODE>toString</CODE> in class <CODE>java.lang.Object</CODE></DL>
+</DD>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<!-- ========= END OF CLASS DATA ========= -->
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../com/google/android/gcm/server/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../../com/google/android/gcm/server/Message.Builder.html" title="class in com.google.android.gcm.server"><B>PREV CLASS</B></A>
+ <A HREF="../../../../../com/google/android/gcm/server/Result.html" title="class in com.google.android.gcm.server"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../../index.html?com/google/android/gcm/server/MulticastResult.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="MulticastResult.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+ SUMMARY: NESTED | FIELD | CONSTR | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: FIELD | CONSTR | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+
+</BODY>
+</HTML>
diff --git a/docs/html/guide/google/gcm/server-javadoc/com/google/android/gcm/server/Result.html b/docs/html/guide/google/gcm/server-javadoc/com/google/android/gcm/server/Result.html
new file mode 100644
index 0000000..14d4b34
--- /dev/null
+++ b/docs/html/guide/google/gcm/server-javadoc/com/google/android/gcm/server/Result.html
@@ -0,0 +1,322 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_20) on Thu Jun 21 12:04:57 PDT 2012 -->
+<TITLE>
+Result
+</TITLE>
+
+<META NAME="date" CONTENT="2012-06-21">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+ if (location.href.indexOf('is-external=true') == -1) {
+ parent.document.title="Result";
+ }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../com/google/android/gcm/server/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../../com/google/android/gcm/server/MulticastResult.html" title="class in com.google.android.gcm.server"><B>PREV CLASS</B></A>
+ <A HREF="../../../../../com/google/android/gcm/server/Sender.html" title="class in com.google.android.gcm.server"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../../index.html?com/google/android/gcm/server/Result.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="Result.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+ SUMMARY: NESTED | FIELD | CONSTR | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: FIELD | CONSTR | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<!-- ======== START OF CLASS DATA ======== -->
+<H2>
+<FONT SIZE="-1">
+com.google.android.gcm.server</FONT>
+<BR>
+Class Result</H2>
+<PRE>
+java.lang.Object
+ <IMG SRC="../../../../../resources/inherit.gif" ALT="extended by "><B>com.google.android.gcm.server.Result</B>
+</PRE>
+<DL>
+<DT><B>All Implemented Interfaces:</B> <DD>java.io.Serializable</DD>
+</DL>
+<HR>
+<DL>
+<DT><PRE>public final class <B>Result</B><DT>extends java.lang.Object<DT>implements java.io.Serializable</DL>
+</PRE>
+
+<P>
+Result of a GCM message request that returned HTTP status code 200.
+
+ <p>
+ If the message is successfully created, the <A HREF="../../../../../com/google/android/gcm/server/Result.html#getMessageId()"><CODE>getMessageId()</CODE></A> returns
+ the message id and <A HREF="../../../../../com/google/android/gcm/server/Result.html#getErrorCodeName()"><CODE>getErrorCodeName()</CODE></A> returns null;
+ otherwise, <A HREF="../../../../../com/google/android/gcm/server/Result.html#getMessageId()"><CODE>getMessageId()</CODE></A> returns null and
+ <A HREF="../../../../../com/google/android/gcm/server/Result.html#getErrorCodeName()"><CODE>getErrorCodeName()</CODE></A> returns the code of the error.
+
+ <p>
+ There are cases when a request is accept and the message successfully
+ created, but GCM has a canonical registration id for that device. In this
+ case, the server should update the registration id to avoid rejected requests
+ in the future.
+
+ <p>
+ In a nutshell, the workflow to handle a result is:
+ <pre>
+ - Call <A HREF="../../../../../com/google/android/gcm/server/Result.html#getMessageId()"><CODE>getMessageId()</CODE></A>:
+ - null means error, call <A HREF="../../../../../com/google/android/gcm/server/Result.html#getErrorCodeName()"><CODE>getErrorCodeName()</CODE></A>
+ - non-null means the message was created:
+ - Call <A HREF="../../../../../com/google/android/gcm/server/Result.html#getCanonicalRegistrationId()"><CODE>getCanonicalRegistrationId()</CODE></A>
+ - if it returns null, do nothing.
+ - otherwise, update the server datastore with the new id.
+ </pre>
+<P>
+
+<P>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../../../serialized-form.html#com.google.android.gcm.server.Result">Serialized Form</A></DL>
+<HR>
+
+<P>
+
+<!-- ========== METHOD SUMMARY =========== -->
+
+<A NAME="method_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Method Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Result.html#getCanonicalRegistrationId()">getCanonicalRegistrationId</A></B>()</CODE>
+
+<BR>
+ Gets the canonical registration id, if any.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Result.html#getErrorCodeName()">getErrorCodeName</A></B>()</CODE>
+
+<BR>
+ Gets the error code, if any.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Result.html#getMessageId()">getMessageId</A></B>()</CODE>
+
+<BR>
+ Gets the message id, if any.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Result.html#toString()">toString</A></B>()</CODE>
+
+<BR>
+ </TD>
+</TR>
+</TABLE>
+ <A NAME="methods_inherited_from_class_java.lang.Object"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left"><B>Methods inherited from class java.lang.Object</B></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE>clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait</CODE></TD>
+</TR>
+</TABLE>
+
+<P>
+
+<!-- ============ METHOD DETAIL ========== -->
+
+<A NAME="method_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Method Detail</B></FONT></TH>
+</TR>
+</TABLE>
+
+<A NAME="getMessageId()"><!-- --></A><H3>
+getMessageId</H3>
+<PRE>
+public java.lang.String <B>getMessageId</B>()</PRE>
+<DL>
+<DD>Gets the message id, if any.
+<P>
+<DD><DL>
+</DL>
+</DD>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="getCanonicalRegistrationId()"><!-- --></A><H3>
+getCanonicalRegistrationId</H3>
+<PRE>
+public java.lang.String <B>getCanonicalRegistrationId</B>()</PRE>
+<DL>
+<DD>Gets the canonical registration id, if any.
+<P>
+<DD><DL>
+</DL>
+</DD>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="getErrorCodeName()"><!-- --></A><H3>
+getErrorCodeName</H3>
+<PRE>
+public java.lang.String <B>getErrorCodeName</B>()</PRE>
+<DL>
+<DD>Gets the error code, if any.
+<P>
+<DD><DL>
+</DL>
+</DD>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="toString()"><!-- --></A><H3>
+toString</H3>
+<PRE>
+public java.lang.String <B>toString</B>()</PRE>
+<DL>
+<DD><DL>
+<DT><B>Overrides:</B><DD><CODE>toString</CODE> in class <CODE>java.lang.Object</CODE></DL>
+</DD>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<!-- ========= END OF CLASS DATA ========= -->
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../com/google/android/gcm/server/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../../com/google/android/gcm/server/MulticastResult.html" title="class in com.google.android.gcm.server"><B>PREV CLASS</B></A>
+ <A HREF="../../../../../com/google/android/gcm/server/Sender.html" title="class in com.google.android.gcm.server"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../../index.html?com/google/android/gcm/server/Result.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="Result.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+ SUMMARY: NESTED | FIELD | CONSTR | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: FIELD | CONSTR | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+
+</BODY>
+</HTML>
diff --git a/docs/html/guide/google/gcm/server-javadoc/com/google/android/gcm/server/Sender.html b/docs/html/guide/google/gcm/server-javadoc/com/google/android/gcm/server/Sender.html
new file mode 100644
index 0000000..4f1a2ac
--- /dev/null
+++ b/docs/html/guide/google/gcm/server-javadoc/com/google/android/gcm/server/Sender.html
@@ -0,0 +1,662 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_20) on Thu Jun 21 12:04:57 PDT 2012 -->
+<TITLE>
+Sender
+</TITLE>
+
+<META NAME="date" CONTENT="2012-06-21">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+ if (location.href.indexOf('is-external=true') == -1) {
+ parent.document.title="Sender";
+ }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../com/google/android/gcm/server/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../../com/google/android/gcm/server/Result.html" title="class in com.google.android.gcm.server"><B>PREV CLASS</B></A>
+ NEXT CLASS</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../../index.html?com/google/android/gcm/server/Sender.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="Sender.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+ SUMMARY: NESTED | <A HREF="#field_summary">FIELD</A> | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: <A HREF="#field_detail">FIELD</A> | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<!-- ======== START OF CLASS DATA ======== -->
+<H2>
+<FONT SIZE="-1">
+com.google.android.gcm.server</FONT>
+<BR>
+Class Sender</H2>
+<PRE>
+java.lang.Object
+ <IMG SRC="../../../../../resources/inherit.gif" ALT="extended by "><B>com.google.android.gcm.server.Sender</B>
+</PRE>
+<HR>
+<DL>
+<DT><PRE>public class <B>Sender</B><DT>extends java.lang.Object</DL>
+</PRE>
+
+<P>
+Helper class to send messages to the GCM service using an API Key.
+<P>
+
+<P>
+<HR>
+
+<P>
+<!-- =========== FIELD SUMMARY =========== -->
+
+<A NAME="field_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Field Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>protected static int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Sender.html#BACKOFF_INITIAL_DELAY">BACKOFF_INITIAL_DELAY</A></B></CODE>
+
+<BR>
+ Initial delay before first retry, without jitter.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>protected java.util.logging.Logger</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Sender.html#logger">logger</A></B></CODE>
+
+<BR>
+ </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>protected static int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Sender.html#MAX_BACKOFF_DELAY">MAX_BACKOFF_DELAY</A></B></CODE>
+
+<BR>
+ Maximum delay before a retry.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>protected java.util.Random</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Sender.html#random">random</A></B></CODE>
+
+<BR>
+ </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>protected static java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Sender.html#UTF8">UTF8</A></B></CODE>
+
+<BR>
+ </TD>
+</TR>
+</TABLE>
+
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+
+<A NAME="constructor_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Constructor Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Sender.html#Sender(java.lang.String)">Sender</A></B>(java.lang.String key)</CODE>
+
+<BR>
+ Default constructor.</TD>
+</TR>
+</TABLE>
+
+<!-- ========== METHOD SUMMARY =========== -->
+
+<A NAME="method_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Method Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>protected static void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Sender.html#addParameter(java.lang.StringBuilder, java.lang.String, java.lang.String)">addParameter</A></B>(java.lang.StringBuilder body,
+ java.lang.String name,
+ java.lang.String value)</CODE>
+
+<BR>
+ Adds a new parameter to the HTTP POST body.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>protected java.net.HttpURLConnection</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Sender.html#getConnection(java.lang.String)">getConnection</A></B>(java.lang.String url)</CODE>
+
+<BR>
+ Gets an <CODE>HttpURLConnection</CODE> given an URL.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>protected static java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Sender.html#getString(java.io.InputStream)">getString</A></B>(java.io.InputStream stream)</CODE>
+
+<BR>
+ Convenience method to convert an InputStream to a String.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>protected static java.lang.StringBuilder</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Sender.html#newBody(java.lang.String, java.lang.String)">newBody</A></B>(java.lang.String name,
+ java.lang.String value)</CODE>
+
+<BR>
+ Creates a <CODE>StringBuilder</CODE> to be used as the body of an HTTP POST.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>protected static java.util.Map<java.lang.String,java.lang.String></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Sender.html#newKeyValues(java.lang.String, java.lang.String)">newKeyValues</A></B>(java.lang.String key,
+ java.lang.String value)</CODE>
+
+<BR>
+ Creates a map with just one key-value pair.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>protected java.net.HttpURLConnection</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Sender.html#post(java.lang.String, java.lang.String)">post</A></B>(java.lang.String url,
+ java.lang.String body)</CODE>
+
+<BR>
+ Make an HTTP post to a given URL.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>protected java.net.HttpURLConnection</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Sender.html#post(java.lang.String, java.lang.String, java.lang.String)">post</A></B>(java.lang.String url,
+ java.lang.String contentType,
+ java.lang.String body)</CODE>
+
+<BR>
+ </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> <A HREF="../../../../../com/google/android/gcm/server/MulticastResult.html" title="class in com.google.android.gcm.server">MulticastResult</A></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Sender.html#send(com.google.android.gcm.server.Message, java.util.List, int)">send</A></B>(<A HREF="../../../../../com/google/android/gcm/server/Message.html" title="class in com.google.android.gcm.server">Message</A> message,
+ java.util.List<java.lang.String> regIds,
+ int retries)</CODE>
+
+<BR>
+ Sends a message to many devices, retrying in case of unavailability.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> <A HREF="../../../../../com/google/android/gcm/server/Result.html" title="class in com.google.android.gcm.server">Result</A></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Sender.html#send(com.google.android.gcm.server.Message, java.lang.String, int)">send</A></B>(<A HREF="../../../../../com/google/android/gcm/server/Message.html" title="class in com.google.android.gcm.server">Message</A> message,
+ java.lang.String registrationId,
+ int retries)</CODE>
+
+<BR>
+ Sends a message to one device, retrying in case of unavailability.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> <A HREF="../../../../../com/google/android/gcm/server/MulticastResult.html" title="class in com.google.android.gcm.server">MulticastResult</A></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Sender.html#sendNoRetry(com.google.android.gcm.server.Message, java.util.List)">sendNoRetry</A></B>(<A HREF="../../../../../com/google/android/gcm/server/Message.html" title="class in com.google.android.gcm.server">Message</A> message,
+ java.util.List<java.lang.String> registrationIds)</CODE>
+
+<BR>
+ Sends a message without retrying in case of service unavailability.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> <A HREF="../../../../../com/google/android/gcm/server/Result.html" title="class in com.google.android.gcm.server">Result</A></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/android/gcm/server/Sender.html#sendNoRetry(com.google.android.gcm.server.Message, java.lang.String)">sendNoRetry</A></B>(<A HREF="../../../../../com/google/android/gcm/server/Message.html" title="class in com.google.android.gcm.server">Message</A> message,
+ java.lang.String registrationId)</CODE>
+
+<BR>
+ Sends a message without retrying in case of service unavailability.</TD>
+</TR>
+</TABLE>
+ <A NAME="methods_inherited_from_class_java.lang.Object"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left"><B>Methods inherited from class java.lang.Object</B></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE>clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait</CODE></TD>
+</TR>
+</TABLE>
+
+<P>
+
+<!-- ============ FIELD DETAIL =========== -->
+
+<A NAME="field_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Field Detail</B></FONT></TH>
+</TR>
+</TABLE>
+
+<A NAME="UTF8"><!-- --></A><H3>
+UTF8</H3>
+<PRE>
+protected static final java.lang.String <B>UTF8</B></PRE>
+<DL>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../../../constant-values.html#com.google.android.gcm.server.Sender.UTF8">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="BACKOFF_INITIAL_DELAY"><!-- --></A><H3>
+BACKOFF_INITIAL_DELAY</H3>
+<PRE>
+protected static final int <B>BACKOFF_INITIAL_DELAY</B></PRE>
+<DL>
+<DD>Initial delay before first retry, without jitter.
+<P>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../../../constant-values.html#com.google.android.gcm.server.Sender.BACKOFF_INITIAL_DELAY">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="MAX_BACKOFF_DELAY"><!-- --></A><H3>
+MAX_BACKOFF_DELAY</H3>
+<PRE>
+protected static final int <B>MAX_BACKOFF_DELAY</B></PRE>
+<DL>
+<DD>Maximum delay before a retry.
+<P>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../../../constant-values.html#com.google.android.gcm.server.Sender.MAX_BACKOFF_DELAY">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="random"><!-- --></A><H3>
+random</H3>
+<PRE>
+protected final java.util.Random <B>random</B></PRE>
+<DL>
+<DL>
+</DL>
+</DL>
+<HR>
+
+<A NAME="logger"><!-- --></A><H3>
+logger</H3>
+<PRE>
+protected final java.util.logging.Logger <B>logger</B></PRE>
+<DL>
+<DL>
+</DL>
+</DL>
+
+<!-- ========= CONSTRUCTOR DETAIL ======== -->
+
+<A NAME="constructor_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Constructor Detail</B></FONT></TH>
+</TR>
+</TABLE>
+
+<A NAME="Sender(java.lang.String)"><!-- --></A><H3>
+Sender</H3>
+<PRE>
+public <B>Sender</B>(java.lang.String key)</PRE>
+<DL>
+<DD>Default constructor.
+<P>
+<DL>
+<DT><B>Parameters:</B><DD><CODE>key</CODE> - API key obtained through the Google API Console.</DL>
+</DL>
+
+<!-- ============ METHOD DETAIL ========== -->
+
+<A NAME="method_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Method Detail</B></FONT></TH>
+</TR>
+</TABLE>
+
+<A NAME="send(com.google.android.gcm.server.Message, java.lang.String, int)"><!-- --></A><H3>
+send</H3>
+<PRE>
+public <A HREF="../../../../../com/google/android/gcm/server/Result.html" title="class in com.google.android.gcm.server">Result</A> <B>send</B>(<A HREF="../../../../../com/google/android/gcm/server/Message.html" title="class in com.google.android.gcm.server">Message</A> message,
+ java.lang.String registrationId,
+ int retries)
+ throws java.io.IOException</PRE>
+<DL>
+<DD>Sends a message to one device, retrying in case of unavailability.
+
+ <p>
+ <strong>Note: </strong> this method uses exponential back-off to retry in
+ case of service unavailability and hence could block the calling thread
+ for many seconds.
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>message</CODE> - message to be sent, including the device's registration id.<DD><CODE>registrationId</CODE> - device where the message will be sent.<DD><CODE>retries</CODE> - number of retries in case of service unavailability errors.
+<DT><B>Returns:</B><DD>result of the request (see its javadoc for more details)
+<DT><B>Throws:</B>
+<DD><CODE>java.lang.IllegalArgumentException</CODE> - if registrationId is null.
+<DD><CODE><A HREF="../../../../../com/google/android/gcm/server/InvalidRequestException.html" title="class in com.google.android.gcm.server">InvalidRequestException</A></CODE> - if GCM didn't returned a 200 or 503 status.
+<DD><CODE>java.io.IOException</CODE> - if message could not be sent.</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="sendNoRetry(com.google.android.gcm.server.Message, java.lang.String)"><!-- --></A><H3>
+sendNoRetry</H3>
+<PRE>
+public <A HREF="../../../../../com/google/android/gcm/server/Result.html" title="class in com.google.android.gcm.server">Result</A> <B>sendNoRetry</B>(<A HREF="../../../../../com/google/android/gcm/server/Message.html" title="class in com.google.android.gcm.server">Message</A> message,
+ java.lang.String registrationId)
+ throws java.io.IOException</PRE>
+<DL>
+<DD>Sends a message without retrying in case of service unavailability. See
+ <A HREF="../../../../../com/google/android/gcm/server/Sender.html#send(com.google.android.gcm.server.Message, java.lang.String, int)"><CODE>send(Message, String, int)</CODE></A> for more info.
+<P>
+<DD><DL>
+
+<DT><B>Returns:</B><DD>result of the post, or null if the GCM service was
+ unavailable.
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="../../../../../com/google/android/gcm/server/InvalidRequestException.html" title="class in com.google.android.gcm.server">InvalidRequestException</A></CODE> - if GCM didn't returned a 200 or 503 status.
+<DD><CODE>java.lang.IllegalArgumentException</CODE> - if registrationId is null.
+<DD><CODE>java.io.IOException</CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="send(com.google.android.gcm.server.Message, java.util.List, int)"><!-- --></A><H3>
+send</H3>
+<PRE>
+public <A HREF="../../../../../com/google/android/gcm/server/MulticastResult.html" title="class in com.google.android.gcm.server">MulticastResult</A> <B>send</B>(<A HREF="../../../../../com/google/android/gcm/server/Message.html" title="class in com.google.android.gcm.server">Message</A> message,
+ java.util.List<java.lang.String> regIds,
+ int retries)
+ throws java.io.IOException</PRE>
+<DL>
+<DD>Sends a message to many devices, retrying in case of unavailability.
+
+ <p>
+ <strong>Note: </strong> this method uses exponential back-off to retry in
+ case of service unavailability and hence could block the calling thread
+ for many seconds.
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>message</CODE> - message to be sent.<DD><CODE>regIds</CODE> - registration id of the devices that will receive
+ the message.<DD><CODE>retries</CODE> - number of retries in case of service unavailability errors.
+<DT><B>Returns:</B><DD>combined result of all requests made.
+<DT><B>Throws:</B>
+<DD><CODE>java.lang.IllegalArgumentException</CODE> - if registrationIds is null or
+ empty.
+<DD><CODE><A HREF="../../../../../com/google/android/gcm/server/InvalidRequestException.html" title="class in com.google.android.gcm.server">InvalidRequestException</A></CODE> - if GCM didn't returned a 200 or 503 status.
+<DD><CODE>java.io.IOException</CODE> - if message could not be sent.</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="sendNoRetry(com.google.android.gcm.server.Message, java.util.List)"><!-- --></A><H3>
+sendNoRetry</H3>
+<PRE>
+public <A HREF="../../../../../com/google/android/gcm/server/MulticastResult.html" title="class in com.google.android.gcm.server">MulticastResult</A> <B>sendNoRetry</B>(<A HREF="../../../../../com/google/android/gcm/server/Message.html" title="class in com.google.android.gcm.server">Message</A> message,
+ java.util.List<java.lang.String> registrationIds)
+ throws java.io.IOException</PRE>
+<DL>
+<DD>Sends a message without retrying in case of service unavailability. See
+ <A HREF="../../../../../com/google/android/gcm/server/Sender.html#send(com.google.android.gcm.server.Message, java.util.List, int)"><CODE>send(Message, List, int)</CODE></A> for more info.
+<P>
+<DD><DL>
+
+<DT><B>Returns:</B><DD>true if the message was sent successfully,
+ false if it failed but could be retried.
+<DT><B>Throws:</B>
+<DD><CODE>java.lang.IllegalArgumentException</CODE> - if registrationIds is null or
+ empty.
+<DD><CODE><A HREF="../../../../../com/google/android/gcm/server/InvalidRequestException.html" title="class in com.google.android.gcm.server">InvalidRequestException</A></CODE> - if GCM didn't returned a 200 status.
+<DD><CODE>java.io.IOException</CODE> - if message could not be sent or received.</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="post(java.lang.String, java.lang.String)"><!-- --></A><H3>
+post</H3>
+<PRE>
+protected java.net.HttpURLConnection <B>post</B>(java.lang.String url,
+ java.lang.String body)
+ throws java.io.IOException</PRE>
+<DL>
+<DD>Make an HTTP post to a given URL.
+<P>
+<DD><DL>
+
+<DT><B>Returns:</B><DD>HTTP response.
+<DT><B>Throws:</B>
+<DD><CODE>java.io.IOException</CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="post(java.lang.String, java.lang.String, java.lang.String)"><!-- --></A><H3>
+post</H3>
+<PRE>
+protected java.net.HttpURLConnection <B>post</B>(java.lang.String url,
+ java.lang.String contentType,
+ java.lang.String body)
+ throws java.io.IOException</PRE>
+<DL>
+<DD><DL>
+
+<DT><B>Throws:</B>
+<DD><CODE>java.io.IOException</CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="newKeyValues(java.lang.String, java.lang.String)"><!-- --></A><H3>
+newKeyValues</H3>
+<PRE>
+protected static final java.util.Map<java.lang.String,java.lang.String> <B>newKeyValues</B>(java.lang.String key,
+ java.lang.String value)</PRE>
+<DL>
+<DD>Creates a map with just one key-value pair.
+<P>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="newBody(java.lang.String, java.lang.String)"><!-- --></A><H3>
+newBody</H3>
+<PRE>
+protected static java.lang.StringBuilder <B>newBody</B>(java.lang.String name,
+ java.lang.String value)</PRE>
+<DL>
+<DD>Creates a <CODE>StringBuilder</CODE> to be used as the body of an HTTP POST.
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>name</CODE> - initial parameter for the POST.<DD><CODE>value</CODE> - initial value for that parameter.
+<DT><B>Returns:</B><DD>StringBuilder to be used an HTTP POST body.</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="addParameter(java.lang.StringBuilder, java.lang.String, java.lang.String)"><!-- --></A><H3>
+addParameter</H3>
+<PRE>
+protected static void <B>addParameter</B>(java.lang.StringBuilder body,
+ java.lang.String name,
+ java.lang.String value)</PRE>
+<DL>
+<DD>Adds a new parameter to the HTTP POST body.
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>body</CODE> - HTTP POST body<DD><CODE>name</CODE> - parameter's name<DD><CODE>value</CODE> - parameter's value</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="getConnection(java.lang.String)"><!-- --></A><H3>
+getConnection</H3>
+<PRE>
+protected java.net.HttpURLConnection <B>getConnection</B>(java.lang.String url)
+ throws java.io.IOException</PRE>
+<DL>
+<DD>Gets an <CODE>HttpURLConnection</CODE> given an URL.
+<P>
+<DD><DL>
+
+<DT><B>Throws:</B>
+<DD><CODE>java.io.IOException</CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="getString(java.io.InputStream)"><!-- --></A><H3>
+getString</H3>
+<PRE>
+protected static java.lang.String <B>getString</B>(java.io.InputStream stream)
+ throws java.io.IOException</PRE>
+<DL>
+<DD>Convenience method to convert an InputStream to a String.
+
+ <p>
+ If the stream ends in a newline character, it will be stripped.
+<P>
+<DD><DL>
+
+<DT><B>Throws:</B>
+<DD><CODE>java.io.IOException</CODE></DL>
+</DD>
+</DL>
+<!-- ========= END OF CLASS DATA ========= -->
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../com/google/android/gcm/server/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../../com/google/android/gcm/server/Result.html" title="class in com.google.android.gcm.server"><B>PREV CLASS</B></A>
+ NEXT CLASS</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../../index.html?com/google/android/gcm/server/Sender.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="Sender.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+ SUMMARY: NESTED | <A HREF="#field_summary">FIELD</A> | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: <A HREF="#field_detail">FIELD</A> | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+
+</BODY>
+</HTML>
diff --git a/docs/html/guide/google/gcm/server-javadoc/com/google/android/gcm/server/package-frame.html b/docs/html/guide/google/gcm/server-javadoc/com/google/android/gcm/server/package-frame.html
new file mode 100644
index 0000000..8312f46
--- /dev/null
+++ b/docs/html/guide/google/gcm/server-javadoc/com/google/android/gcm/server/package-frame.html
@@ -0,0 +1,53 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_20) on Thu Jun 21 12:04:57 PDT 2012 -->
+<TITLE>
+com.google.android.gcm.server
+</TITLE>
+
+<META NAME="date" CONTENT="2012-06-21">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../stylesheet.css" TITLE="Style">
+
+
+</HEAD>
+
+<BODY BGCOLOR="white">
+<FONT size="+1" CLASS="FrameTitleFont">
+<A HREF="../../../../../com/google/android/gcm/server/package-summary.html" target="classFrame">com.google.android.gcm.server</A></FONT>
+<TABLE BORDER="0" WIDTH="100%" SUMMARY="">
+<TR>
+<TD NOWRAP><FONT size="+1" CLASS="FrameHeadingFont">
+Classes</FONT>
+<FONT CLASS="FrameItemFont">
+<BR>
+<A HREF="Constants.html" title="class in com.google.android.gcm.server" target="classFrame">Constants</A>
+<BR>
+<A HREF="Message.html" title="class in com.google.android.gcm.server" target="classFrame">Message</A>
+<BR>
+<A HREF="Message.Builder.html" title="class in com.google.android.gcm.server" target="classFrame">Message.Builder</A>
+<BR>
+<A HREF="MulticastResult.html" title="class in com.google.android.gcm.server" target="classFrame">MulticastResult</A>
+<BR>
+<A HREF="Result.html" title="class in com.google.android.gcm.server" target="classFrame">Result</A>
+<BR>
+<A HREF="Sender.html" title="class in com.google.android.gcm.server" target="classFrame">Sender</A></FONT></TD>
+</TR>
+</TABLE>
+
+
+<TABLE BORDER="0" WIDTH="100%" SUMMARY="">
+<TR>
+<TD NOWRAP><FONT size="+1" CLASS="FrameHeadingFont">
+Exceptions</FONT>
+<FONT CLASS="FrameItemFont">
+<BR>
+<A HREF="InvalidRequestException.html" title="class in com.google.android.gcm.server" target="classFrame">InvalidRequestException</A></FONT></TD>
+</TR>
+</TABLE>
+
+
+</BODY>
+</HTML>
diff --git a/docs/html/guide/google/gcm/server-javadoc/com/google/android/gcm/server/package-summary.html b/docs/html/guide/google/gcm/server-javadoc/com/google/android/gcm/server/package-summary.html
new file mode 100644
index 0000000..27b0564
--- /dev/null
+++ b/docs/html/guide/google/gcm/server-javadoc/com/google/android/gcm/server/package-summary.html
@@ -0,0 +1,187 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_20) on Thu Jun 21 12:04:57 PDT 2012 -->
+<TITLE>
+com.google.android.gcm.server
+</TITLE>
+
+<META NAME="date" CONTENT="2012-06-21">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+ if (location.href.indexOf('is-external=true') == -1) {
+ parent.document.title="com.google.android.gcm.server";
+ }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../com/google/android/gcm/server/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV PACKAGE
+ NEXT PACKAGE</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../../index.html?com/google/android/gcm/server/package-summary.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="package-summary.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<H2>
+Package com.google.android.gcm.server
+</H2>
+
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Class Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD WIDTH="15%"><B><A HREF="../../../../../com/google/android/gcm/server/Constants.html" title="class in com.google.android.gcm.server">Constants</A></B></TD>
+<TD>Constants used on GCM service communication.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD WIDTH="15%"><B><A HREF="../../../../../com/google/android/gcm/server/Message.html" title="class in com.google.android.gcm.server">Message</A></B></TD>
+<TD>GCM message.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD WIDTH="15%"><B><A HREF="../../../../../com/google/android/gcm/server/Message.Builder.html" title="class in com.google.android.gcm.server">Message.Builder</A></B></TD>
+<TD> </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD WIDTH="15%"><B><A HREF="../../../../../com/google/android/gcm/server/MulticastResult.html" title="class in com.google.android.gcm.server">MulticastResult</A></B></TD>
+<TD>Result of a GCM multicast message request .</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD WIDTH="15%"><B><A HREF="../../../../../com/google/android/gcm/server/Result.html" title="class in com.google.android.gcm.server">Result</A></B></TD>
+<TD>Result of a GCM message request that returned HTTP status code 200.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD WIDTH="15%"><B><A HREF="../../../../../com/google/android/gcm/server/Sender.html" title="class in com.google.android.gcm.server">Sender</A></B></TD>
+<TD>Helper class to send messages to the GCM service using an API Key.</TD>
+</TR>
+</TABLE>
+
+
+<P>
+
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Exception Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD WIDTH="15%"><B><A HREF="../../../../../com/google/android/gcm/server/InvalidRequestException.html" title="class in com.google.android.gcm.server">InvalidRequestException</A></B></TD>
+<TD>Exception thrown when GCM returned an error due to an invalid request.</TD>
+</TR>
+</TABLE>
+
+
+<P>
+<DL>
+</DL>
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../com/google/android/gcm/server/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV PACKAGE
+ NEXT PACKAGE</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../../index.html?com/google/android/gcm/server/package-summary.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="package-summary.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+
+</BODY>
+</HTML>
diff --git a/docs/html/guide/google/gcm/server-javadoc/com/google/android/gcm/server/package-tree.html b/docs/html/guide/google/gcm/server-javadoc/com/google/android/gcm/server/package-tree.html
new file mode 100644
index 0000000..81efcef
--- /dev/null
+++ b/docs/html/guide/google/gcm/server-javadoc/com/google/android/gcm/server/package-tree.html
@@ -0,0 +1,156 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_20) on Thu Jun 21 12:04:57 PDT 2012 -->
+<TITLE>
+com.google.android.gcm.server Class Hierarchy
+</TITLE>
+
+<META NAME="date" CONTENT="2012-06-21">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+ if (location.href.indexOf('is-external=true') == -1) {
+ parent.document.title="com.google.android.gcm.server Class Hierarchy";
+ }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../com/google/android/gcm/server/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Tree</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../../index.html?com/google/android/gcm/server/package-tree.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="package-tree.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<CENTER>
+<H2>
+Hierarchy For Package com.google.android.gcm.server
+</H2>
+</CENTER>
+<H2>
+Class Hierarchy
+</H2>
+<UL>
+<LI TYPE="circle">java.lang.Object<UL>
+<LI TYPE="circle">com.google.android.gcm.server.<A HREF="../../../../../com/google/android/gcm/server/Constants.html" title="class in com.google.android.gcm.server"><B>Constants</B></A><LI TYPE="circle">com.google.android.gcm.server.<A HREF="../../../../../com/google/android/gcm/server/Message.html" title="class in com.google.android.gcm.server"><B>Message</B></A> (implements java.io.Serializable)
+<LI TYPE="circle">com.google.android.gcm.server.<A HREF="../../../../../com/google/android/gcm/server/Message.Builder.html" title="class in com.google.android.gcm.server"><B>Message.Builder</B></A><LI TYPE="circle">com.google.android.gcm.server.<A HREF="../../../../../com/google/android/gcm/server/MulticastResult.html" title="class in com.google.android.gcm.server"><B>MulticastResult</B></A> (implements java.io.Serializable)
+<LI TYPE="circle">com.google.android.gcm.server.<A HREF="../../../../../com/google/android/gcm/server/Result.html" title="class in com.google.android.gcm.server"><B>Result</B></A> (implements java.io.Serializable)
+<LI TYPE="circle">com.google.android.gcm.server.<A HREF="../../../../../com/google/android/gcm/server/Sender.html" title="class in com.google.android.gcm.server"><B>Sender</B></A><LI TYPE="circle">java.lang.Throwable (implements java.io.Serializable)
+<UL>
+<LI TYPE="circle">java.lang.Exception<UL>
+<LI TYPE="circle">java.io.IOException<UL>
+<LI TYPE="circle">com.google.android.gcm.server.<A HREF="../../../../../com/google/android/gcm/server/InvalidRequestException.html" title="class in com.google.android.gcm.server"><B>InvalidRequestException</B></A></UL>
+</UL>
+</UL>
+</UL>
+</UL>
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../com/google/android/gcm/server/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Tree</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../../index.html?com/google/android/gcm/server/package-tree.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="package-tree.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+
+</BODY>
+</HTML>
diff --git a/docs/html/guide/google/gcm/server-javadoc/constant-values.html b/docs/html/guide/google/gcm/server-javadoc/constant-values.html
new file mode 100644
index 0000000..5efe6f5
--- /dev/null
+++ b/docs/html/guide/google/gcm/server-javadoc/constant-values.html
@@ -0,0 +1,356 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_20) on Thu Jun 21 12:04:57 PDT 2012 -->
+<TITLE>
+Constant Field Values
+</TITLE>
+
+<META NAME="date" CONTENT="2012-06-21">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+ if (location.href.indexOf('is-external=true') == -1) {
+ parent.document.title="Constant Field Values";
+ }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="com/google/android/gcm/server/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html?constant-values.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="constant-values.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<CENTER>
+<H1>
+Constant Field Values</H1>
+</CENTER>
+<HR SIZE="4" NOSHADE>
+<B>Contents</B><UL>
+<LI><A HREF="#com.google">com.google.*</A>
+</UL>
+
+<A NAME="com.google"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left"><FONT SIZE="+2">
+com.google.*</FONT></TH>
+</TR>
+</TABLE>
+
+<P>
+
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left" COLSPAN="3">com.google.android.gcm.server.<A HREF="com/google/android/gcm/server/Constants.html" title="class in com.google.android.gcm.server">Constants</A></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="com.google.android.gcm.server.Constants.ERROR_DEVICE_QUOTA_EXCEEDED"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final java.lang.String</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="com/google/android/gcm/server/Constants.html#ERROR_DEVICE_QUOTA_EXCEEDED">ERROR_DEVICE_QUOTA_EXCEEDED</A></CODE></TD>
+<TD ALIGN="right"><CODE>"DeviceQuotaExceeded"</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="com.google.android.gcm.server.Constants.ERROR_INVALID_REGISTRATION"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final java.lang.String</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="com/google/android/gcm/server/Constants.html#ERROR_INVALID_REGISTRATION">ERROR_INVALID_REGISTRATION</A></CODE></TD>
+<TD ALIGN="right"><CODE>"InvalidRegistration"</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="com.google.android.gcm.server.Constants.ERROR_MESSAGE_TOO_BIG"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final java.lang.String</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="com/google/android/gcm/server/Constants.html#ERROR_MESSAGE_TOO_BIG">ERROR_MESSAGE_TOO_BIG</A></CODE></TD>
+<TD ALIGN="right"><CODE>"MessageTooBig"</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="com.google.android.gcm.server.Constants.ERROR_MISMATCH_SENDER_ID"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final java.lang.String</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="com/google/android/gcm/server/Constants.html#ERROR_MISMATCH_SENDER_ID">ERROR_MISMATCH_SENDER_ID</A></CODE></TD>
+<TD ALIGN="right"><CODE>"MismatchSenderId"</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="com.google.android.gcm.server.Constants.ERROR_MISSING_COLLAPSE_KEY"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final java.lang.String</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="com/google/android/gcm/server/Constants.html#ERROR_MISSING_COLLAPSE_KEY">ERROR_MISSING_COLLAPSE_KEY</A></CODE></TD>
+<TD ALIGN="right"><CODE>"MissingCollapseKey"</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="com.google.android.gcm.server.Constants.ERROR_MISSING_REGISTRATION"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final java.lang.String</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="com/google/android/gcm/server/Constants.html#ERROR_MISSING_REGISTRATION">ERROR_MISSING_REGISTRATION</A></CODE></TD>
+<TD ALIGN="right"><CODE>"MissingRegistration"</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="com.google.android.gcm.server.Constants.ERROR_NOT_REGISTERED"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final java.lang.String</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="com/google/android/gcm/server/Constants.html#ERROR_NOT_REGISTERED">ERROR_NOT_REGISTERED</A></CODE></TD>
+<TD ALIGN="right"><CODE>"NotRegistered"</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="com.google.android.gcm.server.Constants.ERROR_QUOTA_EXCEEDED"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final java.lang.String</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="com/google/android/gcm/server/Constants.html#ERROR_QUOTA_EXCEEDED">ERROR_QUOTA_EXCEEDED</A></CODE></TD>
+<TD ALIGN="right"><CODE>"QuotaExceeded"</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="com.google.android.gcm.server.Constants.ERROR_UNAVAILABLE"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final java.lang.String</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="com/google/android/gcm/server/Constants.html#ERROR_UNAVAILABLE">ERROR_UNAVAILABLE</A></CODE></TD>
+<TD ALIGN="right"><CODE>"Unavailable"</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="com.google.android.gcm.server.Constants.GCM_SEND_ENDPOINT"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final java.lang.String</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="com/google/android/gcm/server/Constants.html#GCM_SEND_ENDPOINT">GCM_SEND_ENDPOINT</A></CODE></TD>
+<TD ALIGN="right"><CODE>"https://android.googleapis.com/gcm/send"</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="com.google.android.gcm.server.Constants.JSON_CANONICAL_IDS"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final java.lang.String</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="com/google/android/gcm/server/Constants.html#JSON_CANONICAL_IDS">JSON_CANONICAL_IDS</A></CODE></TD>
+<TD ALIGN="right"><CODE>"canonical_ids"</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="com.google.android.gcm.server.Constants.JSON_ERROR"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final java.lang.String</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="com/google/android/gcm/server/Constants.html#JSON_ERROR">JSON_ERROR</A></CODE></TD>
+<TD ALIGN="right"><CODE>"error"</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="com.google.android.gcm.server.Constants.JSON_FAILURE"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final java.lang.String</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="com/google/android/gcm/server/Constants.html#JSON_FAILURE">JSON_FAILURE</A></CODE></TD>
+<TD ALIGN="right"><CODE>"failure"</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="com.google.android.gcm.server.Constants.JSON_MESSAGE_ID"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final java.lang.String</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="com/google/android/gcm/server/Constants.html#JSON_MESSAGE_ID">JSON_MESSAGE_ID</A></CODE></TD>
+<TD ALIGN="right"><CODE>"message_id"</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="com.google.android.gcm.server.Constants.JSON_MULTICAST_ID"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final java.lang.String</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="com/google/android/gcm/server/Constants.html#JSON_MULTICAST_ID">JSON_MULTICAST_ID</A></CODE></TD>
+<TD ALIGN="right"><CODE>"multicast_id"</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="com.google.android.gcm.server.Constants.JSON_PAYLOAD"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final java.lang.String</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="com/google/android/gcm/server/Constants.html#JSON_PAYLOAD">JSON_PAYLOAD</A></CODE></TD>
+<TD ALIGN="right"><CODE>"data"</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="com.google.android.gcm.server.Constants.JSON_REGISTRATION_IDS"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final java.lang.String</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="com/google/android/gcm/server/Constants.html#JSON_REGISTRATION_IDS">JSON_REGISTRATION_IDS</A></CODE></TD>
+<TD ALIGN="right"><CODE>"registration_ids"</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="com.google.android.gcm.server.Constants.JSON_RESULTS"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final java.lang.String</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="com/google/android/gcm/server/Constants.html#JSON_RESULTS">JSON_RESULTS</A></CODE></TD>
+<TD ALIGN="right"><CODE>"results"</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="com.google.android.gcm.server.Constants.JSON_SUCCESS"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final java.lang.String</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="com/google/android/gcm/server/Constants.html#JSON_SUCCESS">JSON_SUCCESS</A></CODE></TD>
+<TD ALIGN="right"><CODE>"success"</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="com.google.android.gcm.server.Constants.PARAM_COLLAPSE_KEY"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final java.lang.String</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="com/google/android/gcm/server/Constants.html#PARAM_COLLAPSE_KEY">PARAM_COLLAPSE_KEY</A></CODE></TD>
+<TD ALIGN="right"><CODE>"collapse_key"</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="com.google.android.gcm.server.Constants.PARAM_DELAY_WHILE_IDLE"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final java.lang.String</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="com/google/android/gcm/server/Constants.html#PARAM_DELAY_WHILE_IDLE">PARAM_DELAY_WHILE_IDLE</A></CODE></TD>
+<TD ALIGN="right"><CODE>"delay_while_idle"</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="com.google.android.gcm.server.Constants.PARAM_PAYLOAD_PREFIX"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final java.lang.String</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="com/google/android/gcm/server/Constants.html#PARAM_PAYLOAD_PREFIX">PARAM_PAYLOAD_PREFIX</A></CODE></TD>
+<TD ALIGN="right"><CODE>"data."</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="com.google.android.gcm.server.Constants.PARAM_REGISTRATION_ID"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final java.lang.String</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="com/google/android/gcm/server/Constants.html#PARAM_REGISTRATION_ID">PARAM_REGISTRATION_ID</A></CODE></TD>
+<TD ALIGN="right"><CODE>"registration_id"</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="com.google.android.gcm.server.Constants.PARAM_TIME_TO_LIVE"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final java.lang.String</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="com/google/android/gcm/server/Constants.html#PARAM_TIME_TO_LIVE">PARAM_TIME_TO_LIVE</A></CODE></TD>
+<TD ALIGN="right"><CODE>"time_to_live"</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="com.google.android.gcm.server.Constants.TOKEN_CANONICAL_REG_ID"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final java.lang.String</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="com/google/android/gcm/server/Constants.html#TOKEN_CANONICAL_REG_ID">TOKEN_CANONICAL_REG_ID</A></CODE></TD>
+<TD ALIGN="right"><CODE>"registration_id"</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="com.google.android.gcm.server.Constants.TOKEN_ERROR"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final java.lang.String</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="com/google/android/gcm/server/Constants.html#TOKEN_ERROR">TOKEN_ERROR</A></CODE></TD>
+<TD ALIGN="right"><CODE>"Error"</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="com.google.android.gcm.server.Constants.TOKEN_MESSAGE_ID"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final java.lang.String</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="com/google/android/gcm/server/Constants.html#TOKEN_MESSAGE_ID">TOKEN_MESSAGE_ID</A></CODE></TD>
+<TD ALIGN="right"><CODE>"id"</CODE></TD>
+</TR>
+</FONT></TD>
+</TR>
+</TABLE>
+
+<P>
+
+<P>
+
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left" COLSPAN="3">com.google.android.gcm.server.<A HREF="com/google/android/gcm/server/Sender.html" title="class in com.google.android.gcm.server">Sender</A></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="com.google.android.gcm.server.Sender.BACKOFF_INITIAL_DELAY"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>protected static final int</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="com/google/android/gcm/server/Sender.html#BACKOFF_INITIAL_DELAY">BACKOFF_INITIAL_DELAY</A></CODE></TD>
+<TD ALIGN="right"><CODE>1000</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="com.google.android.gcm.server.Sender.MAX_BACKOFF_DELAY"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>protected static final int</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="com/google/android/gcm/server/Sender.html#MAX_BACKOFF_DELAY">MAX_BACKOFF_DELAY</A></CODE></TD>
+<TD ALIGN="right"><CODE>1024000</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="com.google.android.gcm.server.Sender.UTF8"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>protected static final java.lang.String</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="com/google/android/gcm/server/Sender.html#UTF8">UTF8</A></CODE></TD>
+<TD ALIGN="right"><CODE>"UTF-8"</CODE></TD>
+</TR>
+</FONT></TD>
+</TR>
+</TABLE>
+
+<P>
+
+<P>
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="com/google/android/gcm/server/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html?constant-values.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="constant-values.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+
+</BODY>
+</HTML>
diff --git a/docs/html/guide/google/gcm/server-javadoc/deprecated-list.html b/docs/html/guide/google/gcm/server-javadoc/deprecated-list.html
new file mode 100644
index 0000000..0082614
--- /dev/null
+++ b/docs/html/guide/google/gcm/server-javadoc/deprecated-list.html
@@ -0,0 +1,142 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_20) on Thu Jun 21 12:04:57 PDT 2012 -->
+<TITLE>
+Deprecated List
+</TITLE>
+
+<META NAME="date" CONTENT="2012-06-21">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+ if (location.href.indexOf('is-external=true') == -1) {
+ parent.document.title="Deprecated List";
+ }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="com/google/android/gcm/server/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Deprecated</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html?deprecated-list.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="deprecated-list.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<CENTER>
+<H2>
+<B>Deprecated API</B></H2>
+</CENTER>
+<HR SIZE="4" NOSHADE>
+<B>Contents</B><UL>
+</UL>
+
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="com/google/android/gcm/server/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Deprecated</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html?deprecated-list.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="deprecated-list.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+
+</BODY>
+</HTML>
diff --git a/docs/html/guide/google/gcm/server-javadoc/help-doc.html b/docs/html/guide/google/gcm/server-javadoc/help-doc.html
new file mode 100644
index 0000000..72f9fb2
--- /dev/null
+++ b/docs/html/guide/google/gcm/server-javadoc/help-doc.html
@@ -0,0 +1,209 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_20) on Thu Jun 21 12:04:57 PDT 2012 -->
+<TITLE>
+API Help
+</TITLE>
+
+<META NAME="date" CONTENT="2012-06-21">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+ if (location.href.indexOf('is-external=true') == -1) {
+ parent.document.title="API Help";
+ }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="com/google/android/gcm/server/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Help</B></FONT> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html?help-doc.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="help-doc.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<CENTER>
+<H1>
+How This API Document Is Organized</H1>
+</CENTER>
+This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.<H3>
+Package</H3>
+<BLOCKQUOTE>
+
+<P>
+Each package has a page that contains a list of its classes and interfaces, with a summary for each. This page can contain four categories:<UL>
+<LI>Interfaces (italic)<LI>Classes<LI>Enums<LI>Exceptions<LI>Errors<LI>Annotation Types</UL>
+</BLOCKQUOTE>
+<H3>
+Class/Interface</H3>
+<BLOCKQUOTE>
+
+<P>
+Each class, interface, nested class and nested interface has its own separate page. Each of these pages has three sections consisting of a class/interface description, summary tables, and detailed member descriptions:<UL>
+<LI>Class inheritance diagram<LI>Direct Subclasses<LI>All Known Subinterfaces<LI>All Known Implementing Classes<LI>Class/interface declaration<LI>Class/interface description
+<P>
+<LI>Nested Class Summary<LI>Field Summary<LI>Constructor Summary<LI>Method Summary
+<P>
+<LI>Field Detail<LI>Constructor Detail<LI>Method Detail</UL>
+Each summary entry contains the first sentence from the detailed description for that item. The summary entries are alphabetical, while the detailed descriptions are in the order they appear in the source code. This preserves the logical groupings established by the programmer.</BLOCKQUOTE>
+</BLOCKQUOTE>
+<H3>
+Annotation Type</H3>
+<BLOCKQUOTE>
+
+<P>
+Each annotation type has its own separate page with the following sections:<UL>
+<LI>Annotation Type declaration<LI>Annotation Type description<LI>Required Element Summary<LI>Optional Element Summary<LI>Element Detail</UL>
+</BLOCKQUOTE>
+</BLOCKQUOTE>
+<H3>
+Enum</H3>
+<BLOCKQUOTE>
+
+<P>
+Each enum has its own separate page with the following sections:<UL>
+<LI>Enum declaration<LI>Enum description<LI>Enum Constant Summary<LI>Enum Constant Detail</UL>
+</BLOCKQUOTE>
+<H3>
+Tree (Class Hierarchy)</H3>
+<BLOCKQUOTE>
+There is a <A HREF="overview-tree.html">Class Hierarchy</A> page for all packages, plus a hierarchy for each package. Each hierarchy page contains a list of classes and a list of interfaces. The classes are organized by inheritance structure starting with <code>java.lang.Object</code>. The interfaces do not inherit from <code>java.lang.Object</code>.<UL>
+<LI>When viewing the Overview page, clicking on "Tree" displays the hierarchy for all packages.<LI>When viewing a particular package, class or interface page, clicking "Tree" displays the hierarchy for only that package.</UL>
+</BLOCKQUOTE>
+<H3>
+Deprecated API</H3>
+<BLOCKQUOTE>
+The <A HREF="deprecated-list.html">Deprecated API</A> page lists all of the API that have been deprecated. A deprecated API is not recommended for use, generally due to improvements, and a replacement API is usually given. Deprecated APIs may be removed in future implementations.</BLOCKQUOTE>
+<H3>
+Index</H3>
+<BLOCKQUOTE>
+The <A HREF="index-all.html">Index</A> contains an alphabetic list of all classes, interfaces, constructors, methods, and fields.</BLOCKQUOTE>
+<H3>
+Prev/Next</H3>
+These links take you to the next or previous class, interface, package, or related page.<H3>
+Frames/No Frames</H3>
+These links show and hide the HTML frames. All pages are available with or without frames.
+<P>
+<H3>
+Serialized Form</H3>
+Each serializable or externalizable class has a description of its serialization fields and methods. This information is of interest to re-implementors, not to developers using the API. While there is no link in the navigation bar, you can get to this information by going to any serialized class and clicking "Serialized Form" in the "See also" section of the class description.
+<P>
+<H3>
+Constant Field Values</H3>
+The <a href="constant-values.html">Constant Field Values</a> page lists the static final fields and their values.
+<P>
+<FONT SIZE="-1">
+<EM>
+This help file applies to API documentation generated using the standard doclet.</EM>
+</FONT>
+<BR>
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="com/google/android/gcm/server/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Help</B></FONT> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html?help-doc.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="help-doc.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+
+</BODY>
+</HTML>
diff --git a/docs/html/guide/google/gcm/server-javadoc/index-all.html b/docs/html/guide/google/gcm/server-javadoc/index-all.html
new file mode 100644
index 0000000..e6325cb
--- /dev/null
+++ b/docs/html/guide/google/gcm/server-javadoc/index-all.html
@@ -0,0 +1,431 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_20) on Thu Jun 21 12:04:57 PDT 2012 -->
+<TITLE>
+Index
+</TITLE>
+
+<META NAME="date" CONTENT="2012-06-21">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="./stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+ if (location.href.indexOf('is-external=true') == -1) {
+ parent.document.title="Index";
+ }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="./com/google/android/gcm/server/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="./overview-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="./deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Index</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="./help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="./index.html?index-all.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="index-all.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="./allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="./allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<A HREF="#_A_">A</A> <A HREF="#_B_">B</A> <A HREF="#_C_">C</A> <A HREF="#_D_">D</A> <A HREF="#_E_">E</A> <A HREF="#_G_">G</A> <A HREF="#_I_">I</A> <A HREF="#_J_">J</A> <A HREF="#_L_">L</A> <A HREF="#_M_">M</A> <A HREF="#_N_">N</A> <A HREF="#_P_">P</A> <A HREF="#_R_">R</A> <A HREF="#_S_">S</A> <A HREF="#_T_">T</A> <A HREF="#_U_">U</A> <HR>
+<A NAME="_A_"><!-- --></A><H2>
+<B>A</B></H2>
+<DL>
+<DT><A HREF="./com/google/android/gcm/server/Message.Builder.html#addData(java.lang.String, java.lang.String)"><B>addData(String, String)</B></A> -
+Method in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Message.Builder.html" title="class in com.google.android.gcm.server">Message.Builder</A>
+<DD>Adds a key/value pair to the payload data.
+<DT><A HREF="./com/google/android/gcm/server/Sender.html#addParameter(java.lang.StringBuilder, java.lang.String, java.lang.String)"><B>addParameter(StringBuilder, String, String)</B></A> -
+Static method in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Sender.html" title="class in com.google.android.gcm.server">Sender</A>
+<DD>Adds a new parameter to the HTTP POST body.
+</DL>
+<HR>
+<A NAME="_B_"><!-- --></A><H2>
+<B>B</B></H2>
+<DL>
+<DT><A HREF="./com/google/android/gcm/server/Sender.html#BACKOFF_INITIAL_DELAY"><B>BACKOFF_INITIAL_DELAY</B></A> -
+Static variable in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Sender.html" title="class in com.google.android.gcm.server">Sender</A>
+<DD>Initial delay before first retry, without jitter.
+<DT><A HREF="./com/google/android/gcm/server/Message.Builder.html#build()"><B>build()</B></A> -
+Method in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Message.Builder.html" title="class in com.google.android.gcm.server">Message.Builder</A>
+<DD>
+</DL>
+<HR>
+<A NAME="_C_"><!-- --></A><H2>
+<B>C</B></H2>
+<DL>
+<DT><A HREF="./com/google/android/gcm/server/Message.Builder.html#collapseKey(java.lang.String)"><B>collapseKey(String)</B></A> -
+Method in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Message.Builder.html" title="class in com.google.android.gcm.server">Message.Builder</A>
+<DD>Sets the collapseKey property.
+<DT><A HREF="./com/google/android/gcm/server/package-summary.html"><B>com.google.android.gcm.server</B></A> - package com.google.android.gcm.server<DD> <DT><A HREF="./com/google/android/gcm/server/Constants.html" title="class in com.google.android.gcm.server"><B>Constants</B></A> - Class in <A HREF="./com/google/android/gcm/server/package-summary.html">com.google.android.gcm.server</A><DD>Constants used on GCM service communication.</DL>
+<HR>
+<A NAME="_D_"><!-- --></A><H2>
+<B>D</B></H2>
+<DL>
+<DT><A HREF="./com/google/android/gcm/server/Message.Builder.html#delayWhileIdle(boolean)"><B>delayWhileIdle(boolean)</B></A> -
+Method in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Message.Builder.html" title="class in com.google.android.gcm.server">Message.Builder</A>
+<DD>Sets the delayWhileIdle property (default value is false).
+</DL>
+<HR>
+<A NAME="_E_"><!-- --></A><H2>
+<B>E</B></H2>
+<DL>
+<DT><A HREF="./com/google/android/gcm/server/Constants.html#ERROR_DEVICE_QUOTA_EXCEEDED"><B>ERROR_DEVICE_QUOTA_EXCEEDED</B></A> -
+Static variable in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Constants.html" title="class in com.google.android.gcm.server">Constants</A>
+<DD>Too many messages sent by the sender to a specific device.
+<DT><A HREF="./com/google/android/gcm/server/Constants.html#ERROR_INVALID_REGISTRATION"><B>ERROR_INVALID_REGISTRATION</B></A> -
+Static variable in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Constants.html" title="class in com.google.android.gcm.server">Constants</A>
+<DD>Bad registration_id.
+<DT><A HREF="./com/google/android/gcm/server/Constants.html#ERROR_MESSAGE_TOO_BIG"><B>ERROR_MESSAGE_TOO_BIG</B></A> -
+Static variable in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Constants.html" title="class in com.google.android.gcm.server">Constants</A>
+<DD>The payload of the message is too big, see the limitations.
+<DT><A HREF="./com/google/android/gcm/server/Constants.html#ERROR_MISMATCH_SENDER_ID"><B>ERROR_MISMATCH_SENDER_ID</B></A> -
+Static variable in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Constants.html" title="class in com.google.android.gcm.server">Constants</A>
+<DD>The sender_id contained in the registration_id does not match the
+ sender_id used to register with the GCM servers.
+<DT><A HREF="./com/google/android/gcm/server/Constants.html#ERROR_MISSING_COLLAPSE_KEY"><B>ERROR_MISSING_COLLAPSE_KEY</B></A> -
+Static variable in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Constants.html" title="class in com.google.android.gcm.server">Constants</A>
+<DD>Collapse key is required.
+<DT><A HREF="./com/google/android/gcm/server/Constants.html#ERROR_MISSING_REGISTRATION"><B>ERROR_MISSING_REGISTRATION</B></A> -
+Static variable in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Constants.html" title="class in com.google.android.gcm.server">Constants</A>
+<DD>Missing registration_id.
+<DT><A HREF="./com/google/android/gcm/server/Constants.html#ERROR_NOT_REGISTERED"><B>ERROR_NOT_REGISTERED</B></A> -
+Static variable in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Constants.html" title="class in com.google.android.gcm.server">Constants</A>
+<DD>The user has uninstalled the application or turned off notifications.
+<DT><A HREF="./com/google/android/gcm/server/Constants.html#ERROR_QUOTA_EXCEEDED"><B>ERROR_QUOTA_EXCEEDED</B></A> -
+Static variable in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Constants.html" title="class in com.google.android.gcm.server">Constants</A>
+<DD>Too many messages sent by the sender.
+<DT><A HREF="./com/google/android/gcm/server/Constants.html#ERROR_UNAVAILABLE"><B>ERROR_UNAVAILABLE</B></A> -
+Static variable in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Constants.html" title="class in com.google.android.gcm.server">Constants</A>
+<DD>Used to indicate that a particular message could not be sent because
+ the GCM servers were not available.
+</DL>
+<HR>
+<A NAME="_G_"><!-- --></A><H2>
+<B>G</B></H2>
+<DL>
+<DT><A HREF="./com/google/android/gcm/server/Constants.html#GCM_SEND_ENDPOINT"><B>GCM_SEND_ENDPOINT</B></A> -
+Static variable in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Constants.html" title="class in com.google.android.gcm.server">Constants</A>
+<DD>Endpoint for sending messages.
+<DT><A HREF="./com/google/android/gcm/server/MulticastResult.html#getCanonicalIds()"><B>getCanonicalIds()</B></A> -
+Method in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/MulticastResult.html" title="class in com.google.android.gcm.server">MulticastResult</A>
+<DD>Gets the number of successful messages that also returned a canonical
+ registration id.
+<DT><A HREF="./com/google/android/gcm/server/Result.html#getCanonicalRegistrationId()"><B>getCanonicalRegistrationId()</B></A> -
+Method in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Result.html" title="class in com.google.android.gcm.server">Result</A>
+<DD>Gets the canonical registration id, if any.
+<DT><A HREF="./com/google/android/gcm/server/Message.html#getCollapseKey()"><B>getCollapseKey()</B></A> -
+Method in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Message.html" title="class in com.google.android.gcm.server">Message</A>
+<DD>Gets the collapse key.
+<DT><A HREF="./com/google/android/gcm/server/Sender.html#getConnection(java.lang.String)"><B>getConnection(String)</B></A> -
+Method in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Sender.html" title="class in com.google.android.gcm.server">Sender</A>
+<DD>Gets an <CODE>HttpURLConnection</CODE> given an URL.
+<DT><A HREF="./com/google/android/gcm/server/Message.html#getData()"><B>getData()</B></A> -
+Method in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Message.html" title="class in com.google.android.gcm.server">Message</A>
+<DD>Gets the payload data, which is immutable.
+<DT><A HREF="./com/google/android/gcm/server/InvalidRequestException.html#getDescription()"><B>getDescription()</B></A> -
+Method in exception com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/InvalidRequestException.html" title="class in com.google.android.gcm.server">InvalidRequestException</A>
+<DD>Gets the error description.
+<DT><A HREF="./com/google/android/gcm/server/Result.html#getErrorCodeName()"><B>getErrorCodeName()</B></A> -
+Method in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Result.html" title="class in com.google.android.gcm.server">Result</A>
+<DD>Gets the error code, if any.
+<DT><A HREF="./com/google/android/gcm/server/MulticastResult.html#getFailure()"><B>getFailure()</B></A> -
+Method in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/MulticastResult.html" title="class in com.google.android.gcm.server">MulticastResult</A>
+<DD>Gets the number of failed messages.
+<DT><A HREF="./com/google/android/gcm/server/InvalidRequestException.html#getHttpStatusCode()"><B>getHttpStatusCode()</B></A> -
+Method in exception com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/InvalidRequestException.html" title="class in com.google.android.gcm.server">InvalidRequestException</A>
+<DD>Gets the HTTP Status Code.
+<DT><A HREF="./com/google/android/gcm/server/Result.html#getMessageId()"><B>getMessageId()</B></A> -
+Method in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Result.html" title="class in com.google.android.gcm.server">Result</A>
+<DD>Gets the message id, if any.
+<DT><A HREF="./com/google/android/gcm/server/MulticastResult.html#getMulticastId()"><B>getMulticastId()</B></A> -
+Method in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/MulticastResult.html" title="class in com.google.android.gcm.server">MulticastResult</A>
+<DD>Gets the multicast id.
+<DT><A HREF="./com/google/android/gcm/server/MulticastResult.html#getResults()"><B>getResults()</B></A> -
+Method in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/MulticastResult.html" title="class in com.google.android.gcm.server">MulticastResult</A>
+<DD>Gets the results of each individual message, which is immutable.
+<DT><A HREF="./com/google/android/gcm/server/MulticastResult.html#getRetryMulticastIds()"><B>getRetryMulticastIds()</B></A> -
+Method in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/MulticastResult.html" title="class in com.google.android.gcm.server">MulticastResult</A>
+<DD>Gets additional ids if more than one multicast message was sent.
+<DT><A HREF="./com/google/android/gcm/server/Sender.html#getString(java.io.InputStream)"><B>getString(InputStream)</B></A> -
+Static method in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Sender.html" title="class in com.google.android.gcm.server">Sender</A>
+<DD>Convenience method to convert an InputStream to a String.
+<DT><A HREF="./com/google/android/gcm/server/MulticastResult.html#getSuccess()"><B>getSuccess()</B></A> -
+Method in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/MulticastResult.html" title="class in com.google.android.gcm.server">MulticastResult</A>
+<DD>Gets the number of successful messages.
+<DT><A HREF="./com/google/android/gcm/server/Message.html#getTimeToLive()"><B>getTimeToLive()</B></A> -
+Method in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Message.html" title="class in com.google.android.gcm.server">Message</A>
+<DD>Gets the time to live (in seconds).
+<DT><A HREF="./com/google/android/gcm/server/MulticastResult.html#getTotal()"><B>getTotal()</B></A> -
+Method in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/MulticastResult.html" title="class in com.google.android.gcm.server">MulticastResult</A>
+<DD>Gets the total number of messages sent, regardless of the status.
+</DL>
+<HR>
+<A NAME="_I_"><!-- --></A><H2>
+<B>I</B></H2>
+<DL>
+<DT><A HREF="./com/google/android/gcm/server/InvalidRequestException.html" title="class in com.google.android.gcm.server"><B>InvalidRequestException</B></A> - Exception in <A HREF="./com/google/android/gcm/server/package-summary.html">com.google.android.gcm.server</A><DD>Exception thrown when GCM returned an error due to an invalid request.<DT><A HREF="./com/google/android/gcm/server/InvalidRequestException.html#InvalidRequestException(int)"><B>InvalidRequestException(int)</B></A> -
+Constructor for exception com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/InvalidRequestException.html" title="class in com.google.android.gcm.server">InvalidRequestException</A>
+<DD>
+<DT><A HREF="./com/google/android/gcm/server/InvalidRequestException.html#InvalidRequestException(int, java.lang.String)"><B>InvalidRequestException(int, String)</B></A> -
+Constructor for exception com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/InvalidRequestException.html" title="class in com.google.android.gcm.server">InvalidRequestException</A>
+<DD>
+<DT><A HREF="./com/google/android/gcm/server/Message.html#isDelayWhileIdle()"><B>isDelayWhileIdle()</B></A> -
+Method in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Message.html" title="class in com.google.android.gcm.server">Message</A>
+<DD>Gets the delayWhileIdle flag.
+</DL>
+<HR>
+<A NAME="_J_"><!-- --></A><H2>
+<B>J</B></H2>
+<DL>
+<DT><A HREF="./com/google/android/gcm/server/Constants.html#JSON_CANONICAL_IDS"><B>JSON_CANONICAL_IDS</B></A> -
+Static variable in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Constants.html" title="class in com.google.android.gcm.server">Constants</A>
+<DD>JSON-only field representing the number of messages with a canonical
+ registration id.
+<DT><A HREF="./com/google/android/gcm/server/Constants.html#JSON_ERROR"><B>JSON_ERROR</B></A> -
+Static variable in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Constants.html" title="class in com.google.android.gcm.server">Constants</A>
+<DD>JSON-only field representing the error field of an individual request.
+<DT><A HREF="./com/google/android/gcm/server/Constants.html#JSON_FAILURE"><B>JSON_FAILURE</B></A> -
+Static variable in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Constants.html" title="class in com.google.android.gcm.server">Constants</A>
+<DD>JSON-only field representing the number of failed messages.
+<DT><A HREF="./com/google/android/gcm/server/Constants.html#JSON_MESSAGE_ID"><B>JSON_MESSAGE_ID</B></A> -
+Static variable in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Constants.html" title="class in com.google.android.gcm.server">Constants</A>
+<DD>JSON-only field sent by GCM when a message was successfully sent.
+<DT><A HREF="./com/google/android/gcm/server/Constants.html#JSON_MULTICAST_ID"><B>JSON_MULTICAST_ID</B></A> -
+Static variable in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Constants.html" title="class in com.google.android.gcm.server">Constants</A>
+<DD>JSON-only field representing the id of the multicast request.
+<DT><A HREF="./com/google/android/gcm/server/Constants.html#JSON_PAYLOAD"><B>JSON_PAYLOAD</B></A> -
+Static variable in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Constants.html" title="class in com.google.android.gcm.server">Constants</A>
+<DD>JSON-only field representing the payload data.
+<DT><A HREF="./com/google/android/gcm/server/Constants.html#JSON_REGISTRATION_IDS"><B>JSON_REGISTRATION_IDS</B></A> -
+Static variable in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Constants.html" title="class in com.google.android.gcm.server">Constants</A>
+<DD>JSON-only field representing the registration ids.
+<DT><A HREF="./com/google/android/gcm/server/Constants.html#JSON_RESULTS"><B>JSON_RESULTS</B></A> -
+Static variable in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Constants.html" title="class in com.google.android.gcm.server">Constants</A>
+<DD>JSON-only field representing the result of each individual request.
+<DT><A HREF="./com/google/android/gcm/server/Constants.html#JSON_SUCCESS"><B>JSON_SUCCESS</B></A> -
+Static variable in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Constants.html" title="class in com.google.android.gcm.server">Constants</A>
+<DD>JSON-only field representing the number of successful messages.
+</DL>
+<HR>
+<A NAME="_L_"><!-- --></A><H2>
+<B>L</B></H2>
+<DL>
+<DT><A HREF="./com/google/android/gcm/server/Sender.html#logger"><B>logger</B></A> -
+Variable in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Sender.html" title="class in com.google.android.gcm.server">Sender</A>
+<DD>
+</DL>
+<HR>
+<A NAME="_M_"><!-- --></A><H2>
+<B>M</B></H2>
+<DL>
+<DT><A HREF="./com/google/android/gcm/server/Sender.html#MAX_BACKOFF_DELAY"><B>MAX_BACKOFF_DELAY</B></A> -
+Static variable in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Sender.html" title="class in com.google.android.gcm.server">Sender</A>
+<DD>Maximum delay before a retry.
+<DT><A HREF="./com/google/android/gcm/server/Message.html" title="class in com.google.android.gcm.server"><B>Message</B></A> - Class in <A HREF="./com/google/android/gcm/server/package-summary.html">com.google.android.gcm.server</A><DD>GCM message.<DT><A HREF="./com/google/android/gcm/server/Message.Builder.html" title="class in com.google.android.gcm.server"><B>Message.Builder</B></A> - Class in <A HREF="./com/google/android/gcm/server/package-summary.html">com.google.android.gcm.server</A><DD> <DT><A HREF="./com/google/android/gcm/server/Message.Builder.html#Message.Builder()"><B>Message.Builder()</B></A> -
+Constructor for class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Message.Builder.html" title="class in com.google.android.gcm.server">Message.Builder</A>
+<DD>
+<DT><A HREF="./com/google/android/gcm/server/MulticastResult.html" title="class in com.google.android.gcm.server"><B>MulticastResult</B></A> - Class in <A HREF="./com/google/android/gcm/server/package-summary.html">com.google.android.gcm.server</A><DD>Result of a GCM multicast message request .</DL>
+<HR>
+<A NAME="_N_"><!-- --></A><H2>
+<B>N</B></H2>
+<DL>
+<DT><A HREF="./com/google/android/gcm/server/Sender.html#newBody(java.lang.String, java.lang.String)"><B>newBody(String, String)</B></A> -
+Static method in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Sender.html" title="class in com.google.android.gcm.server">Sender</A>
+<DD>Creates a <CODE>StringBuilder</CODE> to be used as the body of an HTTP POST.
+<DT><A HREF="./com/google/android/gcm/server/Sender.html#newKeyValues(java.lang.String, java.lang.String)"><B>newKeyValues(String, String)</B></A> -
+Static method in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Sender.html" title="class in com.google.android.gcm.server">Sender</A>
+<DD>Creates a map with just one key-value pair.
+</DL>
+<HR>
+<A NAME="_P_"><!-- --></A><H2>
+<B>P</B></H2>
+<DL>
+<DT><A HREF="./com/google/android/gcm/server/Constants.html#PARAM_COLLAPSE_KEY"><B>PARAM_COLLAPSE_KEY</B></A> -
+Static variable in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Constants.html" title="class in com.google.android.gcm.server">Constants</A>
+<DD>HTTP parameter for collapse key.
+<DT><A HREF="./com/google/android/gcm/server/Constants.html#PARAM_DELAY_WHILE_IDLE"><B>PARAM_DELAY_WHILE_IDLE</B></A> -
+Static variable in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Constants.html" title="class in com.google.android.gcm.server">Constants</A>
+<DD>HTTP parameter for delaying the message delivery if the device is idle.
+<DT><A HREF="./com/google/android/gcm/server/Constants.html#PARAM_PAYLOAD_PREFIX"><B>PARAM_PAYLOAD_PREFIX</B></A> -
+Static variable in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Constants.html" title="class in com.google.android.gcm.server">Constants</A>
+<DD>Prefix to HTTP parameter used to pass key-values in the message payload.
+<DT><A HREF="./com/google/android/gcm/server/Constants.html#PARAM_REGISTRATION_ID"><B>PARAM_REGISTRATION_ID</B></A> -
+Static variable in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Constants.html" title="class in com.google.android.gcm.server">Constants</A>
+<DD>HTTP parameter for registration id.
+<DT><A HREF="./com/google/android/gcm/server/Constants.html#PARAM_TIME_TO_LIVE"><B>PARAM_TIME_TO_LIVE</B></A> -
+Static variable in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Constants.html" title="class in com.google.android.gcm.server">Constants</A>
+<DD>Prefix to HTTP parameter used to set the message time-to-live.
+<DT><A HREF="./com/google/android/gcm/server/Sender.html#post(java.lang.String, java.lang.String)"><B>post(String, String)</B></A> -
+Method in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Sender.html" title="class in com.google.android.gcm.server">Sender</A>
+<DD>Make an HTTP post to a given URL.
+<DT><A HREF="./com/google/android/gcm/server/Sender.html#post(java.lang.String, java.lang.String, java.lang.String)"><B>post(String, String, String)</B></A> -
+Method in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Sender.html" title="class in com.google.android.gcm.server">Sender</A>
+<DD>
+</DL>
+<HR>
+<A NAME="_R_"><!-- --></A><H2>
+<B>R</B></H2>
+<DL>
+<DT><A HREF="./com/google/android/gcm/server/Sender.html#random"><B>random</B></A> -
+Variable in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Sender.html" title="class in com.google.android.gcm.server">Sender</A>
+<DD>
+<DT><A HREF="./com/google/android/gcm/server/Result.html" title="class in com.google.android.gcm.server"><B>Result</B></A> - Class in <A HREF="./com/google/android/gcm/server/package-summary.html">com.google.android.gcm.server</A><DD>Result of a GCM message request that returned HTTP status code 200.</DL>
+<HR>
+<A NAME="_S_"><!-- --></A><H2>
+<B>S</B></H2>
+<DL>
+<DT><A HREF="./com/google/android/gcm/server/Sender.html#send(com.google.android.gcm.server.Message, java.lang.String, int)"><B>send(Message, String, int)</B></A> -
+Method in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Sender.html" title="class in com.google.android.gcm.server">Sender</A>
+<DD>Sends a message to one device, retrying in case of unavailability.
+<DT><A HREF="./com/google/android/gcm/server/Sender.html#send(com.google.android.gcm.server.Message, java.util.List, int)"><B>send(Message, List<String>, int)</B></A> -
+Method in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Sender.html" title="class in com.google.android.gcm.server">Sender</A>
+<DD>Sends a message to many devices, retrying in case of unavailability.
+<DT><A HREF="./com/google/android/gcm/server/Sender.html" title="class in com.google.android.gcm.server"><B>Sender</B></A> - Class in <A HREF="./com/google/android/gcm/server/package-summary.html">com.google.android.gcm.server</A><DD>Helper class to send messages to the GCM service using an API Key.<DT><A HREF="./com/google/android/gcm/server/Sender.html#Sender(java.lang.String)"><B>Sender(String)</B></A> -
+Constructor for class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Sender.html" title="class in com.google.android.gcm.server">Sender</A>
+<DD>Default constructor.
+<DT><A HREF="./com/google/android/gcm/server/Sender.html#sendNoRetry(com.google.android.gcm.server.Message, java.lang.String)"><B>sendNoRetry(Message, String)</B></A> -
+Method in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Sender.html" title="class in com.google.android.gcm.server">Sender</A>
+<DD>Sends a message without retrying in case of service unavailability.
+<DT><A HREF="./com/google/android/gcm/server/Sender.html#sendNoRetry(com.google.android.gcm.server.Message, java.util.List)"><B>sendNoRetry(Message, List<String>)</B></A> -
+Method in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Sender.html" title="class in com.google.android.gcm.server">Sender</A>
+<DD>Sends a message without retrying in case of service unavailability.
+</DL>
+<HR>
+<A NAME="_T_"><!-- --></A><H2>
+<B>T</B></H2>
+<DL>
+<DT><A HREF="./com/google/android/gcm/server/Message.Builder.html#timeToLive(int)"><B>timeToLive(int)</B></A> -
+Method in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Message.Builder.html" title="class in com.google.android.gcm.server">Message.Builder</A>
+<DD>Sets the time to live, in seconds.
+<DT><A HREF="./com/google/android/gcm/server/Constants.html#TOKEN_CANONICAL_REG_ID"><B>TOKEN_CANONICAL_REG_ID</B></A> -
+Static variable in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Constants.html" title="class in com.google.android.gcm.server">Constants</A>
+<DD>Token returned by GCM when the requested registration id has a canonical
+ value.
+<DT><A HREF="./com/google/android/gcm/server/Constants.html#TOKEN_ERROR"><B>TOKEN_ERROR</B></A> -
+Static variable in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Constants.html" title="class in com.google.android.gcm.server">Constants</A>
+<DD>Token returned by GCM when there was an error sending a message.
+<DT><A HREF="./com/google/android/gcm/server/Constants.html#TOKEN_MESSAGE_ID"><B>TOKEN_MESSAGE_ID</B></A> -
+Static variable in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Constants.html" title="class in com.google.android.gcm.server">Constants</A>
+<DD>Token returned by GCM when a message was successfully sent.
+<DT><A HREF="./com/google/android/gcm/server/Message.html#toString()"><B>toString()</B></A> -
+Method in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Message.html" title="class in com.google.android.gcm.server">Message</A>
+<DD>
+<DT><A HREF="./com/google/android/gcm/server/MulticastResult.html#toString()"><B>toString()</B></A> -
+Method in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/MulticastResult.html" title="class in com.google.android.gcm.server">MulticastResult</A>
+<DD>
+<DT><A HREF="./com/google/android/gcm/server/Result.html#toString()"><B>toString()</B></A> -
+Method in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Result.html" title="class in com.google.android.gcm.server">Result</A>
+<DD>
+</DL>
+<HR>
+<A NAME="_U_"><!-- --></A><H2>
+<B>U</B></H2>
+<DL>
+<DT><A HREF="./com/google/android/gcm/server/Sender.html#UTF8"><B>UTF8</B></A> -
+Static variable in class com.google.android.gcm.server.<A HREF="./com/google/android/gcm/server/Sender.html" title="class in com.google.android.gcm.server">Sender</A>
+<DD>
+</DL>
+<HR>
+<A HREF="#_A_">A</A> <A HREF="#_B_">B</A> <A HREF="#_C_">C</A> <A HREF="#_D_">D</A> <A HREF="#_E_">E</A> <A HREF="#_G_">G</A> <A HREF="#_I_">I</A> <A HREF="#_J_">J</A> <A HREF="#_L_">L</A> <A HREF="#_M_">M</A> <A HREF="#_N_">N</A> <A HREF="#_P_">P</A> <A HREF="#_R_">R</A> <A HREF="#_S_">S</A> <A HREF="#_T_">T</A> <A HREF="#_U_">U</A>
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="./com/google/android/gcm/server/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="./overview-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="./deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Index</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="./help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="./index.html?index-all.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="index-all.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="./allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="./allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+
+</BODY>
+</HTML>
diff --git a/docs/html/guide/google/gcm/server-javadoc/index.html b/docs/html/guide/google/gcm/server-javadoc/index.html
new file mode 100644
index 0000000..efcce9e
--- /dev/null
+++ b/docs/html/guide/google/gcm/server-javadoc/index.html
@@ -0,0 +1,36 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc on Thu Jun 21 12:04:57 PDT 2012-->
+<TITLE>
+Generated Documentation (Untitled)
+</TITLE>
+<SCRIPT type="text/javascript">
+ targetPage = "" + window.location.search;
+ if (targetPage != "" && targetPage != "undefined")
+ targetPage = targetPage.substring(1);
+ if (targetPage.indexOf(":") != -1)
+ targetPage = "undefined";
+ function loadFrames() {
+ if (targetPage != "" && targetPage != "undefined")
+ top.classFrame.location = top.targetPage;
+ }
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+</HEAD>
+<FRAMESET cols="20%,80%" title="" onLoad="top.loadFrames()">
+<FRAME src="allclasses-frame.html" name="packageFrame" title="All classes and interfaces (except non-static nested types)">
+<FRAME src="com/google/android/gcm/server/package-summary.html" name="classFrame" title="Package, class and interface descriptions" scrolling="yes">
+<NOFRAMES>
+<H2>
+Frame Alert</H2>
+
+<P>
+This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client.
+<BR>
+Link to<A HREF="com/google/android/gcm/server/package-summary.html">Non-frame version.</A>
+</NOFRAMES>
+</FRAMESET>
+</HTML>
diff --git a/docs/html/guide/google/gcm/server-javadoc/overview-tree.html b/docs/html/guide/google/gcm/server-javadoc/overview-tree.html
new file mode 100644
index 0000000..034838b
--- /dev/null
+++ b/docs/html/guide/google/gcm/server-javadoc/overview-tree.html
@@ -0,0 +1,158 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_20) on Thu Jun 21 12:04:57 PDT 2012 -->
+<TITLE>
+Class Hierarchy
+</TITLE>
+
+<META NAME="date" CONTENT="2012-06-21">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+ if (location.href.indexOf('is-external=true') == -1) {
+ parent.document.title="Class Hierarchy";
+ }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="com/google/android/gcm/server/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Tree</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html?overview-tree.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="overview-tree.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<CENTER>
+<H2>
+Hierarchy For All Packages</H2>
+</CENTER>
+<DL>
+<DT><B>Package Hierarchies:</B><DD><A HREF="com/google/android/gcm/server/package-tree.html">com.google.android.gcm.server</A></DL>
+<HR>
+<H2>
+Class Hierarchy
+</H2>
+<UL>
+<LI TYPE="circle">java.lang.Object<UL>
+<LI TYPE="circle">com.google.android.gcm.server.<A HREF="com/google/android/gcm/server/Constants.html" title="class in com.google.android.gcm.server"><B>Constants</B></A><LI TYPE="circle">com.google.android.gcm.server.<A HREF="com/google/android/gcm/server/Message.html" title="class in com.google.android.gcm.server"><B>Message</B></A> (implements java.io.Serializable)
+<LI TYPE="circle">com.google.android.gcm.server.<A HREF="com/google/android/gcm/server/Message.Builder.html" title="class in com.google.android.gcm.server"><B>Message.Builder</B></A><LI TYPE="circle">com.google.android.gcm.server.<A HREF="com/google/android/gcm/server/MulticastResult.html" title="class in com.google.android.gcm.server"><B>MulticastResult</B></A> (implements java.io.Serializable)
+<LI TYPE="circle">com.google.android.gcm.server.<A HREF="com/google/android/gcm/server/Result.html" title="class in com.google.android.gcm.server"><B>Result</B></A> (implements java.io.Serializable)
+<LI TYPE="circle">com.google.android.gcm.server.<A HREF="com/google/android/gcm/server/Sender.html" title="class in com.google.android.gcm.server"><B>Sender</B></A><LI TYPE="circle">java.lang.Throwable (implements java.io.Serializable)
+<UL>
+<LI TYPE="circle">java.lang.Exception<UL>
+<LI TYPE="circle">java.io.IOException<UL>
+<LI TYPE="circle">com.google.android.gcm.server.<A HREF="com/google/android/gcm/server/InvalidRequestException.html" title="class in com.google.android.gcm.server"><B>InvalidRequestException</B></A></UL>
+</UL>
+</UL>
+</UL>
+</UL>
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="com/google/android/gcm/server/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Tree</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html?overview-tree.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="overview-tree.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+
+</BODY>
+</HTML>
diff --git a/docs/html/guide/google/gcm/server-javadoc/package-list b/docs/html/guide/google/gcm/server-javadoc/package-list
new file mode 100644
index 0000000..5955cc0
--- /dev/null
+++ b/docs/html/guide/google/gcm/server-javadoc/package-list
@@ -0,0 +1 @@
+com.google.android.gcm.server
diff --git a/docs/html/guide/google/gcm/server-javadoc/resources/inherit.gif b/docs/html/guide/google/gcm/server-javadoc/resources/inherit.gif
new file mode 100644
index 0000000..c814867
--- /dev/null
+++ b/docs/html/guide/google/gcm/server-javadoc/resources/inherit.gif
Binary files differ
diff --git a/docs/html/guide/google/gcm/server-javadoc/serialized-form.html b/docs/html/guide/google/gcm/server-javadoc/serialized-form.html
new file mode 100644
index 0000000..86cd61a
--- /dev/null
+++ b/docs/html/guide/google/gcm/server-javadoc/serialized-form.html
@@ -0,0 +1,355 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_20) on Thu Jun 21 12:04:57 PDT 2012 -->
+<TITLE>
+Serialized Form
+</TITLE>
+
+<META NAME="date" CONTENT="2012-06-21">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+ if (location.href.indexOf('is-external=true') == -1) {
+ parent.document.title="Serialized Form";
+ }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="com/google/android/gcm/server/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html?serialized-form.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="serialized-form.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<CENTER>
+<H1>
+Serialized Form</H1>
+</CENTER>
+<HR SIZE="4" NOSHADE>
+
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="center"><FONT SIZE="+2">
+<B>Package</B> <B>com.google.android.gcm.server</B></FONT></TH>
+</TR>
+</TABLE>
+
+<P>
+<A NAME="com.google.android.gcm.server.InvalidRequestException"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Class <A HREF="com/google/android/gcm/server/InvalidRequestException.html" title="class in com.google.android.gcm.server">com.google.android.gcm.server.InvalidRequestException</A> extends java.io.IOException implements Serializable</B></FONT></TH>
+</TR>
+</TABLE>
+
+<P>
+<A NAME="serializedForm"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Serialized Fields</B></FONT></TH>
+</TR>
+</TABLE>
+
+<H3>
+status</H3>
+<PRE>
+int <B>status</B></PRE>
+<DL>
+<DL>
+</DL>
+</DL>
+<HR>
+<H3>
+description</H3>
+<PRE>
+java.lang.String <B>description</B></PRE>
+<DL>
+<DL>
+</DL>
+</DL>
+
+<P>
+<A NAME="com.google.android.gcm.server.Message"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Class <A HREF="com/google/android/gcm/server/Message.html" title="class in com.google.android.gcm.server">com.google.android.gcm.server.Message</A> extends java.lang.Object implements Serializable</B></FONT></TH>
+</TR>
+</TABLE>
+
+<P>
+<A NAME="serializedForm"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Serialized Fields</B></FONT></TH>
+</TR>
+</TABLE>
+
+<H3>
+collapseKey</H3>
+<PRE>
+java.lang.String <B>collapseKey</B></PRE>
+<DL>
+<DL>
+</DL>
+</DL>
+<HR>
+<H3>
+delayWhileIdle</H3>
+<PRE>
+java.lang.Boolean <B>delayWhileIdle</B></PRE>
+<DL>
+<DL>
+</DL>
+</DL>
+<HR>
+<H3>
+timeToLive</H3>
+<PRE>
+java.lang.Integer <B>timeToLive</B></PRE>
+<DL>
+<DL>
+</DL>
+</DL>
+<HR>
+<H3>
+data</H3>
+<PRE>
+java.util.Map<K,V> <B>data</B></PRE>
+<DL>
+<DL>
+</DL>
+</DL>
+
+<P>
+<A NAME="com.google.android.gcm.server.MulticastResult"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Class <A HREF="com/google/android/gcm/server/MulticastResult.html" title="class in com.google.android.gcm.server">com.google.android.gcm.server.MulticastResult</A> extends java.lang.Object implements Serializable</B></FONT></TH>
+</TR>
+</TABLE>
+
+<P>
+<A NAME="serializedForm"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Serialized Fields</B></FONT></TH>
+</TR>
+</TABLE>
+
+<H3>
+success</H3>
+<PRE>
+int <B>success</B></PRE>
+<DL>
+<DL>
+</DL>
+</DL>
+<HR>
+<H3>
+failure</H3>
+<PRE>
+int <B>failure</B></PRE>
+<DL>
+<DL>
+</DL>
+</DL>
+<HR>
+<H3>
+canonicalIds</H3>
+<PRE>
+int <B>canonicalIds</B></PRE>
+<DL>
+<DL>
+</DL>
+</DL>
+<HR>
+<H3>
+multicastId</H3>
+<PRE>
+long <B>multicastId</B></PRE>
+<DL>
+<DL>
+</DL>
+</DL>
+<HR>
+<H3>
+results</H3>
+<PRE>
+java.util.List<E> <B>results</B></PRE>
+<DL>
+<DL>
+</DL>
+</DL>
+<HR>
+<H3>
+retryMulticastIds</H3>
+<PRE>
+java.util.List<E> <B>retryMulticastIds</B></PRE>
+<DL>
+<DL>
+</DL>
+</DL>
+
+<P>
+<A NAME="com.google.android.gcm.server.Result"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Class <A HREF="com/google/android/gcm/server/Result.html" title="class in com.google.android.gcm.server">com.google.android.gcm.server.Result</A> extends java.lang.Object implements Serializable</B></FONT></TH>
+</TR>
+</TABLE>
+
+<P>
+<A NAME="serializedForm"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Serialized Fields</B></FONT></TH>
+</TR>
+</TABLE>
+
+<H3>
+messageId</H3>
+<PRE>
+java.lang.String <B>messageId</B></PRE>
+<DL>
+<DL>
+</DL>
+</DL>
+<HR>
+<H3>
+canonicalRegistrationId</H3>
+<PRE>
+java.lang.String <B>canonicalRegistrationId</B></PRE>
+<DL>
+<DL>
+</DL>
+</DL>
+<HR>
+<H3>
+errorCode</H3>
+<PRE>
+java.lang.String <B>errorCode</B></PRE>
+<DL>
+<DL>
+</DL>
+</DL>
+
+<P>
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="com/google/android/gcm/server/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html?serialized-form.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="serialized-form.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+
+</BODY>
+</HTML>
diff --git a/docs/html/guide/google/gcm/server-javadoc/stylesheet.css b/docs/html/guide/google/gcm/server-javadoc/stylesheet.css
new file mode 100644
index 0000000..6ea9e51
--- /dev/null
+++ b/docs/html/guide/google/gcm/server-javadoc/stylesheet.css
@@ -0,0 +1,29 @@
+/* Javadoc style sheet */
+
+/* Define colors, fonts and other style attributes here to override the defaults */
+
+/* Page background color */
+body { background-color: #FFFFFF; color:#000000 }
+
+/* Headings */
+h1 { font-size: 145% }
+
+/* Table colors */
+.TableHeadingColor { background: #CCCCFF; color:#000000 } /* Dark mauve */
+.TableSubHeadingColor { background: #EEEEFF; color:#000000 } /* Light mauve */
+.TableRowColor { background: #FFFFFF; color:#000000 } /* White */
+
+/* Font used in left-hand frame lists */
+.FrameTitleFont { font-size: 100%; font-family: Helvetica, Arial, sans-serif; color:#000000 }
+.FrameHeadingFont { font-size: 90%; font-family: Helvetica, Arial, sans-serif; color:#000000 }
+.FrameItemFont { font-size: 90%; font-family: Helvetica, Arial, sans-serif; color:#000000 }
+
+/* Navigation bar fonts and colors */
+.NavBarCell1 { background-color:#EEEEFF; color:#000000} /* Light mauve */
+.NavBarCell1Rev { background-color:#00008B; color:#FFFFFF} /* Dark Blue */
+.NavBarFont1 { font-family: Arial, Helvetica, sans-serif; color:#000000;color:#000000;}
+.NavBarFont1Rev { font-family: Arial, Helvetica, sans-serif; color:#FFFFFF;color:#FFFFFF;}
+
+.NavBarCell2 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF; color:#000000}
+.NavBarCell3 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF; color:#000000}
+
diff --git a/docs/html/guide/google/index.jd b/docs/html/guide/google/index.jd
index 95c2816..2eb8344 100644
--- a/docs/html/guide/google/index.jd
+++ b/docs/html/guide/google/index.jd
@@ -2,96 +2,133 @@
footer.hide=1
@jd:body
-
- <p>Google offers a variety of services that help you build new revenue streams, enhance your app's capabilities, manage distribution and payloads, and track usage and installs. Many of the services use static libraries that you download through the Android SDK Manager and build into your app. Others are configurable directly from Google Play Android Developer Console.</p>
-
- <p>The sections below highlight some of the Google Services and link you to more information about how to use them in your Android app. </p>
-
-
-<h2 id="monetization">Monetize Your App</h2>
-
-<div class="vspace size-1"> </div>
+<p>
+ Google offers a variety of services that help you build new revenue streams, enhance your app's
+ capabilities, manage distribution and payloads, and track usage and installs.
+ The sections below highlight some of the services offered by Google and link you to more information about
+ how to use them in your Android app.
+</p>
+<h2 id="monetization">
+ Monetize your app
+</h2>
+<p>
+ There are many ways to monetize your Android app, such as with ad impressions or In-App billing. If you
+ choose to charge a price to download your app, Android also provides the ability to check
+ for valid application licenses to protect your revenue. Because different apps require
+ different strategies, you can pick which ones are best for your app.
+</p>
+<div class="vspace size-1">
+
+</div>
<div class="layout-content-row">
-
<div class="layout-content-col span-4">
- <h4>In-App Billing</h4>
- <p>Keep your users engaged by offering in-app purchases and subscriptions directly in your app.
- </p>
- <a href="{@docRoot}guide/google/play/billing/index.html">Learn more »</a>
+ <h4>
+ Google AdMob Ads
+ </h4>
+ <p>
+ Generate revenue by displaying ads in your app with multiple ad networks.
+ </p><a href="http://www.google.com/ads/admob/index.html">Learn more »</a>
</div>
-
<div class="layout-content-col span-4">
- <h4>Google AdMob Ads</h4>
- <p>Generate more revenue from your app by
- displaying ads from multiple ad networks.</p>
- <a href="https://developers.google.com/mobile-ads-sdk/docs/android/fundamentals">Learn more »</a>
+ <h4>
+ In-App Billing
+ </h4>
+ <p>
+ Engage users by offering features such as new content or virtual goods directly in your app.
+ </p><a href="{@docRoot}guide/google/play/billing/index.html">Learn more »</a>
</div>
-
<div class="layout-content-col span-4">
- <h4>Application Licensing</h4>
- <p>Protect your revenue streams and integrate policies for usage into your app.</p>
- <a href="{@docRoot}guide/google/play/licensing/index.html">Learn more »</a>
+ <h4>
+ Application Licensing
+ </h4>
+ <p>Protect your revenue streams and integrate policies for usage into your a
+pp.
+ </p><a href="{@docRoot}guide/google/play/licensing/index.html">Learn more »</a>
</div>
-
</div>
-
-<h2 id="integration">Manage App Distribution</h2>
-
-<div class="vspace size-1"> </div>
-
+<h2 id="integration">
+ Enhance Your App's Capabilities
+</h2>
+<p>
+ Android and Google technologies work together to provide your users with compelling interactions
+ with technologies such as Maps and Google+.
+</p>
+<div class="vspace size-1">
+
+</div>
<div class="layout-content-row">
-
-<div class="layout-content-col span-4">
-
-<h4>Google Play Filters</h4>
-<p>Make sure your app gets to the right users by
-declaring the hardware and software features needed by your app.</p>
-<a href="{@docRoot}guide/google/play/filters.html">Learn more »</a>
-</div>
-
<div class="layout-content-col span-4">
-<h4>Multiple APK Support</h4>
-<p>Distribute different APKs based on a variety of properties such as platform version, screen size, and GLES texture compression support.</p>
-<a href="{@docRoot}guide/google/play/publishing/multiple-apks.html">Learn more »</a>
-</div>
-
+ <h4>
+ Google Play Services
+ </h4><img src="{@docRoot}images/play_dev.png">
+ <p>
+ Leverage Google products in your app with an easy to use authentication flow for your users.
+ </p><a href="{@docRoot}guide/google/play/services.html">Learn more »</a>
+ </div>
<div class="layout-content-col span-4">
-
-<h4>APK Expansion files</h4>
-<p>Take load off of your servers and utilize APK expansion files
-to deliver up to 4 GB of assets for your Android app, free.</p>
-
-<a href="{@docRoot}guide/google/play/expansion-files.html">Learn more »</a>
+ <h4>
+ Google Cloud Messaging
+ </h4><img src="{@docRoot}images/gcm-logo.png" width="150px" style="padding:9px;">
+ <p>
+ Notify your apps of important events with messages that are lightweight and battery-saving.
+ </p><a href="{@docRoot}guide/google/gcm/index.html">Learn more »</a>
+ </div>
+ <div class="layout-content-col span-4">
+ <h4>
+ Google Maps
+ </h4><img src="{@docRoot}images/google-apis.png">
+ <p>
+ The Google Maps library for Android brings powerful mapping capabilities to your app.
+ </p><a href="https://developers.google.com/android/add-ons/google-apis/index">Learn more
+ »</a>
+ </div>
</div>
-
+<h2 id="integration">
+ Manage App Distribution
+</h2>
+<p>
+ Google Play allows you to manage your app distribution with features that let you control which users
+ can download your app as well as deliver separate versions of your app based on certain
+ characteristics like platform version.
+</p>
+<div class="vspace size-1">
+
</div>
-
-<h2 id="integration">Enhance Your App's Capabilities</h2>
-
-<div class="vspace size-1"> </div>
-
<div class="layout-content-row">
-
-<div class="layout-content-col span-4">
- <h4>Android Cloud-to-Device Messaging </h4>
- <p>Notify your apps of events with push messages that are lightweight
- and battery-saving.</p>
- <a href="https://developers.google.com/android/c2dm/">Learn more »</a>
+ <div class="layout-content-col span-4">
+ <h4>
+ Filters on Google Play
+ </h4>
+ <p>
+ Make sure your app gets to the right users by filtering on a wide range of characteristics
+ such as platform versions and hardware features.
+ </p><a href="{@docRoot}guide/google/play/filters.html">Learn more »</a>
+ </div>
+ <div class="layout-content-col span-4">
+ <h4>
+ Multiple APK Support
+ </h4>
+ <p>
+ Distribute different APKs based on a variety of properties such as platform version, screen
+ size, and GLES texture compression support.
+ </p><a href="{@docRoot}guide/google/play/publishing/multiple-apks.html">Learn more »</a>
+ </div>
+ <div class="layout-content-col span-4">
+ <h4>
+ APK Expansion files
+ </h4>
+ <p>
+ Tap into Google's content delivery services by serving up to 4GB of assets for free. Provide
+ users with high-fidelity graphics, media files, or other large assets that are required by
+ your app.
+ </p><a href="{@docRoot}guide/google/play/expansion-files.html">Learn more »</a>
+ </div>
</div>
-
-<div class="layout-content-col span-4">
- <h4>Google Maps</h4>
- <p> The Google Maps library for Android lets you add powerful mapping and geo-location capabilities to your app.</p>
- <a href="https://developers.google.com/maps/documentation/android/">Learn more »</a>
-</div>
-</div>
-
-
-<h2 id="integration">Track Performance with Analytics</h2>
-<p>Google Analytics gives you powerful insights into how users find your apps
- and how they use them. <br />Start integrating analytics to measure
- your app's success.</p>
-
-
-<div style="margin-bottom:1.5em;"><a href="https://developers.google.com/analytics/devguides/collection/android/">Learn more »</a></div>
-
\ No newline at end of file
+<h2 id="integration">
+ Track Performance with Analytics
+</h2>
+<p>
+ Google Analytics let you find out how users find your apps and how they use them. Start
+ integrating analytics to measure your app's success.
+</p><a href="https://developers.google.com/analytics/devguides/collection/android/">Learn more
+»</a>
diff --git a/docs/html/guide/google/play/index.jd b/docs/html/guide/google/play/index.jd
deleted file mode 100644
index b11bcdc..0000000
--- a/docs/html/guide/google/play/index.jd
+++ /dev/null
@@ -1,16 +0,0 @@
-page.title=Google Play APIs
-page.landing=1
-page.landing.intro=When you ditribute your Android app using Google Play you have the opportunity to enhance your app's capabilities with services such as in-app billing and control your app distribution with advanced device filtering.
-@jd:body
-
-
-<div class="distribute-features col-13">
- <ul>
- <li><h5>Monetize with in-app billing</h5>Lorem ipsum dolor sit amet, soldum
-consectetur adipiscing elit. <a href="#">Learn more »</a></li>
- <li><h5>Control your app distribution</h5>Lorem ipsum dolor sit amet, soldum consectetur
-adipiscing elit. <a href="#">Learn more »</a></li>
- <li class="last"><h5>Protect from piracy</h5>Lorem ipsum dolor sit amet, soldum
-consectetur adipiscing elit. <a href="#">Learn more »</a></li>
- </ul>
-</div>
\ No newline at end of file
diff --git a/docs/html/guide/google/play/services.jd b/docs/html/guide/google/play/services.jd
new file mode 100644
index 0000000..e88d31f
--- /dev/null
+++ b/docs/html/guide/google/play/services.jd
@@ -0,0 +1,25 @@
+page.title=Google Play Services
+
+@jd:body
+
+<p>Google Play services is a platform that is delivered through the Google Play Store that
+ offers integration with Google products, such as Google+, into Android apps.
+ The Google Play services framework consists of a services component
+ that runs on the device and a thin client library that you package with your app. </p>
+
+
+<div class="distribute-features col-13">
+ <ul>
+ <li style="border-top: 1px solid #F80;"><h5>Easy Authentication</h5> Your app can leverage the user's
+ existing Google account on the device without having to go through
+ tedious authentication flows. A few clicks from the user and you're set!
+ <br /> <a href="https://developers.google.com/android/google-play-services">Learn more »</a>
+ </li>
+ <li style="border-top: 1px solid #F80;"><h5>Google+ Integration</h5>Google Play Services lets you
+ read from and write to your user's Google+ activity stream, giving your
+ app an easy way to integrate with Google+.
+ <br /> <a href="https://developers.google.com/android/google-play-services">Learn more »</a>
+ </li>
+ </ul>
+
+</div>
\ No newline at end of file
diff --git a/docs/html/guide/guide_toc.cs b/docs/html/guide/guide_toc.cs
index 8e3fea6..94b9773 100644
--- a/docs/html/guide/guide_toc.cs
+++ b/docs/html/guide/guide_toc.cs
@@ -410,7 +410,6 @@
<ul>
<li><a href="<?cs var:toroot ?>guide/topics/connectivity/usb/accessory.html">Accessory</a></li>
<li><a href="<?cs var:toroot ?>guide/topics/connectivity/usb/host.html">Host</a></li>
- <li><a href="<?cs var:toroot ?>guide/topics/connectivity/usb/adk.html">Open Accessory Dev Kit</a></li>
</ul>
</li>
<li><a href="<?cs var:toroot?>guide/topics/connectivity/sip.html">
@@ -589,6 +588,7 @@
</li>
</ul>
</li>
+
<li class="nav-section">
<div class="nav-section-header"><a href="<?cs var:toroot ?>guide/google/play/licensing/index.html">
<span class="en">Application Licensing</span></a>
@@ -607,8 +607,11 @@
<span class="en">Licensing Reference</span></a>
</li>
</ul>
- </li>
- <li><a href="<?cs var:toroot ?>guide/google/play/filters.html">
+ </li>
+ <li><a href="<?cs var:toroot ?>guide/google/play/services.html">
+ <span class="en">Google Play Services</span></a>
+ </li>
+ <li><a href="<?cs var:toroot ?>guide/google/play/filters.html">
<span class="en">Filters on Google Play</span></a>
</li>
<li><a href="<?cs var:toroot ?>guide/google/play/publishing/multiple-apks.html">
@@ -617,6 +620,29 @@
<li><a href="<?cs var:toroot ?>guide/google/play/expansion-files.html">
<span class="en">APK Expansion Files</span></a>
</li>
+
+ <li class="nav-section">
+ <div class="nav-section-header"><a href="<?cs var:toroot ?>guide/google/gcm/index.html">
+ <span class="en">Google Cloud Messaging</span></a>
+ </div>
+ <ul>
+ <li><a href="<?cs var:toroot?>guide/google/gcm/gs.html">
+ <span class="en">Getting Started</span></a>
+ </li>
+ <li><a href="<?cs var:toroot?>guide/google/gcm/gcm.html">
+ <span class="en">Architectural Overview</span></a>
+ </li>
+ <li><a href="<?cs var:toroot?>guide/google/gcm/demo.html">
+ <span class="en">Demo App Tutorial</span></a>
+ </li>
+ <li><a href="<?cs var:toroot?>guide/google/gcm/adv.html">
+ <span class="en">Advanced Topics</span></a>
+ </li>
+ <li><a href="<?cs var:toroot?>guide/google/gcm/c2dm.html">
+ <span class="en">Migration</span></a>
+ </li>
+ </ul>
+ </li>
</ul>
</li><!-- end Google Play -->
diff --git a/docs/html/images/c2dm.png b/docs/html/images/c2dm.png
new file mode 100644
index 0000000..decdd1e
--- /dev/null
+++ b/docs/html/images/c2dm.png
Binary files differ
diff --git a/docs/html/images/gcm/gcm-api-access.png b/docs/html/images/gcm/gcm-api-access.png
new file mode 100644
index 0000000..5dfa434
--- /dev/null
+++ b/docs/html/images/gcm/gcm-api-access.png
Binary files differ
diff --git a/docs/html/images/gcm/gcm-api-key.png b/docs/html/images/gcm/gcm-api-key.png
new file mode 100644
index 0000000..92834bf
--- /dev/null
+++ b/docs/html/images/gcm/gcm-api-key.png
Binary files differ
diff --git a/docs/html/images/gcm/gcm-avd-first-msg.png b/docs/html/images/gcm/gcm-avd-first-msg.png
new file mode 100644
index 0000000..86296b5
--- /dev/null
+++ b/docs/html/images/gcm/gcm-avd-first-msg.png
Binary files differ
diff --git a/docs/html/images/gcm/gcm-avd-home-auto-reg.png b/docs/html/images/gcm/gcm-avd-home-auto-reg.png
new file mode 100644
index 0000000..986fc63
--- /dev/null
+++ b/docs/html/images/gcm/gcm-avd-home-auto-reg.png
Binary files differ
diff --git a/docs/html/images/gcm/gcm-config-server-key.png b/docs/html/images/gcm/gcm-config-server-key.png
new file mode 100644
index 0000000..90dd65d
--- /dev/null
+++ b/docs/html/images/gcm/gcm-config-server-key.png
Binary files differ
diff --git a/docs/html/images/gcm/gcm-create-api-proj.png b/docs/html/images/gcm/gcm-create-api-proj.png
new file mode 100644
index 0000000..6ef5cd2
--- /dev/null
+++ b/docs/html/images/gcm/gcm-create-api-proj.png
Binary files differ
diff --git a/docs/html/images/gcm/gcm-demo-homepage-appengine.png b/docs/html/images/gcm/gcm-demo-homepage-appengine.png
new file mode 100644
index 0000000..799d6d5
--- /dev/null
+++ b/docs/html/images/gcm/gcm-demo-homepage-appengine.png
Binary files differ
diff --git a/docs/html/images/gcm/gcm-demo-homepage.png b/docs/html/images/gcm/gcm-demo-homepage.png
new file mode 100644
index 0000000..5f97487
--- /dev/null
+++ b/docs/html/images/gcm/gcm-demo-homepage.png
Binary files differ
diff --git a/docs/html/images/gcm/gcm-device-reg.png b/docs/html/images/gcm/gcm-device-reg.png
new file mode 100644
index 0000000..643f120
--- /dev/null
+++ b/docs/html/images/gcm/gcm-device-reg.png
Binary files differ
diff --git a/docs/html/images/gcm/gcm-logo.png b/docs/html/images/gcm/gcm-logo.png
new file mode 100644
index 0000000..14b92ad
--- /dev/null
+++ b/docs/html/images/gcm/gcm-logo.png
Binary files differ
diff --git a/docs/html/images/gcm/gcm-sent-server.png b/docs/html/images/gcm/gcm-sent-server.png
new file mode 100644
index 0000000..6d19b0b
--- /dev/null
+++ b/docs/html/images/gcm/gcm-sent-server.png
Binary files differ
diff --git a/docs/html/images/gltracer/dialog-trace.png b/docs/html/images/gltracer/dialog-trace.png
new file mode 100644
index 0000000..8667623
--- /dev/null
+++ b/docs/html/images/gltracer/dialog-trace.png
Binary files differ
diff --git a/docs/html/images/gltracer/icon-capture.png b/docs/html/images/gltracer/icon-capture.png
new file mode 100644
index 0000000..9cbdb3b
--- /dev/null
+++ b/docs/html/images/gltracer/icon-capture.png
Binary files differ
diff --git a/docs/html/images/gltracer/icon-load-trace.png b/docs/html/images/gltracer/icon-load-trace.png
new file mode 100644
index 0000000..f3957b8
--- /dev/null
+++ b/docs/html/images/gltracer/icon-load-trace.png
Binary files differ
diff --git a/docs/html/images/google-apis.png b/docs/html/images/google-apis.png
new file mode 100644
index 0000000..2c5318b
--- /dev/null
+++ b/docs/html/images/google-apis.png
Binary files differ
diff --git a/docs/html/images/play_dev.png b/docs/html/images/play_dev.png
new file mode 100644
index 0000000..8d44f11
--- /dev/null
+++ b/docs/html/images/play_dev.png
Binary files differ
diff --git a/docs/html/sdk/index.jd b/docs/html/sdk/index.jd
index e788ffe..a20d0b1 100644
--- a/docs/html/sdk/index.jd
+++ b/docs/html/sdk/index.jd
@@ -2,21 +2,21 @@
header.hide=1
page.metaDescription=Download the official Android SDK to develop apps for Android-powered devices.
-sdk.win_installer=installer_r18-windows.exe
-sdk.win_installer_bytes=37456234
-sdk.win_installer_checksum=48b1fe7b431afe6b9c8a992bf75dd898
+sdk.win_installer=installer_r20-windows.exe
+sdk.win_installer_bytes=70497095
+sdk.win_installer_checksum=0f25321554e2f88b247320d6a3bc1a7a
-sdk.win_download=android-sdk_r18-windows.zip
-sdk.win_bytes=37448775
-sdk.win_checksum=bfbfdf8b2d0fdecc2a621544d706fa98
+sdk.win_download=android-sdk_r20-windows.zip
+sdk.win_bytes=90353014
+sdk.win_checksum=b62b0f80f559c0ac670e9f058a21f0df
-sdk.mac_download=android-sdk_r18-macosx.zip
-sdk.mac_bytes=33903758
-sdk.mac_checksum=8328e8a5531c9d6f6f1a0261cb97af36
+sdk.mac_download=android-sdk_r20-macosx.zip
+sdk.mac_bytes=58203018
+sdk.mac_checksum=b6b6035ccec55ec2aa057438eb1db1f4
-sdk.linux_download=android-sdk_r18-linux.tgz
-sdk.linux_bytes=29731463
-sdk.linux_checksum=6cd716d0e04624b865ffed3c25b3485c
+sdk.linux_download=android-sdk_r20-linux.tgz
+sdk.linux_bytes=82589455
+sdk.linux_checksum=22a81cf1d4a951c62f71a8758290e9bb
@jd:body
diff --git a/docs/html/sdk/installing/installing-adt.jd b/docs/html/sdk/installing/installing-adt.jd
index 2925272..0e53e75 100644
--- a/docs/html/sdk/installing/installing-adt.jd
+++ b/docs/html/sdk/installing/installing-adt.jd
@@ -1,9 +1,9 @@
page.title=Installing the Eclipse Plugin
walkthru=1
-adt.zip.version=18.0.0
-adt.zip.download=ADT-18.0.0.zip
-adt.zip.bytes=12834793
-adt.zip.checksum=b446fa157ed97af79d1e21629201efbb
+adt.zip.version=20.0.0
+adt.zip.download=ADT-20.0.0.zip
+adt.zip.bytes=12387628
+adt.zip.checksum=ea0fc934af3b6b89097f0146c7822ed0
@jd:body
diff --git a/docs/html/guide/topics/connectivity/usb/adk.jd b/docs/html/tools/adk/adk.jd
similarity index 72%
rename from docs/html/guide/topics/connectivity/usb/adk.jd
rename to docs/html/tools/adk/adk.jd
index 034728c..2a0c717 100644
--- a/docs/html/guide/topics/connectivity/usb/adk.jd
+++ b/docs/html/tools/adk/adk.jd
@@ -1,4 +1,4 @@
-page.title=Android Open Accessory Development Kit
+page.title=Accessory Development Kit 2011 Guide
@jd:body
<div id="qv-wrapper">
@@ -24,21 +24,6 @@
</li>
<li>
- <a href="#accessory-protocol">Implementing the Android Accessory Protocol</a>
-
- <ol>
- <li><a href="#wait">Wait for and detect connected devices</a></li>
-
- <li><a href="#determine">Determine the connected device's accessory mode
- support</a></li>
-
- <li><a href="#start">Attempt to start the device in accessory mode</a></li>
-
- <li><a href="#establish">Establish communication with the device</a></li>
- </ol>
- </li>
-
- <li>
<a href="#firmware">How the ADK board implements the Android Accessory Protocol</a>
<ol>
@@ -66,72 +51,26 @@
<li><a href="{@docRoot}guide/topics/connectivity/usb/accessory.html">USB Accessory Dev Guide</a></li>
</ol>
- <h2>Where to buy</h2>
-
- <ol>
-
- <li><a href="http://store.arduino.cc/">
- Arduino Store</a></li>
-
- <li><a href="https://store.diydrones.com/ProductDetails.asp?ProductCode=BR-PhoneDrone">
- DIY Drones</a></li>
-
- <li><a href=
- "http://mbed.org/order/">
- mbed</a></li>
-
- <li><a href=
- "http://www.microchip.com/android">
- Microchip</a></li>
-
- <li><a href="http://shop.moderndevice.com/products/freeduino-usb-host-board">
- Modern Device</a></li>
-
- <li><a href=
- "http://www.rt-net.jp/shop/index.php?main_page=product_info&cPath=3_4&products_id=1">
- RT Corp</a></li>
-
- <li><a href="http://www.seeedstudio.com/depot/seeeduino-adk-main-board-p-846.html">
- Seeed Studio</a></li>
-
- <li><a href="http://www.sparkfun.com/products/10748">
- SparkFun</a></li>
-
- <li><a href="http://troido.de/de/shoplsmallgbuy-android-stufflsmallg">
- Troido</a></li>
-
- </ol>
</div>
</div>
- <p>The Android 3.1 platform (also backported to Android 2.3.4) introduces Android Open Accessory
- support, which allows external USB hardware (an Android USB accessory) to interact with an
- Android-powered device in a special "accessory" mode. When an Android-powered powered device is
- in accessory mode, the connected accessory acts as the USB host (powers the bus and enumerates
- devices) and the Android-powered device acts as the USB device. Android USB accessories are
- specifically designed to attach to Android-powered devices and adhere to a simple protocol
- (Android accessory protocol) that allows them to detect Android-powered devices that support
- accessory mode. Accessories must also provide 500mA at 5V for charging power. Many previously
- released Android-powered devices are only capable of acting as a USB device and cannot initiate
- connections with external USB devices. Android Open Accessory support overcomes this limitation
- and allows you to build accessories that can interact with an assortment of Android-powered
- devices by allowing the accessory to initiate the connection.</p>
+ <p>The Android Open Accessory Development Kit (ADK) is a reference implementation of an Android
+ Open Accessory, based on the <a href="http://www.arduino.cc/">Arduino open source electronics
+ prototyping platform</a>. The accessory's hardware design files, code that implements the
+ accessory's firmware, and the Android application that interacts with the accessory are provided
+ as part of the kit to help hardware builders and software developers get started building their
+ own accessories. The hardware design files and firmware code are contained in the <a href=
+ "https://dl-ssl.google.com/android/adk/adk_release_20120606.zip">ADK package download</a>.</p>
- <p class="note"><strong>Note:</strong> Accessory mode is ultimately dependent on the device's
- hardware and not all devices will support accessory mode. Devices that support accessory mode can
- be filtered using a <code><uses-feature></code> element in your corresponding application's
- Android manifest. For more information, see the <a href=
- "{@docRoot}guide/topics/connectivity/usb/accessory.html#manifest">USB Accessory</a> Developer Guide.</p>
-
- <p>The following list of distributers are currently producing Android Open Accessory compatible
- development boards:</p>
+ <p>A limited number of kits were produced and distributed at the Google I/O 2011 developer
+ conference. However, many hardware builders have reproduced and enhanced the original design and
+ these boards are available for purchase. The following list of distributors are currently
+ producing Android Open Accessory compatible development boards:</p>
<ul>
-
- <li>The <a href="http://store.arduino.cc/">Arduino Store</a> provides the Arduino Mega ADK
- (in <a href="http://store.arduino.cc/eu/index.php?main_page=product_info&cPath=11_12&products_id=144">EU nations</a>
- or <a href="http://store.arduino.cc/ww/index.php?main_page=product_info&cPath=11_12&products_id=144">non-EU nations</a>)
- that is based on the ATmega2560 and supports the ADK firmware.</li>
+ <li>The <a href="http://store.arduino.cc/">Arduino Store</a> provides the <a
+href="http://arduino.cc/en/Main/ArduinoBoardADK">Arduino Mega ADK</a> (for EU nations or non-
+ EU nations) that is based on the ATmega2560 and supports the ADK firmware.</li>
<li><a href="https://store.diydrones.com/ProductDetails.asp?ProductCode=BR-PhoneDrone">DIY
Drones</a> provides an Arduino-compatible board geared towards RC (radio controlled) and UAV
@@ -157,18 +96,16 @@
<li><a href="http://www.sparkfun.com/products/10748">
SparkFun</a>'s IOIO board now has beta support for the ADK firmware.</li>
+ <li><a href="http://troido.de/de/shoplsmallgbuy-android-stufflsmallg">Troido</a> has produced an
+ Arduino-compatible version of the ADK hardware.</li>
+
</ul>
<p>We expect more hardware distributers to create a variety of kits, so please stay tuned for
further developments.</p>
<h2 id="components">ADK Components</h2>
- <p>The Android Open Accessory Development Kit (ADK) provides an implementation of an Android USB
- accessory that is based on the <a href="http://www.arduino.cc/">Arduino open source electronics
- prototyping platform</a>, the accessory's hardware design files, code that implements the
- accessory's firmware, and the Android application that interacts with the accessory. The hardware
- design files and firmware code are contained in the <a href=
- "https://dl-ssl.google.com/android/adk/adk_release_20120606.zip">ADK package download</a>.</p>
+
<p>The main hardware and software components of the ADK include:</p>
<ul>
@@ -421,145 +358,6 @@
accessories communicate with Android-powered devices describe much of what you should be doing in
your own accessory.</p>
- <h2 id="accessory-protocol">Implementing the Android Accessory Protocol</h2>
-
- <p>An Android USB accessory must adhere to Android Accessory Protocol, which defines how
- an accessory detects and sets up communication with an Android-powered device. In general, an
- accessory should carry out the following steps:</p>
-
- <ol>
- <li>Wait for and detect connected devices</li>
-
- <li>Determine the device's accessory mode support</li>
-
- <li>Attempt to start the device in accessory mode if needed</li>
-
- <li>Establish communication with the device if it supports the Android accessory protocol</li>
- </ol>
-
- <p>The following sections go into depth about how to implement these steps.</p>
-
- <h3 id="wait">Wait for and detect connected devices</h3>
-
- <p>Your accessory should have logic to continuously check
- for connected Android-powered devices. When a device is connected, your accessory should
- determine if the device supports accessory mode.</p>
-
- <h3 id="determine">Determine the device's accessory mode support</h3>
-
-
- <p>When an Android-powered device is connected, it can be in one of three states:</p>
-
- <ol type="a">
- <li>The attached device supports Android accessory mode and is already in accessory mode.</li>
-
- <li>The attached device supports Android accessory mode, but it is not in accessory mode.</li>
-
- <li>The attached device does not support Android accessory mode.</li>
- </ol>
-
- <p>During the initial connection, the accessory should check the vendor and product IDs of the
- connected device's USB device descriptor. The vendor ID should match Google's ID (0x18D1) and the
- product ID should be 0x2D00 or 0x2D01 if the device is already in accessory mode (case A). If so,
- the accessory can now <a href="#establish">establish communication with the device</a> through
- bulk transfer endpoints with its own communication protocol. There is no need to start the device
- in accessory mode.</p>
-
- <p class="note"><strong>Note:</strong> 0x2D00 is reserved for Android-powered devices that
- support accessory mode. 0x2D01 is reserved for devices that support accessory mode as well as the
- ADB (Android Debug Bridge) protocol, which exposes a second interface with two bulk endpoints for
- ADB. You can use these endpoints for debugging the accessory application if you are simulating
- the accessory on a computer. In general, do not use this interface unless your accessory is
- implementing a passthrough to ADB on the device.</p>
-
- <p>If the vendor and product ID do not match, there is no way to distinguish between states b and
- c, so the accessory <a href="#start">attempts to start the device in accessory mode</a> to figure
- out if the device is supported.</p>
-
- <h3 id="start">Attempt to start the device in accessory mode</h3>
-
- <p>If the vendor and product IDs do not correspond to an Android-powered device in accessory
- mode, the accessory cannot discern whether the device supports accessory mode and is not in that
- state, or if the device does not support accessory mode at all. This is because devices that
- support accessory mode but aren't in it initially report the device's manufacturer vendor ID and
- product ID, and not the special Android Open Accessory ones. In either case, the accessory should try to start
- the device into accessory mode to figure out if the device supports it. The following steps
- explain how to do this:</p>
-
- <ol>
- <li>Send a 51 control request ("Get Protocol") to figure out if the device supports the Android
- accessory protocol. A non-zero number is returned if the protocol is supported, which
- represents the version of the protocol that the device supports (currently, only version 1
- exists). This request is a control request on endpoint 0 with the following characteristics:
- <pre>
-requestType: USB_DIR_IN | USB_TYPE_VENDOR
-request: 51
-value: 0
-index: 0
-data: protocol version number (16 bits little endian sent from the device to the accessory)
-</pre>
- </li>
-
- <li>If the device returns a proper protocol version, send identifying string information to the
- device. This information allows the device to figure out an appropriate application for this
- accessory and also present the user with a URL if an appropriate application does not exist.
- These requests are control requests on endpoint 0 (for each string ID) with the following
- characteristics:
- <pre>
-requestType: USB_DIR_OUT | USB_TYPE_VENDOR
-request: 52
-value: 0
-index: string ID
-data zero terminated UTF8 string sent from accessory to device
-</pre>
-
- <p>The following string IDs are supported, with a maximum size of 256 bytes for each string
- (must be zero terminated with \0).</p>
- <pre>
-manufacturer name: 0
-model name: 1
-description: 2
-version: 3
-URI: 4
-serial number: 5
-</pre>
- </li>
-
- <li>When the identifying strings are sent, request the device start up in accessory mode. This
- request is a control request on endpoint 0 with the following characteristics:
- <pre>
-requestType: USB_DIR_OUT | USB_TYPE_VENDOR
-request: 53
-value: 0
-index: 0
-data: none
-</pre>
- </li>
- </ol>
-
- <p>After sending the final control request, the connected USB device should re-introduce itself
- on the bus in accessory mode and the accessory can re-enumerate the connected devices. The
- algorithm jumps back to <a href="#determine">determining the device's accessory mode support</a>
- to check for the vendor and product ID. The vendor ID and product ID of the device will be
- different if the device successfully switched to accessory mode and will now correspond to
- Google's vendor and product IDs instead of the device manufacturer's IDs. The accessory can now
- <a href="#establish">establish communication with the device</a>.</p>
-
- <p>If at any point these steps fail, the device does not support Android accessory mode and the
- accessory should wait for the next device to be connected.</p>
-
- <h3 id="establish">Establish communication with the device</h3>
-
- <p>If an Android-powered device in accessory mode is detected, the accessory can query the
- device's interface and endpoint descriptors to obtain the bulk endpoints to communicate with the
- device. An Android-powered device that has a product ID of 0x2D00 has one interface with two bulk
- endpoints for input and output communication. A device with product ID of 0x2D01 has two
- interfaces with two bulk endpoints each for input and output communication. The first interface
- is for standard communication while the second interface is for ADB communication. To communicate
- on an interface, all you need to do is find the first bulk input and output endpoints, set the
- device's configuration to a value of 1 with a SET_CONFIGURATION (0x09) device request, then
- communicate using the endpoints.</p>
-
<h2 id="firmware">How the ADK board implements the Android Accessory protocol</h2>
<p>If you have access to the ADK board and shield, the following sections describe the firmware
@@ -667,8 +465,10 @@
<p>If the device is not already in accessory mode, then the ADK board must determine whether or
not it supports it by sending control request 51 to check the version of the USB accessory
protocol that the device supports (see <code>AndroidAccessory::getProtocol()</code>). Protocol
- version 1 is the only version for now, but this can be an integer greater than zero in the
- future. If the appropriate protocol version is returned, the board sends control request 52 (one
+ version 1 is supported by Android 2.3.4 (API Level 10) and higher. Protocol version 2 is
+ supported by Android 4.1 (API Level 16) and higher. Versions greater than 2 may supported in
+ the future.
+ If the appropriate protocol version is returned, the board sends control request 52 (one
for each string with <code>AndroidAcessory:sendString()</code>) to send it's identifying
information, and tries to start the device in accessory mode with control request 53. The
<code>AndroidAccessory::switchDevice()</code> method takes care of this:</p>
@@ -676,7 +476,7 @@
bool AndroidAccessory::switchDevice(byte addr)
{
int protocol = getProtocol(addr);
- if (protocol == 1) {
+ if (protocol >= 1) {
Serial.print("device supports protocol 1\n");
} else {
Serial.print("could not read device protocol version\n");
diff --git a/docs/html/tools/adk/adk2.jd b/docs/html/tools/adk/adk2.jd
new file mode 100644
index 0000000..d3fed30
--- /dev/null
+++ b/docs/html/tools/adk/adk2.jd
@@ -0,0 +1,617 @@
+page.title=Accessory Development Kit 2012 Guide
+@jd:body
+
+<div id="qv-wrapper">
+ <div id="qv">
+ <h2>In this document</h2>
+ <ol>
+ <li><a href="#components">Components</a></li>
+ <li><a href="#clock">Using the Alarm Clock</a></li>
+ <li><a href="#play-audio">Playing Audio</a></li>
+ <li><a href="#dev">Developing Accessories with ADK 2012</a>
+ <ol>
+ <li><a href="#src-download">Downloading the ADK Source</a></li>
+ <li><a href="#dev-setup">Setting Up the Development Environment</a></li>
+ <li><a href="#alt-build">Using the ADK Alternative Build System</a></li>
+ </ol>
+ </li>
+ <li><a href="#adk-conn">How the ADK Connects with Android Devices</a>
+ <ol>
+ <li><a href="#adk-conn-bt">ADK Connection over Bluetooth</a></li>
+ <li><a href="#adk-conn-usb">ADK Connection over USB</a></li>
+ </ol>
+ </li>
+ <li><a href="#audio-dock">USB Audio Dock Implementation</a></li>
+ </ol>
+
+ <h2>See also</h2>
+ <ol>
+ <li><a href="aoa.html">Android Open Accessory Protocol</a></li>
+ <li><a href="aoa2.html">Android Open Accessory Protocol 2.0</a></li>
+ <li><a href="{@docRoot}guide/topics/connectivity/usb/accessory.html">USB Accessory Dev
+ Guide</a></li>
+ </ol>
+ </div>
+</div>
+
+<p>The Android Accessory Development Kit (ADK) for 2012 is the latest reference implementation of
+an <a href="aoa.html">Android Open Accessory</a> device, designed to help Android hardware accessory
+builders and software developers create accessories for Android. The ADK 2012 is based on the <a
+href="http://arduino.cc">Arduino</a> open source electronics prototyping platform, with some
+hardware and software extensions that allow it to communicate with Android devices.</p>
+
+<p>A limited number of these kits were produced and distributed at the Google I/O 2012 developer
+conference. If you did not receive one of these kits, fear not! The specifications and design files
+for the hardware were also released for use by manufacturers and hobbyists. You should expect to see
+kits with similar features available for purchase, or you can build one yourself!</p>
+
+<p>One of the important new features demonstrated by this ADK is the ability to play audio over a
+USB connection. Be sure to check out the <a href="#audio-dock">reference implementation</a> of a USB
+audio dock in this ADK if you are interested in making audio-related USB accessories for
+Android.</p>
+
+<h2 id="components">Components</h2>
+
+<p>The ADK 2012 is based on the Arduino open source electronics prototyping platform and is an open
+hardware design. The hardware design files and firmware source code are included with the ADK
+software download. The ADK contains two main physical hardware components:</p>
+
+<ol>
+ <li>Main processing board containing the microprocessor, USB connections, power connector and
+input/output pins. This board can be removed and used separately from the rest of the hardware.</li>
+ <li>Shield containing sensors, LEDs, input controls, audio amplifier and speaker output, contained
+in a custom, polygon box enclosure.</li>
+</ol>
+
+<p>The main hardware features of the ADK are as follows:</p>
+
+<ul>
+ <li>An ARM 32-bit Cortex M3 micro-processor</li>
+ <li>Separate USB connections for an Android device and computer connection for programming and
+debugging</li>
+ <li>Sensors for light, color, proximity, temperature, humidity, barometric pressure, and
+acceleration</li>
+ <li>Micro SD Card slot</li>
+ <li>Bluetooth support</li>
+</ul>
+
+<p>The ADK comes preloaded with an alarm clock firmware program that you can use immediately. A
+companion Android application, <a
+href="https://play.google.com/store/apps/details?id=com.google.android.apps.adk2">ADK 2012</a>, is
+available on Google Play. The source code for both the Android application and the ADK firmware (an
+Arduino sketch) can be downloaded from this page.</p>
+
+<p>The ADK 2012 also comes with additional parts to help you develop accessories with it,
+including:</p>
+
+<ul>
+ <li>AC power adapter</li>
+ <li>USB A to Micro USB B connector cable</li>
+ <li>Micro USB B to Micro USB AB connector (small, rectangular plug)</li>
+ <li>Micro SD Card, preinstalled in the ADK SD Card socket</li>
+</ul>
+
+<h2 id="clock">Using the Alarm Clock</h2>
+
+<p>An alarm clock program comes preloaded on the ADK. This firmware program allows you to use the
+ADK as an alarm clock.</p>
+
+<p>To use the ADK as an alarm clock:</p>
+
+<ol>
+ <li>Open up the ADK by gently squeezing the two widest faces of the enclosure.</li>
+ <li>Attach the provided AC power adapter (round connector) to the main ADK board, or attach a USB
+cable to the port marked <strong>Computer</strong> and a USB port on your computer.</li>
+ <li>Place and hold your fingertip over the clock symbol on the control face.
+ <p class="note"><strong>Note:</strong> You may need to hold your finger in place for 1-2
+seconds.</p>
+ </li>
+ <li>Use the plus (+) and minus (-) symbols inside the clock digits to set the correct time.</li>
+ <li>Place your fingertip over the alarm clock symbol to activate alarm setting.</li>
+ <li>Use the plus (+) and minus (-) symbols inside the clock digits to set the alarm time.</li>
+ <li>Use the plus (+) and minus (-) symbols inside the last two clock digits to turn the alarm on
+({@code on}) or off ({@code oF}).</li>
+ <li>To set the alarm tone, place and hold your fingertip over the alarm clock symbol, then tap the
+slider control on top of the enclosure.</li>
+</ol>
+
+<p>To use the <strong>ADK 2012</strong> companion application for the alarm clock:</p>
+
+<ol>
+ <li>Load the companion application on your Android device running Android 3.1 (API Level 12) or
+higher:
+ <ul>
+ <li>Using an NFC-enabled Android device, unlock and hold the device against the left side of
+the ADK enclosure. Follow the prompts to install the app.
+ <br>- or -</li>
+ <li>Start Google Play on your device, search for the <strong>ADK 2012</strong> application and
+install it. If you cannot find the app, your device is not compatible. Try installing on another
+device.</li>
+ </ul>
+ </li>
+ <li>Connect your Android device to the ADK using one of the following methods:
+ <ul>
+ <li id="conn-bt">To connect using Bluetooth:
+ <ol>
+ <li>Plug the AC power adapter into the ADK.</li>
+ <li>On your Android device, turn Bluetooth On (<strong>Settings >
+Bluetooth</strong>).</li>
+ <li>In the <strong>Settings</strong> page, press the <strong>Bluetooth</strong> option to
+view paired devices.</li>
+ <li>Select <strong>Search for Devices</strong> to locate the ADK 2012 accessory and follow
+the on screen instructions to connect.</li>
+ <li>After pairing is complete, start the <strong>ADK 2012</strong> app on your Android
+device.</li>
+ <li>On the start screen, select the <strong>Use Bluetooth</strong> button.</li>
+ <li>In the list of paired devices, select the <strong>ADK 2012</strong> device.</li>
+ <li>The <strong>ADK 2012</strong> app should switch to the menu screen and you can start
+interacting with the ADK accessory.</li>
+ </ol>
+ </li>
+
+ <li id="conn-usb">To connect using USB:
+ <ol>
+ <li>Plug the AC power adapter into the ADK.</li>
+ <li>Connect the Micro USB AB connector (small, rectangular plug) to the port labeled
+<strong>Phone</strong> on the ADK board.</li>
+ <li>Unlock your Android device and connect the Micro USB B connector to your device.
+ <p class="note"><strong>Note:</strong> Your device must support Android USB accessory
+mode. Devices that support this mode include Google Nexus devices.</p>
+ </li>
+ <li>On the Android device, you should see a prompt to connect to the <strong>ADK DemoKit
+2012</strong>, select <strong>OK</strong>.</li>
+ <li>The <strong>ADK 2012</strong> app should start automatically and you can start
+interacting with the ADK.</li>
+ </ol>
+ </li>
+ </ul>
+ </li>
+</ol>
+
+<p class="note"><strong>Note:</strong> When using the ADK with a USB connection to an Android
+device, make sure the AC power adapter is plugged in. A USB connection to a computer does not
+provide sufficient voltage to power both the ADK and a USB connection to a device.</p>
+
+
+<h2 id="play-audio">Playing Audio</h2>
+
+<p>The ADK 2012 comes with audio output capabilities, including an amplifier and speaker. You can
+use it to play audio from your Android device using either a Bluetooth or USB connection.</p>
+
+<p>To play audio over Bluetooth:</p>
+
+<ol>
+ <li>Follow the instructions in the <a href="#conn-bt">previous section</a> to connect your Android
+device to the ADK over Bluetooth.</li>
+ <li>On your Android device, navigate to the <strong>Settings > Bluetooth</strong> page to view the
+list of paired devices, and make sure the ADK is connected.</li>
+ <li>Select the settings icon next to the <strong>ADK 2012</strong> item.</li>
+ <li>Make sure the <strong>Media Audio</strong> option is enabled.</li>
+ <li>Navigate to an application that plays music or other audio.</li>
+ <li>Play a song or sound and listen to it on the ADK speaker!</li>
+</ol>
+
+<p>To play audio over USB, you must use a device running Android 4.1 (API Level 16) or higher:</p>
+
+<ol>
+ <li>Plug the AC power adapter into the ADK.</li>
+ <li>Connect the Micro USB AB connector (small, rectangular plug) to the Phone port on the ADK
+board.</li>
+ <li>Unlock your Android device and connect the Micro USB B connector to your device.
+ <p class="note"><strong>Note:</strong> Your device must support Android USB accessory
+mode. Devices that support this mode include Google Nexus devices.</p>
+ </li>
+ <li>On the Android device, you should see a prompt to connect to the <strong>ADK DemoKit
+2012</strong>, select <strong>Cancel</strong> and allow the ADK to connect as a media device
+only.</li>
+ <li>Navigate to an application that plays music or other audio.</li>
+ <li>Play a song or sound and listen to it on the ADK speaker!</li>
+</ol>
+
+<p class="note"><strong>Note:</strong> When using the ADK with a USB connection to an Android
+device, make sure the AC power adapter is plugged in. A USB connection to a computer does not
+provide sufficient voltage to power both the ADK and a USB connection to a device.</p>
+
+
+<h2 id="dev">Developing Accessories with ADK 2012</h2>
+
+<p>The ADK 2012 is a hardware platform and a set of software libraries for prototyping Android
+accessories. This section discusses how to set up a development environment for programming the ADK
+to make it do what you want and to test software for building your own Android accessories.</p>
+
+<h3 id="src-download">Downloading the ADK Source</h3>
+
+<p>The support software and hardware specifications for the ADK 2012 are available from the Android
+source repository. Follow the instructions below to obtain the source material for the ADK.</p>
+
+<p>To download the ADK 2012 software, source code and hardware design specifications.</p>
+
+<ol>
+ <li>Download and install <a href="http://git-scm.com/download">Git</a> for your development
+system.</li>
+ <li>Download and setup the {@code repo} tool, as described on the <a
+href="http://source.android.com/source/downloading.html#installing-repo">Android open source
+project</a> site.</li>
+ <li>In a terminal window, create a new directory for the downloaded source files, initialize and
+synchronize a local repository:
+<pre>
+$> mkdir android-accessories
+$> cd android-accessories
+$> repo -init -u https://android.googlesource.com/platform/manifest -b android-accessories
+$> repo sync
+</pre>
+ </li>
+</ol>
+
+<p>After successfully completing this process, you should have the source code and tools for
+working with the ADK 2012:</p>
+
+<ul>
+ <li>{@code adk2012/board} - Source code and hardware design files for the ADK 2012</li>
+ <li>{@code adk2012/app} - Source code for the ADK 2012 Android companion application</li>
+ <li>{@code external/ide} - Source code for the ADK 2012 Integrated Development Environment
+(IDE)</li>
+ <li>{@code external/toolchain} - The toolchain used by the ADK 2012 IDE</li>
+</ul>
+
+
+<h3 id="dev-setup">Setting Up the Development Environment</h3>
+
+<p>The ADK 2012 source code repository includes an integrated development environment (IDE) that you
+can use to develop software for and program the ADK 2012 accessory. The following instructions
+explain how to build and run the ADK 2012 IDE.</p>
+
+<p>To set up, build and run the ADK 2012 IDE:</p>
+
+<ol>
+ <li><a href="#src-download">Download</a> the ADK 2012 source code files.</li>
+ <li>Download and install the Java Development Kit 6 or higher from <a
+href="http://java.oracle.com">java.oracle.com</a>.</li>
+ <li>Download and install <a href="http://ant.apache.org/">Apache Ant</a>.</li>
+ <li>In a terminal window, navigate to {@code <adk-source-download>/external/ide/build}
+and execute the following command to build the ADK 2012 IDE:
+<pre>$> ant</pre>
+ </li>
+ <li>After the build successfully completes, execute the following command to run the ADK 2012
+IDE:
+<pre>$> ant run</pre></li>
+</ol>
+
+<p>After you have successfully built and run the ADK 2012 IDE, you must configure it to use the
+ADK 2012 library.</p>
+
+<p>To configure the ADK 2012 IDE for use with the ADK libraries:</p>
+
+<ol>
+ <li>Start the ADK 2012 IDE and choose <strong>File > Preferences</strong>.</li>
+ <li>In the <strong>Preferences</strong> dialog, make a note of the <strong>Sketchbook
+location</strong> directory.</li>
+ <li>Copy the {@code <adk-source-download>/adk2012/board/library/ADK2} directory and its
+contents into your {@code sketchbook/libraries/} directory, so that you create a {@code
+sketchbook/libraries/ADK2} directory.</li>
+ <li>Stop and restart the <strong>ADK 2012 IDE</strong>.</li>
+ <li>In the IDE, choose <strong>File > Examples > ADK2</strong> and then choose one of the example
+sketches:
+ <ul>
+ <li><strong>clock</strong> - The sketch that is preloaded onto the ADK 2012.</li>
+ <li><strong>BluetoothScan</strong> - An example sketch demonstrating code that connects an
+accessory to an Android device over Bluetooth.</li>
+ <li><strong>usbaccessory</strong> - An example sketch demonstrating code that connects an
+accessory to an Android device through a USB cable.</li>
+ </ul>
+ </li>
+ <li>Connect a Micro USB cable from the <strong>Computer</strong> port on the ADK board to your
+development computer.</li>
+ <li>In the <strong>ADK 2012 IDE</strong>, establish a serial port connection with the ADK by
+selecting <strong>Tools > Serial Port</strong> and selecting the serial port for the ADK.</li>
+ <li>In the <strong>ADK 2012 IDE</strong>, choose the ADK by selecting<strong>Tools > Board >
+Google ADK2</strong>.</li>
+ <li>Modify an example sketch or create your own.</li>
+ <li>Upload the sketch to the ADK by choosing <strong>File > Upload</strong>. When the <strong>ADK
+2012 IDE</strong> reports <strong>Done uploading</strong>, the sketch is uploaded and the ADK is
+ready to communicate with your Android device.</li>
+</ol>
+
+<h3 id="alt-build">Using the ADK Alternative Build System</h3>
+
+<p>An alternative build and load system is also available for the ADK 2012. This system is command
+line based and intended for production environments where using an IDE environment to load software
+onto accessory hardware may be inconvenient or undesirable.</p>
+
+<p>To use the command line based build system:</p>
+<ol>
+ <li><a href="#src-download">Download</a> the ADK 2012 source code files.</li>
+ <li>Download and install the <a href="http://www.gnu.org/software/make/">make</a> tool on your
+development system.</li>
+ <li>Update your system’s PATH to include {@code
+<adk-source-download>/external/toolchain/bin}.</li>
+ <li>Open a terminal window, navigate to {@code
+<adk-source-download>/external/toolchain/app} and execute the following command:
+ <pre>$> make</pre></li>
+</ol>
+
+<h2 id="adk-conn">How the ADK Connects with Android Devices</h2>
+
+<p>The essential feature of any Android accessory is its ability to connect and communicate with an
+Android device. Creating a fast and reliable connection between your accessory and Android devices
+is the first order of business when building software for an accessory. This section describes the
+connection and communication essentials used in the ADK 2012 so that you can apply them to
+developing your own Android accessories.</p>
+
+<h3 id="adk-conn-bt">ADK Connection over Bluetooth</h3>
+
+<p>The ADK 2012 app and hardware accessory use a Bluetooth Serial Port Profile (SPP) connection to
+communicate. This connection allows two way communication between the ADK accessory and Android
+devices.</p>
+
+<p class="note"><strong>Note:</strong> The implementation of the ADK hardware allows the use of
+other profiles and multiple connections. However, the basic communication between the ADK 2012
+accessory and the Android application uses SPP.</p>
+
+<h4 id="acc-bt-code">Accessory Bluetooth Code</h4>
+
+<p>In order to enable Bluetooth communications, the {@code clock.ino} sketch for the ADK 2012
+accessory calls a {@code btStart()} method during the {@code setup()} method to enable radio
+frequency communications and start listening for Bluetooth connections:</p>
+
+<pre>
+ADK L;
+void setup() {
+ L.adkInit();
+ L.btStart();
+}
+...
+void btStart(){
+ uint8_t i, dlci;
+ int f;
+
+ L.btEnable(adkBtConnectionRequest, adkBtLinkKeyRequest, adkBtLinkKeyCreated,
+ adkBtPinRequest, NULL);
+
+ dlci = L.btRfcommReserveDlci(RFCOMM_DLCI_NEED_EVEN);
+
+ if(!dlci) dbgPrintf("BTADK: failed to allocate DLCI\n");
+ else{
+
+ //change descriptor to be valid...
+ for(i = 0, f = -1; i < sizeof(sdpDescrADK); i++){
+
+ if(sdpDescrADK[i] == MAGIX){
+ if(f == -1) f = i;
+ else break;
+ }
+ }
+
+ if(i != sizeof(sdpDescrADK) || f == -1){
+
+ dbgPrintf("BTADK: failed to find a single marker in descriptor\n");
+ L.btRfcommReleaseDlci(dlci);
+ return;
+ }
+
+ sdpDescrADK[f] = dlci >> 1;
+
+ dbgPrintf("BTADK has DLCI %u\n", dlci);
+
+ L.btRfcommRegisterPort(dlci, btAdkPortOpen, btAdkPortClose, btAdkPortRx);
+ L.btSdpServiceDescriptorAdd(sdpDescrADK, sizeof(sdpDescrADK));
+ }
+}
+</pre>
+
+<p>Notice that the {@code sdpDescrADK} object contains a Universally Unique Identifier (UUID) in the
+variable {@code BT_ADK_UUID}. This identifier <em>must match</em> the device UUID provided in the
+{@link android.bluetooth.BluetoothSocket} connection request in the Android application code.</p>
+
+<p>Once Bluetooth is enabled with the code shown above, the accessory listens for connection
+requests. The ADK library handles listening and connection details, so the accessory calls
+{@code ADK::adkEventProcess()} once during each loop execution:</p>
+
+<pre>
+void loop(void)
+{
+ ...
+ L.adkEventProcess(); //let the adk framework do its thing
+ ...
+}
+</pre>
+
+<p>If a Bluetooth connection has been established, any commands are routed to the
+{@code btAdkPortRx()} callback method (which was registered with the ADK library as part of the
+{@code btStart()} method) and processed accordingly. The ADK accessory sends messages back through
+the Bluetooth connection using the {@code ADK::btRfcommPortTx()} method.
+For more details, review the implementations of these methods in the {@code clock.ino} sketch.</p>
+
+<h4 id="app-bt-code">Android App Bluetooth Code</h4>
+
+<p>In the ADK 2012 Android app, the code for handling Bluetooth connections is encapsulated in in a
+{@code BTConnection} class. In this class, the application requests access to the Bluetooth adapter
+and negotiates a connection with the ADK 2012 accessory. Here is a summary of the relevant code:</p>
+
+<pre>
+mAdapter = BluetoothAdapter.getDefaultAdapter();
+BluetoothDevice device = mAdapter.getRemoteDevice(address);
+mSocket = device.createInsecureRfcommSocketToServiceRecord(ADK_UUID);
+mSocket.connect();
+</pre>
+
+<p>Note the {@code ADK_UUID} parameter in the second line. This identifier must match the identifier
+output by the accessory (the {@code BT_ADK_UUID} variable mentioned earlier), otherwise the protocol
+negotiation fails and the {@link android.bluetooth.BluetoothSocket} is not created. Once a
+connection is established, you obtain {@link java.io.InputStream} and {@link java.io.OutputStream}
+objects from the socket to communicate with the accessory:</p>
+
+<pre>
+mInStream = mSocket.getInputStream();
+mOutStream = mSocket.getOutputStream();
+</pre>
+
+<p>Review the {@code BTConnection.java} file provided in the ADK 2012 software download for more
+implementation details.</p>
+
+<h3 id="adk-conn-usb">ADK Connection over USB</h3>
+
+<p>The ADK 2012 app and hardware accessory can also use a USB connection to communicate, similar to
+the original ADK.</p>
+
+<h4 id="acc-usb-code">Accessory USB Code</h4>
+
+<p>The ADK library takes care of most of the implementation details for a USB connection, the
+accessory code must make a few calls to initialize USB connectivity, including setting the accessory
+identification strings:</p>
+
+<pre>
+ADK L;
+void setup() {
+ L.adkInit();
+ L.usbSetAccessoryStringVendor(...);
+ L.usbSetAccessoryStringName(...);
+ L.usbSetAccessoryStringLongname(...);
+ L.usbSetAccessoryStringVersion(...);
+ L.usbSetAccessoryStringUrl(...);
+ L.usbSetAccessoryStringSerial(...);
+
+ L.usbStart();
+}
+</pre>
+
+<p class="note"><strong>Note:</strong> The identification strings must match the USB accessory
+filter settings specified in the connecting Android application,otherwise the application cannot
+connect with the accessory.</p>
+
+<p>Once USB is enabled with code shown above, the accessory listens for connection requests. The ADK
+library handles listening and connection details, so the accessory calls {@code
+ADK::adkEventProcess()} once during each loop execution:</p>
+
+<pre>
+void loop(void)
+{
+ ...
+ L.adkEventProcess(); //let the adk framework do its thing
+ ...
+}
+</pre>
+
+<p>The accessory must then check for a live USB connection to process commands and send
+messages. Here is a summary of the relevant code:</p>
+
+<pre>
+void loop() {
+ if (L.accessoryConnected()) {
+ int recvLen = L.accessoryReceive(msg, sizeof(msg));
+ if (recvLen > 0) {
+ ... // process message
+ }
+
+ L.accessorySend(outmsg, outmsgLen);
+ }
+ L.adkEventProcess();
+}
+</pre>
+
+<p>For more details, review the implementations of these methods in the {@code clock.ino}
+sketch.</p>
+
+<h4 id="app-usb-code">Android App USB Code</h4>
+
+<p>In the ADK 2012 Android app, the code for handling USB connections is encapsulated in a
+{@code UsbConnection} class. This class sets up a {@link android.content.BroadcastReceiver} to
+listen for USB events and then attempts to connect when a matching connection event is received.
+Here is a summary of the relevant code:</p>
+
+<pre>
+import com.android.future.usb.UsbAccessory;
+import com.android.future.usb.UsbManager;
+
+mUSBManager = UsbManager.getInstance(this);
+UsbAccessory acc = mUSBManager.getAccessoryList()[0];
+
+if (!mUSBManager.hasPermission(acc)) return;
+</pre>
+
+<p>The ADK 2012 app uses the support library to implement the USB accessory connections, in order to
+support devices running Android 2.3.4 (API Level 10). If you only need to support Android
+3.1 (API Level 12) and higher devices, you can replace the first 4 lines the following code:</p>
+
+<pre>
+import android.hardware.usb.UsbAccessory
+import android.hardware.usb.UsbManager
+
+mUSBManager = (UsbManager) getSystemService(Context.USB_SERVICE);
+UsbAccessory acc = (UsbAccessory)
+ intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);
+</pre>
+
+<p>Note that the app only receives events when the USB accessory identification information matches
+the information in the {@code res/xml/usb_accessory_filter.xml} file, referenced by the
+application’s manifest statement:</p>
+
+<pre>
+<meta-data
+ android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"
+ android:resource="@xml/usb_accessory_filter" />
+</pre>
+
+<p>Connections from other USB devices are not received by the ADK 2012 accessory.</p>
+
+<p>Once the connection is established, the app can communicate with the accessory through file input
+and output streams, as shown in the following example code:</p>
+
+<pre>
+ParcelFileDescriptor mFD = mUSBManager.openAccessory(acc);
+if (mFD != null) {
+ FileDescripter fd = mFD.getFileDescriptor();
+ mIS = new FileInputStream(fd); // use this to receive messages
+ mOS = new FileOutputStream(fd); // use this to send commands
+}
+</pre>
+
+<p>Review the {@code UsbConnection.java} file provided in the ADK 2012 source code for more
+implementation details.</p>
+
+<h2 id="audio-dock">USB Audio Dock Implementation</h2>
+
+<p>One of the important new features introduced with the ADK 2012 is the ability to play audio over
+a USB connection. This innovation was introduced as an update to Android Open Accessory (AOA)
+<a href="aoa2.html">protocol 2.0</a> and is available on devices running Android 4.1 (API Level 16)
+and higher.</p>
+
+<p>The ADK 2012 provides a reference implementation of this functionality for accessory developers.
+No software application is required to be installed on the connected Android device, accessory
+developers only need to support AOA v2. This implementation demonstrates audio output of 16bit,
+44.1kHz stereo PCM source data compressed into a single channel due to the audio hardware available
+on the accessory.</p>
+
+<p>Using the audio output features provided by the ADK library requires only a few function calls.
+The first few calls are in the accessory {@code setup()} routine, which prepare the accessory for
+USB connections and audio output, as summarized in the code example below:</p>
+
+<pre>
+ADK L;
+void setup() {
+ L.audioInit();
+ L.usbh_init()
+ L.usbStart();
+}
+</pre>
+
+<p>For more information about the {@code ADK::audioInit()} function, see the {@code
+libraries/ADK/Audio.c} library file. For more information about the {@code ADK::usbh_init()}
+function, see the {@code libraries/ADK/Usbh.c} library file.</p>
+
+<p>After completing this setup, the {@code loop()} function calls {@code ADK::adkEventProcess()} to
+handle audio output and other ADK functions:</p>
+
+<pre>
+void loop(void)
+{
+ ...
+ L.adkEventProcess(); //let the adk framework do its thing
+ ...
+}
+</pre>
+
+<p>This call executes task queuing for the ADK and as part of the execution process, the task queue
+executes {@code usbh_work()} in {@code libraries/ADK/Usbh.c}, which handles audio output requests.
+Review the implementation of this function for details. For additional implementation details on
+audio output, see the {@code libraries/ADK/accessory.c} library file.</p>
diff --git a/docs/html/tools/adk/aoa.jd b/docs/html/tools/adk/aoa.jd
new file mode 100644
index 0000000..7884d6e
--- /dev/null
+++ b/docs/html/tools/adk/aoa.jd
@@ -0,0 +1,186 @@
+page.title=Android Open Accessory Protocol
+@jd:body
+
+<div id="qv-wrapper">
+ <div id="qv">
+ <h2>In this document</h2>
+ <ol>
+ <li><a href="#accessory-protocol">Implementing the Android Accessory Protocol</a>
+ <ol>
+ <li><a href="#wait">Wait for and detect connected devices</a></li>
+ <li><a href="#determine">Determine the device's accessory mode support</a></li>
+ <li><a href="#start">Attempt to start the device in accessory mode</a></li>
+ <li><a href="#establish">Establish communication with the device</a></li>
+ </li>
+ </ol>
+
+ <h2>See also</h2>
+ <ol>
+ <li><a href="aoa2.html">Android Open Accessory Protocol 2.0</a></li>
+ <li><a href="{@docRoot}guide/topics/connectivity/usb/accessory.html">USB Accessory Dev
+Guide</a></li>
+ </ol>
+ </div>
+ </div>
+
+ <p>With Android 3.1, the platform introduces Android Open Accessory
+ support, which allows external USB hardware (an Android USB accessory) to interact with an
+ Android-powered device in a special accessory mode. When an Android-powered powered device is
+ in accessory mode, the connected accessory acts as the USB host (powers the bus and enumerates
+ devices) and the Android-powered device acts as the USB device. Android USB accessories are
+ specifically designed to attach to Android-powered devices and adhere to a simple protocol
+ (Android accessory protocol) that allows them to detect Android-powered devices that support
+ accessory mode. Accessories must also provide 500mA at 5V for charging power. Many previously
+ released Android-powered devices are only capable of acting as a USB device and cannot initiate
+ connections with external USB devices. Android Open Accessory support overcomes this limitation
+ and allows you to build accessories that can interact with an assortment of Android-powered
+ devices by allowing the accessory to initiate the connection.</p>
+
+ <p class="note"><strong>Note:</strong> Accessory mode is ultimately dependent on the device's
+ hardware and not all devices support accessory mode. Devices that support accessory mode can
+ be filtered using a <code><uses-feature></code> element in your corresponding application's
+ Android manifest. For more information, see the <a href=
+ "{@docRoot}guide/topics/connectivity/usb/accessory.html#manifest">USB Accessory</a> developer
+guide.</p>
+
+ <h2 id="accessory-protocol">Implementing the Android Accessory Protocol</h2>
+
+ <p>An Android USB accessory must adhere to Android Accessory Protocol, which defines how
+ an accessory detects and sets up communication with an Android-powered device. In general, an
+ accessory should carry out the following steps:</p>
+
+ <ol>
+ <li>Wait for and detect connected devices</li>
+
+ <li>Determine the device's accessory mode support</li>
+
+ <li>Attempt to start the device in accessory mode if needed</li>
+
+ <li>Establish communication with the device if it supports the Android accessory protocol</li>
+ </ol>
+
+ <p>The following sections go into depth about how to implement these steps.</p>
+
+ <h3 id="wait">Wait for and detect connected devices</h3>
+
+ <p>Your accessory should have logic to continuously check
+ for connected Android-powered devices. When a device is connected, your accessory should
+ determine if the device supports accessory mode.</p>
+
+ <h3 id="determine">Determine the device's accessory mode support</h3>
+
+
+ <p>When an Android-powered device is connected, it can be in one of three states:</p>
+
+ <ol type="a">
+ <li>The attached device supports Android accessory mode and is already in accessory mode.</li>
+
+ <li>The attached device supports Android accessory mode, but it is not in accessory mode.</li>
+
+ <li>The attached device does not support Android accessory mode.</li>
+ </ol>
+
+ <p>During the initial connection, the accessory should check the vendor and product IDs of the
+ connected device's USB device descriptor. The vendor ID should match Google's ID (0x18D1) and the
+ product ID should be 0x2D00 or 0x2D01 if the device is already in accessory mode (case A). If so,
+ the accessory can now <a href="#establish">establish communication with the device</a> through
+ bulk transfer endpoints with its own communication protocol. There is no need to start the device
+ in accessory mode.</p>
+
+ <p class="note"><strong>Note:</strong> 0x2D00 is reserved for Android-powered devices that
+ support accessory mode. 0x2D01 is reserved for devices that support accessory mode as well as the
+ ADB (Android Debug Bridge) protocol, which exposes a second interface with two bulk endpoints for
+ ADB. You can use these endpoints for debugging the accessory application if you are simulating
+ the accessory on a computer. In general, do not use this interface unless your accessory is
+ implementing a passthrough to ADB on the device.</p>
+
+ <p>If the vendor and product ID do not match, there is no way to distinguish between states b and
+ c, so the accessory <a href="#start">attempts to start the device in accessory mode</a> to figure
+ out if the device is supported.</p>
+
+ <h3 id="start">Attempt to start the device in accessory mode</h3>
+
+ <p>If the vendor and product IDs do not correspond to an Android-powered device in accessory
+ mode, the accessory cannot discern whether the device supports accessory mode and is not in that
+ state, or if the device does not support accessory mode at all. This is because devices that
+ support accessory mode but aren't in it initially report the device's manufacturer vendor ID and
+ product ID, and not the special Android Open Accessory ones. In either case, the accessory should
+try to start
+ the device into accessory mode to figure out if the device supports it. The following steps
+ explain how to do this:</p>
+
+ <ol>
+ <li>Send a 51 control request ("Get Protocol") to figure out if the device supports the Android
+ accessory protocol. A non-zero number is returned if the protocol is supported, which
+ represents the version of the protocol that the device supports (currently, only version 1
+ exists). This request is a control request on endpoint 0 with the following characteristics:
+ <pre>
+requestType: USB_DIR_IN | USB_TYPE_VENDOR
+request: 51
+value: 0
+index: 0
+data: protocol version number (16 bits little endian sent from the device to the
+accessory)
+</pre>
+ </li>
+
+ <li>If the device returns a proper protocol version, send identifying string information to the
+ device. This information allows the device to figure out an appropriate application for this
+ accessory and also present the user with a URL if an appropriate application does not exist.
+ These requests are control requests on endpoint 0 (for each string ID) with the following
+ characteristics:
+ <pre>
+requestType: USB_DIR_OUT | USB_TYPE_VENDOR
+request: 52
+value: 0
+index: string ID
+data zero terminated UTF8 string sent from accessory to device
+</pre>
+
+ <p>The following string IDs are supported, with a maximum size of 256 bytes for each string
+ (must be zero terminated with \0).</p>
+ <pre>
+manufacturer name: 0
+model name: 1
+description: 2
+version: 3
+URI: 4
+serial number: 5
+</pre>
+ </li>
+
+ <li>When the identifying strings are sent, request the device start up in accessory mode. This
+ request is a control request on endpoint 0 with the following characteristics:
+ <pre>
+requestType: USB_DIR_OUT | USB_TYPE_VENDOR
+request: 53
+value: 0
+index: 0
+data: none
+</pre>
+ </li>
+ </ol>
+
+ <p>After sending the final control request, the connected USB device should re-introduce itself
+ on the bus in accessory mode and the accessory can re-enumerate the connected devices. The
+ algorithm jumps back to <a href="#determine">determining the device's accessory mode support</a>
+ to check for the vendor and product ID. The vendor ID and product ID of the device will be
+ different if the device successfully switched to accessory mode and will now correspond to
+ Google's vendor and product IDs instead of the device manufacturer's IDs. The accessory can now
+ <a href="#establish">establish communication with the device</a>.</p>
+
+ <p>If at any point these steps fail, the device does not support Android accessory mode and the
+ accessory should wait for the next device to be connected.</p>
+
+ <h3 id="establish">Establish communication with the device</h3>
+
+ <p>If an Android-powered device in accessory mode is detected, the accessory can query the
+ device's interface and endpoint descriptors to obtain the bulk endpoints to communicate with the
+ device. An Android-powered device that has a product ID of 0x2D00 has one interface with two bulk
+ endpoints for input and output communication. A device with product ID of 0x2D01 has two
+ interfaces with two bulk endpoints each for input and output communication. The first interface
+ is for standard communication while the second interface is for ADB communication. To communicate
+ on an interface, all you need to do is find the first bulk input and output endpoints, set the
+ device's configuration to a value of 1 with a SET_CONFIGURATION (0x09) device request, then
+ communicate using the endpoints.</p>
+
diff --git a/docs/html/tools/adk/aoa2.jd b/docs/html/tools/adk/aoa2.jd
new file mode 100644
index 0000000..2a3b2f0
--- /dev/null
+++ b/docs/html/tools/adk/aoa2.jd
@@ -0,0 +1,227 @@
+page.title=Android Open Accessory Protocol 2.0
+@jd:body
+
+<div id="qv-wrapper">
+ <div id="qv">
+ <h2>In this document</h2>
+ <ol>
+ <li><a href="#detecting">Detecting Android Open Accessory 2.0 Support</a></li>
+ <li><a href="#audio-support">Audio Support</a></li>
+ <li><a href="#hid">HID Support</a></li>
+ <li><a href="#interop-aoa">Interoperability with AOA 1.0 Features</a></li>
+ <li><a href="#no-app-conn">Connecting AOA 2.0 without an Android App</a></li>
+ </ol>
+
+ <h2>See also</h2>
+ <ol>
+ <li><a href="aoa.html">Android Open Accessory Protocol</a></li>
+ </ol>
+ </div>
+</div>
+
+<p>This document describes the changes to the Android Open Accessory (AOA) protocol since its
+initial release, and is a supplement to the documentation of the <a href="oap.html">first
+release of AOA</a>.</p>
+
+<p>The Android Open Accessory Protocol 2.0 adds two new features: audio output (from the Android
+device to the accessory) and support for the accessory acting as one or more human interface devices
+(HID) to the Android device. The Android SDK APIs available to Android application developers
+remain unchanged.</p>
+
+<h2 id="detecting">Detecting Android Open Accessory 2.0 Support</h2>
+
+<p>In order for an accessory to determine if a connected Android device supports accessories and at
+what protocol level, the accessory must send a {@code getProtocol()} command and check the result.
+Android devices supporting the initial version of the Android Open Accessory protocol return a
+{@code 1}, representing the protocol version number. Devices that support the new features described
+in this document must return {@code 2} for the protocol version. Version 2.0 of the protocol is
+upwardly compatible, so accessories designed for the original accessory protocol still work
+with newer Android devices. The following code from the <a href="adk.html">Android Development Kit
+2011</a> {@code AndroidAccessory} library demonstrates this protocol check:</p>
+
+<pre>
+bool AndroidAccessory::switchDevice(byte addr)
+{
+ int protocol = getProtocol(addr);
+ if (protocol >= 1) {
+ Serial.print("device supports protocol 1 or higher\n");
+ } else {
+ Serial.print("could not read device protocol version\n");
+ return false;
+ }
+
+ sendString(addr, ACCESSORY_STRING_MANUFACTURER, manufacturer);
+ sendString(addr, ACCESSORY_STRING_MODEL, model);
+ sendString(addr, ACCESSORY_STRING_DESCRIPTION, description);
+ sendString(addr, ACCESSORY_STRING_VERSION, version);
+ sendString(addr, ACCESSORY_STRING_URI, uri);
+ sendString(addr, ACCESSORY_STRING_SERIAL, serial);
+
+ usb.ctrlReq(addr, 0, USB_SETUP_HOST_TO_DEVICE | USB_SETUP_TYPE_VENDOR |
+USB_SETUP_RECIPIENT_DEVICE,
+ ACCESSORY_START, 0, 0, 0, 0, NULL);
+ return true;
+}
+</pre>
+
+<p>AOA 2.0 includes new USB product IDs, one for each combination of USB interfaces available when
+in accessory mode. The possible USB interfaces are:</p>
+
+<ul>
+ <li><strong>accessory</strong> - An interface providing 2 bulk endpoints for communicating with an
+Android application.</li>
+ <li><strong>audio</strong> -A new standard USB audio class interface for streaming audio
+from an Android device to an accessory.</li>
+ <li><strong>adb</strong> - An interface intended only for debugging purposes while developing an
+accessory. Only enabled if the user has USB Debugging enabled in Settings on the Android device.
+ </li>
+</ul>
+
+<p>In AOA 1.0, there are only two USB product IDs:</p>
+
+<ul>
+ <li>{@code 0x2D00} - accessory</li>
+ <li>{@code 0x2D01} - accessory + adb</li>
+</ul>
+
+<p>AOA 2.0 adds an optional USB audio interface and, therefore, includes product IDs for the new
+combinations of USB interfaces:</p>
+
+<ul>
+ <li>{@code 0x2D02} - audio</li>
+ <li>{@code 0x2D03} - audio + adb</li>
+ <li>{@code 0x2D04} - accessory + audio</li>
+ <li>{@code 0x2D05} - accessory + audio + adb</li>
+</ul>
+
+<h2 id="audio-support">Audio Support</h2>
+
+<p>AOA 2.0 includes optional support for audio output from an Android device to an accessory. This
+version of the protocol supports a standard USB audio class interface that is capable of 2 channel
+16-bit PCM audio with a bit rate of 44100 Khz. AOA 2.0 is currently limited to this output mode, but
+additional audio modes may be added in the future.</p>
+
+<p>To enable the audio support, the accessory must send a new USB control request:</p>
+
+<pre>
+<strong>SET_AUDIO_MODE</strong>
+requestType: USB_DIR_OUT | USB_TYPE_VENDOR
+request: 58
+value: 0 for no audio (default),
+ 1 for 2 channel, 16-bit PCM at 44100 KHz
+index: 0
+data none
+</pre>
+
+<p>This command must be sent <em>before</em> sending the {@code ACCESSORY_START} command for
+entering accessory mode.</p>
+
+<h2 id="hid">HID Support</h2>
+
+<p>AOA 2.0 allows the accessory to register one or more HID devices with
+an Android device. This approach reverses the direction of communication for typical USB HID
+devices like USB mice and keyboards. Normally, the HID device is a peripheral connected to a USB
+host like a personal computer. But in the case of the AOA protocol, the USB host acts as one or more
+input devices to a USB peripheral.</p>
+
+<p>HID support in AOA 2.0 is simply a proxy for standard HID events. The implementation makes no
+assumptions about the content or type of events and merely passes it through to the input system,
+so an AOA 2.0 accessory can act as any HID device (mouse, keyboard, game controller, etc.). It
+can be used for something as simple as the play/pause button on a media dock, or something as
+complicated as a docking station with a mouse and full QWERTY keyboard.</p>
+
+<p>The AOA 2.0 protocol adds four new USB control requests to allow the accessory to act as one or
+more HID input devices to the Android device. Since HID support is done entirely through
+control requests on endpoint zero, no new USB interface is needed to provide this support. The
+control requests are as follows:</p>
+
+<ul>
+ <li><strong>ACCESSORY_REGISTER_HID</strong> registers a new HID device with the Android device.
+The accessory provides an ID number that is used to identify the HID device for the other three
+calls. This ID is valid until USB is disconnected or until the accessory sends
+ACCESSORY_UNREGISTER_HID to unregister the HID device.</li>
+ <li><strong>ACCESSORY_UNREGISTER_HID</strong> unregisters a HID device that was previously
+registered with ACCESSORY_REGISTER_HID.</li>
+ <li><strong>ACCESSORY_SET_HID_REPORT_DESC</strong> sends a report descriptor for a HID device to
+the Android device. This request is used to describe the capabilities of the HID device, and must
+be sent before reporting any HID events to the Android device. If the report descriptor is larger
+than the maximum packet size for endpoint zero, multiple ACCESSORY_SET_HID_REPORT_DESC commands are
+sent in order to transfer the entire descriptor.</li>
+ <li><strong>ACCESSORY_SEND_HID_EVENT</strong> sends input events from the accessory to the Android
+device.</li>
+</ul>
+
+<p>The code definitions for these new control requests are as follows:</p>
+
+<pre>
+/* Control request for registering a HID device.
+ * Upon registering, a unique ID is sent by the accessory in the
+ * value parameter. This ID will be used for future commands for
+ * the device
+ *
+ * requestType: USB_DIR_OUT | USB_TYPE_VENDOR
+ * request: ACCESSORY_REGISTER_HID_DEVICE
+ * value: Accessory assigned ID for the HID device
+ * index: total length of the HID report descriptor
+ * data none
+ */
+#define ACCESSORY_REGISTER_HID 54
+
+/* Control request for unregistering a HID device.
+ *
+ * requestType: USB_DIR_OUT | USB_TYPE_VENDOR
+ * request: ACCESSORY_REGISTER_HID
+ * value: Accessory assigned ID for the HID device
+ * index: 0
+ * data none
+ */
+#define ACCESSORY_UNREGISTER_HID 55
+
+/* Control request for sending the HID report descriptor.
+ * If the HID descriptor is longer than the endpoint zero max packet size,
+ * the descriptor will be sent in multiple ACCESSORY_SET_HID_REPORT_DESC
+ * commands. The data for the descriptor must be sent sequentially
+ * if multiple packets are needed.
+ *
+ * requestType: USB_DIR_OUT | USB_TYPE_VENDOR
+ * request: ACCESSORY_SET_HID_REPORT_DESC
+ * value: Accessory assigned ID for the HID device
+ * index: offset of data in descriptor
+ * (needed when HID descriptor is too big for one packet)
+ * data the HID report descriptor
+ */
+#define ACCESSORY_SET_HID_REPORT_DESC 56
+
+/* Control request for sending HID events.
+ *
+ * requestType: USB_DIR_OUT | USB_TYPE_VENDOR
+ * request: ACCESSORY_SEND_HID_EVENT
+ * value: Accessory assigned ID for the HID device
+ * index: 0
+ * data the HID report for the event
+ */
+#define ACCESSORY_SEND_HID_EVENT 57
+</pre>
+
+<h2 id="interop-aoa">Interoperability with AOA 1.0 Features</h2>
+
+<p>The original <a href="aoa.html">AOA protocol</a> provided support for an Android application to
+communicate directly with a USB host (accessory) over USB. AOA 2.0 keeps that support, but adds new
+features to allow the accessory to communicate with the Android operating system itself
+(specifically the audio and input systems). The design of the AOA 2.0 makes it is possible to build
+an accessory that also makes use of the new audio and/or HID support in addition to the original
+feature set. Simply use the new features described in this document in addition to the original AOA
+protocol features.</p>
+
+<h2 id="no-app-conn">Connecting AOA 2.0 without an Android App</h2>
+
+<p>It is possible to design an accessory (for example, an audio dock) that uses the new audio and
+HID support, but does not need to communicate with an application on the Android device. In that
+case, the user would not want to see the dialog prompts related to finding and associating the newly
+attached accessory with an Android application that can communicate with it. To prevent these
+dialogs from appearing after the device and accessory are connected, the accessory can simply not
+send the manufacturer and model names to the Android device. If these strings are not provided to
+the Android device, then the accessory is able to make use of the new audio and HID support in AOA
+2.0 without the system attempting to find an application to communicate with the accessory. Also,
+if these strings are not provided, the accessory USB interface is not present in the Android
+device USB configuration after the device enters accessory mode.</p>
\ No newline at end of file
diff --git a/docs/html/tools/adk/index.jd b/docs/html/tools/adk/index.jd
new file mode 100644
index 0000000..4b9b042
--- /dev/null
+++ b/docs/html/tools/adk/index.jd
@@ -0,0 +1,34 @@
+page.title=Accessory Development Kit
+@jd:body
+
+<p>The Accessory Development Kit (ADK) is a reference implementation for hardware manufacturers and
+hobbyists to use as a starting point for building accessories for Android. Each ADK release is
+provided with source code and hardware specifications to make the process of developing your own
+accessories easier. Creating new and alternative hardware based on the ADK is encouraged!</p>
+
+<p>Android accessories can be audio docking stations, exercise machines, personal medical testing
+devices, weather stations, or any other external hardware device that adds to the functionality of
+Android.</p>
+
+<p>Accessories use the Android Open Accessory (AOA) protocol to communicate with Android
+devices, over USB cable or through a Bluetooth connection. If you are building an accessory for
+Android devices, make sure you review the information below to understand about how to implement the
+AOA protocol.</p>
+
+<p>The following sections provide more information about the Android Accessory Development Kits, how
+to use them, and how to get started building your own accessories for Android.</p>
+
+<dl>
+ <dt><a href="adk2.html">ADK 2012 Guide</a></dt>
+ <dd>Guide to getting started with the ADK released at Google I/O 2012.</dd>
+
+ <dt><a href="adk.html">ADK 2011 Guide</a></dt>
+ <dd>Guide to getting started with the original ADK, released at Google I/O 2011.</dd>
+
+ <dt><a href="aoa.html">Android Open Accessory Protocol</a></dt>
+ <dd>Guide to implementing the Android Open Accessory Protocol.</dd>
+
+ <dt><a href="aoa2.html">Android Open Accessory Protocol 2.0</a></dt>
+ <dd>A description and guide to implementing the extended Android Open Accessory Protocol which
+ supports audio dock accessories.</dd>
+</dl>
diff --git a/docs/html/tools/extras/support-library.jd b/docs/html/tools/extras/support-library.jd
index 7258c77..869a15b 100644
--- a/docs/html/tools/extras/support-library.jd
+++ b/docs/html/tools/extras/support-library.jd
@@ -46,14 +46,120 @@
<p>The sections below provide notes about successive releases of
the Support Package, as denoted by revision number.</p>
-<div class="toggle-content open">
+<script type="text/javascript">
+function toggleDiv(link) {
+ var toggleable = $(link).parent();
+ if (toggleable.hasClass("closed")) {
+ //$(".toggleme", toggleable).slideDown("fast");
+ toggleable.removeClass("closed");
+ toggleable.addClass("open");
+ $(".toggle-img", toggleable).attr("title", "hide").attr("src", (toRoot +
+"assets/images/triangle-opened.png"));
+ } else {
+ //$(".toggleme", toggleable).slideUp("fast");
+ toggleable.removeClass("open");
+ toggleable.addClass("closed");
+ $(".toggle-img", toggleable).attr("title", "show").attr("src", (toRoot +
+"assets/images/triangle-closed.png"));
+ }
+ return false;
+}
+</script>
- <p><a href="#" onclick="return toggleContent(this)">
- <img src="{@docRoot}assets/images/triangle-opened.png" class="toggle-content-img" />
- Support Package, revision 8 (April 2012)
- </a></p>
+<style>
+.toggleable {
+padding: 5px 0 0;
+}
+.toggleme {
+ padding: 10px 0 0 20px;
+}
+.toggleable a {
+ text-decoration:none;
+}
+.toggleme a {
+ text-decoration:underline;
+}
+.toggleable.closed .toggleme {
+ display:none;
+}
+#jd-content .toggle-img {
+ margin:0 5px 3px 0;
+}
+</style>
- <div class="toggle-content-toggleme" style="padding-left:2em">
+<div class="toggleable opened">
+ <a href="#" onclick="return toggleDiv(this)">
+ <img src="{@docRoot}assets/images/triangle-opened.png" class="toggle-img" height="9px" width="9px"
+/>Support Package, revision 9</a> <em>(June 2012)</em>
+ <div class="toggleme">
+ <dl>
+ <dt>Changes for v4 support library:</dt>
+ <dd>
+ <ul>
+
+ <li>User Interface Support
+ <ul>
+ <li>Added {@link android.support.v4.view.PagerTabStrip} support, providing enhanced
+functionality beyond {@link android.support.v4.view.PagerTitleStrip}.</li>
+ <li>Fixed various bugs for {@link android.support.v4.view.PagerTitleStrip} and
+{@link android.support.v4.view.PagerTabStrip}, including {@link
+android.widget.TextView#setAllCaps setAllCaps} option, title alignment,
+appearance improvements, minimum width constraints and touch navigation issues.</li>
+ <li>Added support for {@link android.support.v4.view.ViewPager} page gutters, which
+helps the {@link android.support.v4.view.ViewPager} class provide paging support for content with
+a large horizontal scroll range, such as a map.</li>
+ <li>Fixed numerous bugs for {@link android.support.v4.view.ViewPager}, including size
+and data set change problems, page positioning, user interaction, scroll tracking and keyboard
+navigation problems.</li>
+ <li>Fixed many bugs for {@link android.support.v4.app.Fragment}, including proper
+handling of {@link android.support.v4.app.Fragment#onActivityResult onActivityResult()} when
+the target fragment no longer exists, dispatching selection events to invisible fragments, improved
+{@link android.support.v4.app.FragmentTransaction#replace FragmentTransaction.replace()} behavior
+and added better state handling for fragments being moved out of view.</li>
+ <li>Added support for the {@link
+android.support.v4.view.ViewCompat postOnAnimation()} method in {@link
+android.support.v4.view.ViewCompat}.</li>
+ <li>Updated {@link android.support.v4.app.NavUtils} to use Android 4.1 (API level 16)
+<em>Up</em> navigation functionality when available.</li>
+ </ul>
+ </li>
+
+ <li>Accessibility
+ <ul>
+ <li>Updated accessibility support classes, including {@link
+android.support.v4.view.accessibility.AccessibilityNodeInfoCompat}, to follow fixes made in Android
+4.1 (API level 16).</li>
+ <li>Added support for accessibility scroll actions in {@link
+android.support.v4.view.ViewPager}.</li>
+ </ul>
+ </li>
+
+ <li>General improvements
+ <ul>
+ <li>Updated {@link android.support.v4.app.TaskStackBuilder} to reflect API changes in
+Android 4.1 (API level 16).</li>
+ <li>Enhanced {@link android.support.v4.app.TaskStackBuilder} to allow it to be used
+from a Service.</li>
+ <li>Added support for {@link android.support.v4.content.IntentCompat EXTRA_HTML_TEXT}
+to {@link android.support.v4.app.ShareCompat}.</li>
+ <li>Updated {@link android.support.v4.app.NotificationCompat.Builder} to support the
+{@link android.support.v4.app.NotificationCompat.Builder#setNumber setNumber()} method.</li>
+ <li>Added support in {@link android.support.v4.net.ConnectivityManagerCompat} for the
+{@link android.support.v4.net.ConnectivityManagerCompat#isActiveNetworkMetered
+isActiveNetworkMetered()} method.</li>
+ </ul>
+ </li>
+ </ul>
+ </dd>
+ </dl>
+ </div>
+</div>
+
+<div class="toggleable closed">
+ <a href="#" onclick="return toggleDiv(this)">
+ <img src="{@docRoot}assets/images/triangle-closed.png" class="toggle-img" height="9px" width="9px"
+/>Support Package, revision 8</a> <em>(April 2012)</em>
+ <div class="toggleme">
<dl>
<dt>Changes for v4 support library:</dt>
<dd>
@@ -67,16 +173,14 @@
</ul>
</dd>
</dl>
+ </div>
</div>
-<div class="toggle-content closed">
-
- <p><a href="#" onclick="return toggleContent(this)">
- <img src="{@docRoot}assets/images/triangle-closed.png" class="toggle-content-img" />
- Support Package, revision 7 (March 2012)
- </a></p>
-
- <div class="toggle-content-toggleme" style="padding-left:2em">
+<div class="toggleable closed">
+ <a href="#" onclick="return toggleDiv(this)">
+ <img src="{@docRoot}assets/images/triangle-closed.png" class="toggle-img" height="9px" width="9px"
+/>Support Package, revision 7</a> <em>(March 2012)</em>
+ <div class="toggleme">
<dl>
<dt>Changes for v4 support library:</dt>
<dd>
@@ -98,15 +202,14 @@
</dd>
</dl>
</div>
+</div>
-<div class="toggle-content closed">
+<div class="toggleable closed">
+ <a href="#" onclick="return toggleDiv(this)">
+ <img src="{@docRoot}assets/images/triangle-closed.png" class="toggle-img" height="9px" width="9px"
+/>Support Package, revision 6</a> <em>(December 2011)</em>
+ <div class="toggleme">
- <p><a href="#" onclick="return toggleContent(this)">
- <img src="{@docRoot}assets/images/triangle-closed.png" class="toggle-content-img" />
- Support Package, revision 6 (December 2011)
- </a></p>
-
- <div class="toggle-content-toggleme" style="padding-left:2em">
<p class="note"><strong>Note:</strong> Reference for support library APIs are now available with
the framework references, for example: {@link android.support.v4.app}.</p>
<dl>
@@ -151,15 +254,13 @@
</dd>
</dl>
</div>
+</div>
-<div class="toggle-content closed">
-
- <p><a href="#" onclick="return toggleContent(this)">
- <img src="{@docRoot}assets/images/triangle-closed.png" class="toggle-content-img" />
- Support Package, revision 5 (December 2011)
- </a></p>
-
- <div class="toggle-content-toggleme" style="padding-left:2em">
+<div class="toggleable closed">
+ <a href="#" onclick="return toggleDiv(this)">
+ <img src="{@docRoot}assets/images/triangle-closed.png" class="toggle-img" height="9px" width="9px"
+/>Support Package, revision 5</a> <em>(December 2011)</em>
+ <div class="toggleme">
<dl>
<dt>Changes for v4 support library:</dt>
<dd>
@@ -211,15 +312,13 @@
</dd>
</dl>
</div>
+</div>
-<div class="toggle-content closed">
-
- <p><a href="#" onclick="return toggleContent(this)">
- <img src="{@docRoot}assets/images/triangle-closed.png" class="toggle-content-img" />
- Support Package, revision 4 (October 2011)
- </a></p>
-
- <div class="toggle-content-toggleme" style="padding-left:2em">
+<div class="toggleable closed">
+ <a href="#" onclick="return toggleDiv(this)">
+ <img src="{@docRoot}assets/images/triangle-closed.png" class="toggle-img" height="9px" width="9px"
+/>Support Package, revision 4</a> <em>(October 2011)</em>
+ <div class="toggleme">
<dl>
<dt>Changes for v4 support library:</dt>
<dd>
@@ -253,20 +352,14 @@
</dd>
</dl>
</div>
-
-
-
</div>
-<div class="toggle-content closed">
-
- <p><a href="#" onclick="return toggleContent(this)">
- <img src="{@docRoot}assets/images/triangle-closed.png" class="toggle-content-img" />
- Compatibility Package, revision 3 (July 2011)
- </a></p>
-
- <div class="toggle-content-toggleme" style="padding-left:2em">
+<div class="toggleable closed">
+ <a href="#" onclick="return toggleDiv(this)">
+ <img src="{@docRoot}assets/images/triangle-closed.png" class="toggle-img" height="9px" width="9px"
+/>Compatibility Package, revision 3</a> <em>(July 2011)</em>
+ <div class="toggleme">
<dl>
<dt>Changes for v4 support library:</dt>
<dd>
@@ -309,18 +402,14 @@
</dd>
</dl>
</div>
-
</div>
-<div class="toggle-content closed">
-
- <p><a href="#" onclick="return toggleContent(this)">
- <img src="{@docRoot}assets/images/triangle-closed.png" class="toggle-content-img" />
- Compatibility Package, revision 2 (May 2011)
- </a></p>
-
- <div class="toggle-content-toggleme" style="padding-left:2em">
+<div class="toggleable closed">
+ <a href="#" onclick="return toggleDiv(this)">
+ <img src="{@docRoot}assets/images/triangle-closed.png" class="toggle-img" height="9px" width="9px"
+/>Compatibility Package, revision 2</a> <em>(May 2011)</em>
+ <div class="toggleme">
<dl>
<dt>Changes for v4 library:</dt>
<dd>
@@ -332,21 +421,16 @@
</dd>
</dl>
</div>
-
</div>
-<div class="toggle-content closed">
-
- <p><a href="#" onclick="return toggleContent(this)">
- <img src="{@docRoot}assets/images/triangle-closed.png" class="toggle-content-img" />
- Compatibility Package, revision 1 (March 2011)
- </a></p>
-
- <div class="toggle-content-toggleme" style="padding-left:2em">
+<div class="toggleable closed">
+ <a href="#" onclick="return toggleDiv(this)">
+ <img src="{@docRoot}assets/images/triangle-closed.png" class="toggle-img" height="9px" width="9px"
+/>Compatibility Package, revision 1</a> <em>(March 2011)</em>
+ <div class="toggleme">
<p>Initial release with the v4 library.</p>
</div>
-
</div>
diff --git a/docs/html/tools/help/gltracer.jd b/docs/html/tools/help/gltracer.jd
new file mode 100644
index 0000000..35c405e
--- /dev/null
+++ b/docs/html/tools/help/gltracer.jd
@@ -0,0 +1,103 @@
+page.title=Tracer for OpenGL ES
+@jd:body
+
+<div id="qv-wrapper">
+<div id="qv">
+ <h2>In this document</h2>
+ <ol>
+ <li><a href="running">Running Tracer</a></li>
+ <li><a href="generating">Generating a Trace</a></li>
+ <li><a href="analyzing">Analyzing a Trace</a></li>
+ </ol>
+ <h2>See also</h2>
+ <ol>
+ <li><a href="{@docRoot}tools/index.html">Tools</a></li>
+ </ol>
+</div>
+</div>
+
+<p>Tracer is a tool for analyzing OpenGL for Embedded Systems (ES) code in your Android application.
+The tool allows you to capture OpenGL ES commands and frame by frame images to help you understand
+how your graphics commands are being executed.</p>
+
+<p class="note"><strong>Note:</strong> The Tracer tool requires a device running Android 4.1 (API
+Level 16) or higher.</p>
+
+
+<h2 id="running">Running Tracer</h2>
+
+<p>Tracer can be run as part of the Eclipse Android Development Tools (ADT) plugin or as part of the
+Device Monitor tool.</p>
+
+<p>To run Tracer in Eclipse:</p>
+
+<ol>
+ <li>Start Eclipse and open a workspace that contains an Android project.</li>
+ <li>Activate the perspective for Tracer by choosing <strong>Window > Open Perspective >
+Other...</strong></li>
+ <li>Select <strong>Tracer for OpenGL ES</strong> and click <strong>OK</strong>.</li>
+</ol>
+
+<p>To run Tracer in Device Monitor:</p>
+
+<ol>
+ <li>Start the <a href="monitor.html">Device Monitor</a> tool.</li>
+ <li>Activate the perspective for Tracer by choosing <strong>Window > Open
+Perspective...</strong></li>
+ <li>Select <strong>Tracer for OpenGL ES</strong> and click <strong>OK</strong>.</li>
+</ol>
+
+<h2 id="generating">Generating a Trace</h2>
+
+<p>Tracer captures OpenGL ES command execution logs and can also capture progressive images of the
+frames generated by those commands to enable you to perform logical and visual analysis of your
+OpenGL ES code. The Tracer tool operates by connecting to a device running Android 4.1 (API Level
+16) or higher that is running the application you want to analyze. The Tracer tool captures trace
+information while the application is running and saves it to a {@code .gltrace} file for
+analysis.</p>
+
+<img src="{@docRoot}images/gltracer/dialog-trace.png">
+<p class="img-caption"><strong>Figure 1.</strong> Trace capture dialog box.</p>
+
+<p>To capture an OpenGL ES trace for an Android application:</p>
+
+<ol>
+ <li>Connect the Android device using a USB cable and make sure it is enabled for debugging. For
+more information, see <a href="{@docRoot}tools/device.html">Using Hardware Devices</a>.</li>
+ <li>In Eclipse or Device Monitor, activate the <strong>Tracer for OpenGL ES</strong>
+perspective.</li>
+ <li>On the toolbar, click the trace capture button (<img
+src="{@docRoot}images/gltracer/icon-capture.png">).</li>
+ <li>In the dialog box, select the <strong>Device</strong> to use for the trace.</li>
+ <li>In the <strong>Application Package</strong> field, enter the full application package name
+containing the activity you want to trace, for example: {@code com.example.android.opengl}</li>
+ <li>In the <strong>Activity to launch</strong> field, enter the class name of the activity you
+want to trace, for example: {@code OpenGLES20Complete}
+ <p class="note"><strong>Note:</strong> If you are tracing the default activity for the
+application, you can leave this field blank.</p>
+ </li>
+ <li>Select the desired <strong>Data Collection Options</strong>.
+ <p class="note"><strong>Note:</strong> If you want to capture progressive frame images for each
+drawing call, enable the <strong>Read back currently bound framebuffer on glDraw*()</strong> option.
+Be aware that using this option can result in large trace files.</p>
+ </li>
+ <li>Enter a <strong>Destination File</strong> for the trace output.</li>
+ <li>Click <strong>Trace</strong> to start the trace capture.</li>
+ <li>On the connected device, exercise the functions of your application you want to trace.</li>
+ <li>In the dialog box, <strong>Stop Tracing</strong> to complete the tracing run.</li>
+</ol>
+
+<h2 id="analyzing">Analyzing a Trace</h2>
+
+<p>After you have generated a trace, you can load it for review and analysis.</p>
+
+<p>To review a captured trace:</p>
+
+<ol>
+ <li>In Eclipse or Device Monitor, activate the <strong>Tracer for OpenGL ES</strong>
+perspective.</li>
+ <li>On the toolbar, click the trace load button (<img
+src="{@docRoot}images/gltracer/icon-load-trace.png">).</li>
+ <li>After loading a trace, select a frame and review the OpenGL ES calls. Drawing commands are
+highlighted in blue.</li>
+</ol>
\ No newline at end of file
diff --git a/docs/html/tools/help/monitor.jd b/docs/html/tools/help/monitor.jd
new file mode 100644
index 0000000..8e2ea36
--- /dev/null
+++ b/docs/html/tools/help/monitor.jd
@@ -0,0 +1,24 @@
+page.title=Debug Monitor
+@jd:body
+
+<p>Android Debug Monitor is a stand-alone tool that provides a graphical user interface for
+several Android application debugging and analysis tools. The Monitor tool does not
+require installation of a integrated development environment, such as Eclipse, and encapsulates the
+following tools:</p>
+
+<ul>
+ <li><a href="{@docRoot}tools/debugging/ddms.html">DDMS</a></li>
+ <li><a href="gltracer.html">Tracer for OpenGL ES</a></li>
+ <li><a href="hierarchy-viewer.html">Hierarchy Viewer</a></li>
+ <li><a href="traceview.html">Traceview</a></li>
+ <li>Pixel Perfect magnification viewer</li>
+</ul>
+
+<h2 id="usage">Usage</h2>
+
+<p>To start Debug Monitor, enter the following command from the SDK <code>tools/</code>
+directory:</p>
+ <pre>monitor</pre>
+
+<p>Start an Android emulator or connect an Android device via USB cable, and connect the Debug
+Monitor to the device by selecting it in the <strong>Devices</strong> window.</p>
diff --git a/docs/html/tools/sdk/eclipse-adt.jd b/docs/html/tools/sdk/eclipse-adt.jd
index ac200b6..ae3eb05 100644
--- a/docs/html/tools/sdk/eclipse-adt.jd
+++ b/docs/html/tools/sdk/eclipse-adt.jd
@@ -32,7 +32,8 @@
plugin and install it into your Eclipse development environment. Note that
before you can install or use ADT, you must have compatible versions of both the
Eclipse IDE and the Android SDK installed. For details, make sure to read <a
-href="#installing">Installing the ADT Plugin</a>, below. </p>
+href="{@docRoot}sdk/installing/installing-adt.html">Installing the Eclipse
+Plugin</a>. </p>
<p>If you are already using ADT, this document also provides instructions on
how to update ADT to the latest version or how to uninstall it, if necessary.
@@ -96,6 +97,128 @@
<a href="#" onclick="return toggleDiv(this)">
<img src="{@docRoot}assets/images/triangle-opened.png" class="toggle-img" height="9px"
width="9px" />
+ADT 20.0.0</a> <em>(June 2012)</em>
+ <div class="toggleme">
+<dl>
+ <dt>Dependencies:</dt>
+
+ <dd>
+ <ul>
+ <li>Java 1.6 or higher is required for ADT 20.0.0.</li>
+ <li>Eclipse Helios (Version 3.6.2) or higher is required for ADT 20.0.0.</li>
+ <li>ADT 20.0.0 is designed for use with <a href="{@docRoot}sdk/tools-notes.html">SDK Tools
+ r20</a>. If you haven't already installed SDK Tools r20 into your SDK, use the Android SDK
+ Manager to do so.</li>
+ </ul>
+ </dd>
+
+ <dt>General improvements:</dt>
+ <dd>
+ <ul>
+ <li>Application Templates
+ <ul>
+ <li>Added Android application templates to allow developers to create specific types of
+applications faster, using Android-recommended best practices.</li>
+ </ul>
+ </li>
+ <li>Performance
+ <ul>
+ <li>Improved overall ADT performance and fixed memory issues. Loading SDK data
+should be up to 30% faster.</li>
+ </ul>
+ </li>
+ <li>Tracer for GLES
+ <ul>
+ <li>Added new perspective view and tools for tracing OpenGL calls for an application and
+track the visual results of each call. (<a href="{@docRoot}tools/gltracer.html">more info</a>)</li>
+ </ul>
+ </li>
+ <li>Lint
+ <ul>
+ <li>Added new Lint rules for manifest registrations, duplicate activity
+registrations, security checking, correct use of Toast, missing SharedPreferences commit()
+calls, Fragment class instantiation, and handler leaks.</li>
+ <li>Created tighter integration of lint with the layout editor. (<a
+href="http://tools.android.com/recent/lintfeedback">more info</a>)</li>
+ <li>Added execution of Lint tool on save option for Java files. (<a
+href="http://tools.android.com/recent/lintonsave">more info</a>)</li>
+ </ul>
+ </li>
+ <li>Layout Editor (<a href="http://tools.android.com/recent/newlayouteditorpropertysheet">more
+info</a>)
+ <ul>
+ <li>Added highlighting (in bold) for important attributes, inline preview of colors and
+images, including the corresponding resource name.</li>
+ <li>Added display of default values, when available.</li>
+ <li>Added completion of resource values and enum and flag constants.</li>
+ <li>Added support for displaying advanced properties, and nested properties for better
+categorization, for example, layout params are listed first as a single nested property.</li>
+ <li>Display Tooltips over the attribute names, not values, so they never obscure the value
+column.</li>
+ <li>Provided checkbox support for boolean values.</li>
+ <li>Added support for switching between alphabetical and natural sort orders.</li>
+ <li>Improved layout editor tool's window management for more usable editing views.</li>
+ <li>Improved the layout editor's configuration chooser header user interface.</li>
+ </ul>
+ </li>
+ <li>XML Editing
+ <ul>
+ <li>Added go to declaration support for theme references (?android:attr, ?attr:).</li>
+ <li>Improved code completion in style definitions.</li>
+ <li>Improved code completion for the {@code minSdkVersion} and {@code targetSdkVersion}
+attributes in manifest files so that version descriptions are displayed for each of the API
+levels</li>
+ <li>Provided support for code completion of custom attributes for custom views,
+including current edits to the style files.</li>
+ <li>Improved synchronization of text and graphic editors with the XML outline view,
+including outline changes and display of current selection.</li>
+ </ul>
+ </li>
+ <li>Build System
+ <ul>
+ <li>Added automatic merging of library project manifest files into the including
+project's manifest. Enable this feature with the {@code manifestmerger.enabled} property.</li>
+ <li>Added automatic ProGuard support for the {@code aapt -G} flag. This change causes
+the build system to generate a temporary ProGuard keep-rules file containing classes that
+are referenced from XML files (such as custom views) and pass this to ProGuard at shrink-time. This
+can make the resulting APK much smaller when using just a small portion of a large library project
+(such as the Android Support library), since the catch-all rules to keep all custom views from the
+default ProGuard configuration file have also been removed.</li>
+ </ul>
+ </li>
+ <li>Added support building and debugging NDK-based Android projects.</li>
+ </li>
+ <li>Added support to the Asset Studio Wizard for padding and turning off background
+shapes.</li>
+ <li>Improved LogCat to allow developers to set colors for different priorities.</li>
+ <li>Improved app Run functionality to allow running on multiple devices with a single launch.
+The target tab in the launch configuration dialog includes an option to allow launching on all
+connected devices, with the option to further narrow the list to just physical devices or just
+emulators. (This feature is available only for Run configurations, and not for Debug or JUnit
+tests.)</li>
+ <ul>
+ </dd>
+
+ <dt>Bug fixes:</dt>
+ <dd>
+ <ul>
+ <li>Fixed a number of issues where Lint incorrectly reported code errors or failed to
+flag code issues.</li>
+ <li>Fixed several bugs in the layout editor.</li>
+ <li>Fixed compatibility issues with Eclipse 4.x (Juno), including cut/copy/paste
+functions.</li>
+ </ul>
+ </dd>
+
+</dl>
+
+</div>
+</div>
+
+<div class="toggleable closed">
+ <a href="#" onclick="return toggleDiv(this)">
+ <img src="{@docRoot}assets/images/triangle-closed.png" class="toggle-img" height="9px"
+width="9px" />
ADT 18.0.0</a> <em>(April 2012)</em>
<div class="toggleme">
<dl>
diff --git a/docs/html/tools/sdk/tools-notes.jd b/docs/html/tools/sdk/tools-notes.jd
index f08209b..5d9bb49 100644
--- a/docs/html/tools/sdk/tools-notes.jd
+++ b/docs/html/tools/sdk/tools-notes.jd
@@ -66,6 +66,81 @@
<a href="#" onclick="return toggleDiv(this)">
<img src="{@docRoot}assets/images/triangle-opened.png" class="toggle-img" height="9px"
width="9px" />
+ SDK Tools, Revision 20</a> <em>(June 2012)</em>
+
+ <div class="toggleme">
+ <dl>
+ <dt>Dependencies:</dt>
+ <dd>
+ <ul>
+ <li>Android SDK Platform-tools revision 12 or later.</li>
+ <li>If you are developing in Eclipse with ADT, note that the SDK Tools r20 is designed for
+ use with ADT 20.0.0 and later. If you haven't already, we highly recommend updating your
+ <a href="{@docRoot}tools/sdk/eclipse-adt.html">ADT Plugin</a> to 20.0.0.</li>
+ <li>If you are developing outside Eclipse, you must have
+ <a href="http://ant.apache.org/">Apache Ant</a> 1.8 or later.</li>
+ </ul>
+ </dd>
+ <dt>General notes:</dt>
+ <dd>
+ <ul>
+ <li>Added new Device Monitor application, grouping Android debugging tools into a
+single application, including ddms, traceview, hierarchyviewer and Tracer for GLES. (<a
+href="{@docRoot}tools/gltracer.html">more info</a>)</li>
+ <li>Added new System Trace new tool for tracing Android system activity. This tool allow you
+to capture a slice of system activity, plus additional information tagged from the <strong>Settings
+> Developer Options > Monitoring: Enable traces</strong> or with specific calls added to your
+application code. (<a href="{@docRoot}tools/systrace.html">more info</a>)</li>
+ </li>
+ <li>Build System
+ <ul>
+ <li>Added automatic merging of library project manifest files into the including
+project's manifest. Enable this feature with the {@code manifestmerger.enabled} property.</li>
+ <li>Added automatic ProGuard support for the {@code aapt -G} flag. This change causes
+the build system to generate a temporary ProGuard keep-rules file containing classes that
+are referenced from XML files (such as custom views) and pass this to ProGuard at shrink-time. This
+can make the resulting APK much smaller when using just a small portion of a large library project
+(such as the Android Support library), since the catch-all rules to keep all custom views from the
+default ProGuard configuration file have also been removed.</li>
+ <li>Added two ProGuard configuration files for use in projects: {@code
+proguard-android-optimize.txt} which enables optimizations and {@code proguard-android.txt} which
+disables them.</li>
+ </ul>
+ </li>
+ <li>SDK Manager
+ <ul>
+ <li>Improved caching to reduce downloading of repository definitions.</li>
+ <li>Added <strong>Tools > Manage Add-on Sites</strong> option to allow deactivation of
+ third-party sites for improved performance (e.g., if one or more sites are temporarily slow to
+ load.)</li>
+ <li>Added settings for the SDK Manager download cache (<strong>SDK Manager > Tools >
+Options</strong>).</li>
+ </ul>
+ </li>
+ </ul>
+ </dd>
+ <dt>Bug fixes:</dt>
+ <dd>
+ <ul>
+ <li>Build
+ <ul>
+ <li>Fixed problem where test projects did not have access to the full classpath of tested
+projects, including Library Projects and third-party jars.</li>
+ <li>Fixed deployment logic so that applications with embedded tests can now be deployed
+and tested like test applications, including code coverage information.</li>
+ <li>Fixed Ant support for testing projects with libraries.</li>
+ </ul>
+ </li>
+ </ul>
+ </dd>
+ </dl>
+ </div>
+</div>
+
+<div class="toggleable closed">
+ <a href="#" onclick="return toggleDiv(this)">
+ <img src="{@docRoot}assets/images/triangle-closed.png" class="toggle-img" height="9px"
+ width="9px" />
SDK Tools, Revision 19</a> <em>(April 2012)</em>
<div class="toggleme">
diff --git a/docs/html/tools/tools_toc.cs b/docs/html/tools/tools_toc.cs
index 5136377..c7cdded 100644
--- a/docs/html/tools/tools_toc.cs
+++ b/docs/html/tools/tools_toc.cs
@@ -130,6 +130,7 @@
<li><a href="<?cs var:toroot ?>tools/help/adt.html">ADT</a></li>
<li><a href="<?cs var:toroot ?>tools/help/android.html">android</a></li>
<li><a href="<?cs var:toroot ?>tools/help/bmgr.html">bmgr</a>
+ <li><a href="<?cs var:toroot ?>tools/help/monitor.html">Device Monitor</a></li>
<li><a href="<?cs var:toroot ?>tools/help/dmtracedump.html">dmtracedump</a></li>
<li><a href="<?cs var:toroot ?>tools/help/draw9patch.html">Draw 9-Patch</a></li>
<li><a href="<?cs var:toroot ?>tools/help/emulator.html">Emulator</a></li>
@@ -153,6 +154,7 @@
</ul>
</li>
<li><a href="<?cs var:toroot ?>tools/help/proguard.html">ProGuard</a></li>
+ <li><a href="<?cs var:toroot ?>tools/help/gltracer.html">Tracer for OpenGL ES</a></li>
<li><a href="<?cs var:toroot ?>tools/help/traceview.html">Traceview</a></li>
<li><a href="<?cs var:toroot ?>tools/help/zipalign.html">zipalign</a></li>
</ul>
@@ -190,12 +192,30 @@
</li>
-
<li class="nav-section">
<div class="nav-section-header empty"><a href="<?cs var:toroot
?>tools/samples/index.html"><span class="en">Samples</span></a></div>
</li>
+
+ <li class="nav-section">
+ <div class="nav-section-header">
+ <a href="<?cs var:toroot ?>tools/adk/index.html">
+ <span class="en">ADK</span></a>
+ </div>
+ <ul>
+ <li><a href="<?cs var:toroot ?>tools/adk/adk2.html">ADK 2012 Guide</a></li>
+ <li><a href="<?cs var:toroot ?>tools/adk/adk.html">ADK 2011 Guide</a></li>
+ <li class="nav-section">
+ <div class="nav-section-header">
+ <a href="<?cs var:toroot ?>tools/adk/aoa.html">Android Open Accessory Protocol</a>
+ </div>
+ <ul>
+ <li><a href="<?cs var:toroot ?>tools/adk/aoa2.html">AOA 2.0</a></li>
+ </ul>
+ </li>
+ </ul>
+ </li>
</ul><!-- nav -->
diff --git a/media/java/android/mtp/MtpDatabase.java b/media/java/android/mtp/MtpDatabase.java
index c365e4c..7532d79 100755
--- a/media/java/android/mtp/MtpDatabase.java
+++ b/media/java/android/mtp/MtpDatabase.java
@@ -933,10 +933,10 @@
// recursive case - delete all children first
Uri uri = Files.getMtpObjectsUri(mVolumeName);
int count = mMediaProvider.delete(uri,
- // the 'like' makes it use the index, the 'lower()' makes it correct
- // when the path contains sqlite wildcard characters
- "_data LIKE ? AND lower(substr(_data,?))=lower(?)",
- new String[] { path + "/%", "" + path.length() + 1, path + "/"});
+ // the 'like' makes it use the index, the 'lower()' makes it correct
+ // when the path contains sqlite wildcard characters
+ "_data LIKE ?1 AND lower(substr(_data,1,?2))=lower(?3)",
+ new String[] { path + "/%",Integer.toString(path.length() + 1), path + "/"});
}
Uri uri = Files.getMtpObjectsUri(mVolumeName, handle);
diff --git a/services/java/com/android/server/PowerManagerService.java b/services/java/com/android/server/PowerManagerService.java
index 01bb2bc..c32f1da 100644
--- a/services/java/com/android/server/PowerManagerService.java
+++ b/services/java/com/android/server/PowerManagerService.java
@@ -1040,7 +1040,7 @@
mWakeLockState = mLocks.gatherState();
// goes in the middle to reduce flicker
if ((wl.flags & PowerManager.ON_AFTER_RELEASE) != 0) {
- userActivity(SystemClock.uptimeMillis(), -1, false, OTHER_EVENT, false);
+ userActivity(SystemClock.uptimeMillis(), -1, false, OTHER_EVENT, false, true);
}
setPowerState(mWakeLockState | mUserState);
}
@@ -2489,7 +2489,7 @@
public void userActivityWithForce(long time, boolean noChangeLights, boolean force) {
mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null);
- userActivity(time, -1, noChangeLights, OTHER_EVENT, force);
+ userActivity(time, -1, noChangeLights, OTHER_EVENT, force, false);
}
public void userActivity(long time, boolean noChangeLights) {
@@ -2502,15 +2502,15 @@
return;
}
- userActivity(time, -1, noChangeLights, OTHER_EVENT, false);
+ userActivity(time, -1, noChangeLights, OTHER_EVENT, false, false);
}
public void userActivity(long time, boolean noChangeLights, int eventType) {
- userActivity(time, -1, noChangeLights, eventType, false);
+ userActivity(time, -1, noChangeLights, eventType, false, false);
}
public void userActivity(long time, boolean noChangeLights, int eventType, boolean force) {
- userActivity(time, -1, noChangeLights, eventType, force);
+ userActivity(time, -1, noChangeLights, eventType, force, false);
}
/*
@@ -2520,11 +2520,11 @@
public void clearUserActivityTimeout(long now, long timeout) {
mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null);
Slog.i(TAG, "clearUserActivity for " + timeout + "ms from now");
- userActivity(now, timeout, false, OTHER_EVENT, false);
+ userActivity(now, timeout, false, OTHER_EVENT, false, false);
}
private void userActivity(long time, long timeoutOverride, boolean noChangeLights,
- int eventType, boolean force) {
+ int eventType, boolean force, boolean ignoreIfScreenOff) {
if (((mPokey & POKE_LOCK_IGNORE_TOUCH_EVENTS) != 0) && (eventType == TOUCH_EVENT)) {
if (false) {
@@ -2548,6 +2548,11 @@
Slog.d(TAG, "ignoring user activity while turning off screen");
return;
}
+ // ignore if the caller doesn't want this to allow the screen to turn
+ // on, and the screen is currently off.
+ if (ignoreIfScreenOff && (mPowerState & SCREEN_ON_BIT) == 0) {
+ return;
+ }
// Disable proximity sensor if if user presses power key while we are in the
// "waiting for proximity sensor to go negative" state.
if (mProximitySensorActive && mProximityWakeLockCount == 0) {