From 76c6d86b5e05cc617a376f970444c737950c1556 Mon Sep 17 00:00:00 2001 From: Katie McCormick Date: Mon, 25 Jun 2012 09:56:29 -0700 Subject: [PATCH] Doc update: Adding new GCM docs. Change-Id: I98dcbad644e416538f6dcad64a063809f8662e24 --- docs/html/guide/google/gcm/adv.jd | 255 +++++ docs/html/guide/google/gcm/c2dm.jd | 107 ++ .../gcm/client-javadoc/allclasses-frame.html | 37 + .../client-javadoc/allclasses-noframe.html | 37 + .../android/gcm/GCMBaseIntentService.html | 446 +++++++++ .../android/gcm/GCMBroadcastReceiver.html | 282 ++++++ .../com/google/android/gcm/GCMConstants.html | 652 ++++++++++++ .../com/google/android/gcm/GCMRegistrar.html | 445 +++++++++ .../com/google/android/gcm/package-frame.html | 38 + .../google/android/gcm/package-summary.html | 167 ++++ .../com/google/android/gcm/package-tree.html | 150 +++ .../gcm/client-javadoc/constant-values.html | 308 ++++++ .../gcm/client-javadoc/deprecated-list.html | 142 +++ .../google/gcm/client-javadoc/help-doc.html | 209 ++++ .../google/gcm/client-javadoc/index-all.html | 331 ++++++ .../google/gcm/client-javadoc/index.html | 38 + .../gcm/client-javadoc/overview-tree.html | 152 +++ .../google/gcm/client-javadoc/package-list | 1 + .../gcm/client-javadoc/resources/inherit.gif | Bin 0 -> 57 bytes .../google/gcm/client-javadoc/stylesheet.css | 29 + docs/html/guide/google/gcm/demo.jd | 259 +++++ docs/html/guide/google/gcm/gcm.jd | 943 ++++++++++++++++++ docs/html/guide/google/gcm/gs.jd | 203 ++++ docs/html/guide/google/gcm/index.jd | 25 + .../gcm/server-javadoc/allclasses-frame.html | 43 + .../server-javadoc/allclasses-noframe.html | 43 + .../google/android/gcm/server/Constants.html | 764 ++++++++++++++ .../gcm/server/InvalidRequestException.html | 310 ++++++ .../android/gcm/server/Message.Builder.html | 337 +++++++ .../google/android/gcm/server/Message.html | 369 +++++++ .../android/gcm/server/MulticastResult.html | 397 ++++++++ .../com/google/android/gcm/server/Result.html | 322 ++++++ .../com/google/android/gcm/server/Sender.html | 662 ++++++++++++ .../android/gcm/server/package-frame.html | 53 + .../android/gcm/server/package-summary.html | 187 ++++ .../android/gcm/server/package-tree.html | 156 +++ .../gcm/server-javadoc/constant-values.html | 356 +++++++ .../gcm/server-javadoc/deprecated-list.html | 142 +++ .../google/gcm/server-javadoc/help-doc.html | 209 ++++ .../google/gcm/server-javadoc/index-all.html | 431 ++++++++ .../google/gcm/server-javadoc/index.html | 36 + .../gcm/server-javadoc/overview-tree.html | 158 +++ .../google/gcm/server-javadoc/package-list | 1 + .../gcm/server-javadoc/resources/inherit.gif | Bin 0 -> 57 bytes .../gcm/server-javadoc/serialized-form.html | 355 +++++++ .../google/gcm/server-javadoc/stylesheet.css | 29 + docs/html/guide/guide_toc.cs | 23 + docs/html/images/gcm/gcm-api-access.png | Bin 0 -> 38437 bytes docs/html/images/gcm/gcm-api-key.png | Bin 0 -> 46683 bytes docs/html/images/gcm/gcm-avd-first-msg.png | Bin 0 -> 20015 bytes .../html/images/gcm/gcm-avd-home-auto-reg.png | Bin 0 -> 17305 bytes .../html/images/gcm/gcm-config-server-key.png | Bin 0 -> 39481 bytes docs/html/images/gcm/gcm-create-api-proj.png | Bin 0 -> 27490 bytes .../gcm/gcm-demo-homepage-appengine.png | Bin 0 -> 17736 bytes docs/html/images/gcm/gcm-demo-homepage.png | Bin 0 -> 18356 bytes docs/html/images/gcm/gcm-device-reg.png | Bin 0 -> 19975 bytes docs/html/images/gcm/gcm-logo.png | Bin 0 -> 44085 bytes docs/html/images/gcm/gcm-sent-server.png | Bin 0 -> 26134 bytes 58 files changed, 10639 insertions(+) create mode 100644 docs/html/guide/google/gcm/adv.jd create mode 100644 docs/html/guide/google/gcm/c2dm.jd create mode 100644 docs/html/guide/google/gcm/client-javadoc/allclasses-frame.html create mode 100644 docs/html/guide/google/gcm/client-javadoc/allclasses-noframe.html create mode 100644 docs/html/guide/google/gcm/client-javadoc/com/google/android/gcm/GCMBaseIntentService.html create mode 100644 docs/html/guide/google/gcm/client-javadoc/com/google/android/gcm/GCMBroadcastReceiver.html create mode 100644 docs/html/guide/google/gcm/client-javadoc/com/google/android/gcm/GCMConstants.html create mode 100644 docs/html/guide/google/gcm/client-javadoc/com/google/android/gcm/GCMRegistrar.html create mode 100644 docs/html/guide/google/gcm/client-javadoc/com/google/android/gcm/package-frame.html create mode 100644 docs/html/guide/google/gcm/client-javadoc/com/google/android/gcm/package-summary.html create mode 100644 docs/html/guide/google/gcm/client-javadoc/com/google/android/gcm/package-tree.html create mode 100644 docs/html/guide/google/gcm/client-javadoc/constant-values.html create mode 100644 docs/html/guide/google/gcm/client-javadoc/deprecated-list.html create mode 100644 docs/html/guide/google/gcm/client-javadoc/help-doc.html create mode 100644 docs/html/guide/google/gcm/client-javadoc/index-all.html create mode 100644 docs/html/guide/google/gcm/client-javadoc/index.html create mode 100644 docs/html/guide/google/gcm/client-javadoc/overview-tree.html create mode 100644 docs/html/guide/google/gcm/client-javadoc/package-list create mode 100644 docs/html/guide/google/gcm/client-javadoc/resources/inherit.gif create mode 100644 docs/html/guide/google/gcm/client-javadoc/stylesheet.css create mode 100644 docs/html/guide/google/gcm/demo.jd create mode 100644 docs/html/guide/google/gcm/gcm.jd create mode 100644 docs/html/guide/google/gcm/gs.jd create mode 100644 docs/html/guide/google/gcm/index.jd create mode 100644 docs/html/guide/google/gcm/server-javadoc/allclasses-frame.html create mode 100644 docs/html/guide/google/gcm/server-javadoc/allclasses-noframe.html create mode 100644 docs/html/guide/google/gcm/server-javadoc/com/google/android/gcm/server/Constants.html create mode 100644 docs/html/guide/google/gcm/server-javadoc/com/google/android/gcm/server/InvalidRequestException.html create mode 100644 docs/html/guide/google/gcm/server-javadoc/com/google/android/gcm/server/Message.Builder.html create mode 100644 docs/html/guide/google/gcm/server-javadoc/com/google/android/gcm/server/Message.html create mode 100644 docs/html/guide/google/gcm/server-javadoc/com/google/android/gcm/server/MulticastResult.html create mode 100644 docs/html/guide/google/gcm/server-javadoc/com/google/android/gcm/server/Result.html create mode 100644 docs/html/guide/google/gcm/server-javadoc/com/google/android/gcm/server/Sender.html create mode 100644 docs/html/guide/google/gcm/server-javadoc/com/google/android/gcm/server/package-frame.html create mode 100644 docs/html/guide/google/gcm/server-javadoc/com/google/android/gcm/server/package-summary.html create mode 100644 docs/html/guide/google/gcm/server-javadoc/com/google/android/gcm/server/package-tree.html create mode 100644 docs/html/guide/google/gcm/server-javadoc/constant-values.html create mode 100644 docs/html/guide/google/gcm/server-javadoc/deprecated-list.html create mode 100644 docs/html/guide/google/gcm/server-javadoc/help-doc.html create mode 100644 docs/html/guide/google/gcm/server-javadoc/index-all.html create mode 100644 docs/html/guide/google/gcm/server-javadoc/index.html create mode 100644 docs/html/guide/google/gcm/server-javadoc/overview-tree.html create mode 100644 docs/html/guide/google/gcm/server-javadoc/package-list create mode 100644 docs/html/guide/google/gcm/server-javadoc/resources/inherit.gif create mode 100644 docs/html/guide/google/gcm/server-javadoc/serialized-form.html create mode 100644 docs/html/guide/google/gcm/server-javadoc/stylesheet.css create mode 100644 docs/html/images/gcm/gcm-api-access.png create mode 100644 docs/html/images/gcm/gcm-api-key.png create mode 100644 docs/html/images/gcm/gcm-avd-first-msg.png create mode 100644 docs/html/images/gcm/gcm-avd-home-auto-reg.png create mode 100644 docs/html/images/gcm/gcm-config-server-key.png create mode 100644 docs/html/images/gcm/gcm-create-api-proj.png create mode 100644 docs/html/images/gcm/gcm-demo-homepage-appengine.png create mode 100644 docs/html/images/gcm/gcm-demo-homepage.png create mode 100644 docs/html/images/gcm/gcm-device-reg.png create mode 100644 docs/html/images/gcm/gcm-logo.png create mode 100644 docs/html/images/gcm/gcm-sent-server.png diff --git a/docs/html/guide/google/gcm/adv.jd b/docs/html/guide/google/gcm/adv.jd new file mode 100644 index 0000000000000..aec8ca48736c6 --- /dev/null +++ b/docs/html/guide/google/gcm/adv.jd @@ -0,0 +1,255 @@ +page.title=GCM Advanced Topics +@jd:body + +
+ +
+

This document covers advanced topics for GCM.

+ + + + +

Lifetime of a Message

+

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.

+

In the best-case scenario, if the device is connected to GCM, the screen is on, and there are no throttling restrictions (see Throttling), the message will be delivered right away.

+

If the device is connected but idle, the message will still be +delivered right away unless the delay_while_idle flag is set to true. Otherwise, it will be stored in the GCM servers until the device is awake. And that's where the collapse_key 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.

+ +

Note: 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.

+ +

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 delay_while_idle 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 time_to_live flag is set.

+ +

Note: When you set the time_to_live flag, you must also set collapse_key. Otherwise the message will be rejected as a bad request.

+

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 NotRegistered error. See How Unregistration Works for more information.

+

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.

+ +

Throttling

+

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 collapse +key 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.

+ +

Keeping the Registration State in Sync

+

Whenever the application receives a com.google.android.c2dm.intent.REGISTRATION intent with a registration_id 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.

+

There are also two other scenarios that require special care:

+ +

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.

+ +

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).

+

Canonical IDs

+

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.

+

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.

+

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 registration_id 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.

+ +

Automatic Retry Using Exponential Back-Off

+ +

When the application receives a com.google.android.c2dm.intent.REGISTRATION intent with the error extra set as SERVICE_NOT_AVAILABLE, it should retry the failed operation (register or unregister).

+

In the simplest case, if your application just calls register 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 MyIntentService example used above:

+
    +
  1. Create a random token to verify the origin of the retry intent: + +
    private static final String TOKEN =
    +        Long.toBinaryString(new Random().nextLong());
    +
    + +
  2. Change the handleRegistration() method so it creates the pending intent when appropriate:
  3. + +
    ...
    +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);
    +}
    +...
    +

    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.

    + +
  4. Change the onHandleIntent() method adding an else if case for the retry intent:
  5. + +
    ...
    +} 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
    +    }
    +}
    +...
    + +
  6. Create a new instance of MyReceiver in your activity:
  7. + +
    private final MyBroadcastReceiver mRetryReceiver = new MyBroadcastReceiver();
    +
    + +
  8. In the activity's onCreate() method, register the new instance to receive the com.example.gcm.intent.RETRY intent: +
    ...
    +IntentFilter filter = new IntentFilter("com.example.gcm.intent.RETRY");
    +filter.addCategory(getPackageName());
    +registerReceiver(mRetryReceiver, filter);
    +...
    + +

    Note: You must dynamically create a new instance of the broadcast receiver since the one defined by the manifest can only receive intents with the com.google.android.c2dm.permission.SEND permission. The permission com.google.android.c2dm.permission.SEND is a system permission and as such it cannot be granted to a regular application.

    + +
  9. + +
  10. In the activity's onDestroy() method, unregister the broadcast receiver:
  11. + +
    unregisterReceiver(mRetryReceiver);
    +
+

How Unregistration Works

+

There are two ways to unregister a device from GCM: manually and automatically.

+

An Android application can manually unregister itself by issuing a com.google.android.c2dm.intent.UNREGISTER intent, which is useful when the application offers a logoff feature (so it can unregister on logoff and register again on logon). See the Architectural Overview for more discussion of this topic. This is the sequence of events when an application unregisters itself:

+
    +
  1. The application issues a com.google.android.c2dm.intent.UNREGISTER intent, passing the registration ID (the application should have saved its registration ID when it received the proper com.google.android.c2dm.intent.REGISTRATION intent).
  2. +
  3. When the GCM server is done with the unregistration, it sends a com.google.android.c2dm.intent.REGISTRATION intent with the unregistered extra set.
  4. +
  5. The application then must contact the 3rd-party server so it can remove the registration ID.
  6. +
  7. The application should also clear its registration ID. +
  8. +
+

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:

+
    +
  1. The end user uninstalls the application.
  2. +
  3. The 3rd-party server sends a message to GCM server.
  4. +
  5. The GCM server sends the message to the device.
  6. +
  7. The GCM client receives the message and queries Package Manager, which returns a "package not found" error.
  8. +
  9. The GCM client informs the GCM server that the application was uninstalled.
  10. +
  11. The GCM server marks the registration ID for deletion.
  12. +
  13. The 3rd-party server sends a message to GCM.
  14. +
  15. The GCM returns a NotRegistered error message to the 3rd-party server.
  16. +
  17. The 3rd-party deletes the registration ID. +
  18. +
+

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 NotRegistered error, without any further action being required from the 3rd-party server (this scenario happens frequently while an application is being developed and tested).

+ +

Send-to-Sync vs. Messages with Payload

+

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).

+

Send-to-sync messages

+

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 collapse_key parameter. A collapse key 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

+

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.

+

Messages with payload

+

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:

+ +
{
+  "registration_id" : "APA91bHun4MxP5egoKMwt2KZFBaFUH-1RYqx...",
+  "data" : {
+    "Nick" : "Mario",
+    "Text" : "great match!",
+    "Room" : "PortugalVSDenmark",
+  },
+}
+ +

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 collapse_key parameter. Thus GCM will send each message individually. Note that the order of delivery is not guaranteed.

+

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 com.google.android.c2dm.intent.RECEIVE intent, with the following extras:

+ +

The application should respond by syncing with the server to recover the discarded messages.

+

Note: 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. + +

+

Setting an Expiration Date for a Message

+

The Time to Live (TTL) feature lets the sender specify the maximum lifespan of a message using the time_to_live 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.

+

Here are some possible uses for this feature:

+ +

Background

+

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 delay_while_idle flag. Finally, GCM might intentionally delay messages to prevent an application from consuming excessive resources and negatively impacting battery life.

+

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.

+

Another advantage of specifying the expiration date for a message is that GCM will never throttle messages with a time_to_live 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 time_to_live 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.

+

Here is an example of a JSON-formatted request that includes TTL:

+
+{
+  "collapse_key" : "demo",
+  "delay_while_idle" : true,
+  "registration_ids" : ["xyz"],
+  "data" : {
+    "key1" : "value1",
+    "key2" : "value2",
+  },
+  "time_to_live" : 3
+},
+
+ + +

Receiving Messages from Multiple Senders

+

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.

+

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.

+

This code snippet illustrates this feature. Senders are passed as an intent extra in a comma-separated list:

+
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);
+ 
+ +

Note that there is limit of 100 multiple senders.

+ diff --git a/docs/html/guide/google/gcm/c2dm.jd b/docs/html/guide/google/gcm/c2dm.jd new file mode 100644 index 0000000000000..fd1bb0c5a6dff --- /dev/null +++ b/docs/html/guide/google/gcm/c2dm.jd @@ -0,0 +1,107 @@ +page.title=Migration +@jd:body + +
+
+ +

Quickview

+ +
    +
  • Understand the differences between GCM and C2DM.
  • +
  • Learn how to migrate an app from C2DM to GCM.
  • + +
+ + +

In this document

+ +
    +
  1. Historical Overview
  2. +
  3. How is GCM Different from C2DM?
  4. +
  5. Migrating Your Apps +
      +
    1. Client changes
    2. +
    3. Server changes
    4. +
    +
  6. +
+ +
+
+ +

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. C2DM developers are strongly encouraged to move to Google Cloud Messaging (GCM). GCM is the next generation of C2DM.

+

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.

+ + +

Historical Overview

+

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.

+

GCM replaces C2DM. The focus of GCM is as follows:

+ +

How is GCM Different from C2DM?

+

GCM builds on the core foundation of C2DM. Here is what's different:

+ +
+
Simple API Key
+
To use the GCM service, you need to obtain a Simple API Key from Google APIs console page. For more information, see Getting Started. Note that GCM only accepts Simple API Key—using ClientLogin or OAuth2 tokens will not work. +
+
Sender ID
+
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 Getting Started.
+ +
JSON format
+
GCM HTTP requests support JSON format in addition to plain text. For more information, see the Architectural Overview.
+ +
Multicast messages
+
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 Architectural Overview.
+ +
Multiple senders
+
Multiple parties can send messages to the same app with one common registration ID. For more information, see Advanced Topics.
+ +
Time-to-live messages
+
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 Advanced Topics.
+ +
Messages with payload
+
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 collapse_key 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 Advanced Topics.
+ +
Canonical registration ID
+
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 Advanced Topics.
+
+

GCM also provides helper libraries (client and server) to make writing your code easier.

+

Migrating Your Apps

+

This section describes how to move existing C2DM apps to GCM.

+

Client changes

+

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:

+
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);
+

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.

+

Server changes

+

When the application server receives a GCM registration ID, it should store it and mark it as such.

+

Sending messages to GCM devices requires a few changes:

+ +

For example: +

+
Content-Type:application/json
+Authorization:key=AIzaSyB-1uEai2WiUapxCs2Q0GZYzPu7Udno5aA
+
+{
+  "registration_id" : "APA91bHun4MxP5egoKMwt2KZFBaFUH-1RYqx...",
+  "data" : {
+    "Team" : "Portugal",
+    "Score" : "3",
+    "Player" : "Varela",
+  },
+}
+

For a detailed discussion of this topic and more examples, see the Architectural Overview.

+

Eventually, once enough users of your application have migrated to the new service, you might want to take advantage of the new JSON-formatted requests that give access to the full set of features provided by GCM.

+ 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 0000000000000..4788142af7689 --- /dev/null +++ b/docs/html/guide/google/gcm/client-javadoc/allclasses-frame.html @@ -0,0 +1,37 @@ + + + + + + +All Classes + + + + + + + + + + + +All Classes +
+ + + + + +
GCMBaseIntentService +
+GCMBroadcastReceiver +
+GCMConstants +
+GCMRegistrar +
+
+ + + 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 0000000000000..cf3b68c157039 --- /dev/null +++ b/docs/html/guide/google/gcm/client-javadoc/allclasses-noframe.html @@ -0,0 +1,37 @@ + + + + + + +All Classes + + + + + + + + + + + +All Classes +
+ + + + + +
GCMBaseIntentService +
+GCMBroadcastReceiver +
+GCMConstants +
+GCMRegistrar +
+
+ + + 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 0000000000000..0b2cfad71a84e --- /dev/null +++ b/docs/html/guide/google/gcm/client-javadoc/com/google/android/gcm/GCMBaseIntentService.html @@ -0,0 +1,446 @@ + + + + + + +GCMBaseIntentService + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +com.google.android.gcm +
+Class GCMBaseIntentService

+
+java.lang.Object
+  extended by IntentService
+      extended by com.google.android.gcm.GCMBaseIntentService
+
+
+
+
public abstract class GCMBaseIntentService
extends IntentService
+ + +

+Skeleton for application-specific IntentServices responsible for + handling communication from Google Cloud Messaging service. +

+ 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. +

+ +

+


+ +

+ + + + + + + + + + + +
+Field Summary
+static java.lang.StringTAG + +
+           
+  + + + + + + + + + + + +
+Constructor Summary
+protected GCMBaseIntentService(java.lang.String senderId) + +
+          Subclasses must create a public no-arg constructor and pass the + sender id to be used for registration.
+  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Method Summary
+protected  voidonDeletedMessages(Context context, + int total) + +
+          Called when the GCM server tells pending messages have been deleted + because the device was idle.
+protected abstract  voidonError(Context context, + java.lang.String errorId) + +
+          Called on registration or unregistration error.
+ voidonHandleIntent(Intent intent) + +
+           
+protected abstract  voidonMessage(Context context, + Intent intent) + +
+          Called when a cloud message has been received.
+protected  booleanonRecoverableError(Context context, + java.lang.String errorId) + +
+          Called on a registration error that could be retried.
+protected abstract  voidonRegistered(Context context, + java.lang.String registrationId) + +
+          Called after a device has been registered.
+protected abstract  voidonUnregistered(Context context, + java.lang.String registrationId) + +
+          Called after a device has been unregistered.
+  + + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+  +

+ + + + + + + + +
+Field Detail
+ +

+TAG

+
+public static final java.lang.String TAG
+
+
+
See Also:
Constant Field Values
+
+ + + + + + + + +
+Constructor Detail
+ +

+GCMBaseIntentService

+
+protected GCMBaseIntentService(java.lang.String senderId)
+
+
Subclasses must create a public no-arg constructor and pass the + sender id to be used for registration. +

+

+ + + + + + + + +
+Method Detail
+ +

+onMessage

+
+protected abstract void onMessage(Context context,
+                                  Intent intent)
+
+
Called when a cloud message has been received. +

+

+
Parameters:
context - application's context.
intent - intent containing the message payload as extras.
+
+
+
+ +

+onDeletedMessages

+
+protected void onDeletedMessages(Context context,
+                                 int total)
+
+
Called when the GCM server tells pending messages have been deleted + because the device was idle. +

+

+
Parameters:
context - application's context.
total - total number of collapsed messages
+
+
+
+ +

+onRecoverableError

+
+protected boolean onRecoverableError(Context context,
+                                     java.lang.String errorId)
+
+
Called on a registration error that could be retried. + +

By default, it does nothing and returns true, but could be + overridden to change that behavior and/or display the error. +

+

+
Parameters:
context - application's context.
errorId - error id returned by the GCM service. +
Returns:
if true, failed operation will be retried (using + exponential backoff).
+
+
+
+ +

+onError

+
+protected abstract void onError(Context context,
+                                java.lang.String errorId)
+
+
Called on registration or unregistration error. +

+

+
Parameters:
context - application's context.
errorId - error id returned by the GCM service.
+
+
+
+ +

+onRegistered

+
+protected abstract void onRegistered(Context context,
+                                     java.lang.String registrationId)
+
+
Called after a device has been registered. +

+

+
Parameters:
context - application's context.
registrationId - the registration id returned by the GCM service.
+
+
+
+ +

+onUnregistered

+
+protected abstract void onUnregistered(Context context,
+                                       java.lang.String registrationId)
+
+
Called after a device has been unregistered. +

+

+
Parameters:
registrationId - the registration id that was previously registered.
context - application's context.
+
+
+
+ +

+onHandleIntent

+
+public final void onHandleIntent(Intent intent)
+
+
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + 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 0000000000000..f0b3e26d05a59 --- /dev/null +++ b/docs/html/guide/google/gcm/client-javadoc/com/google/android/gcm/GCMBroadcastReceiver.html @@ -0,0 +1,282 @@ + + + + + + +GCMBroadcastReceiver + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +com.google.android.gcm +
+Class GCMBroadcastReceiver

+
+java.lang.Object
+  extended by BroadcastReceiver
+      extended by com.google.android.gcm.GCMBroadcastReceiver
+
+
+
+
public class GCMBroadcastReceiver
extends BroadcastReceiver
+ + +

+BroadcastReceiver that receives GCM messages and delivers them to + an application-specific GCMBaseIntentService subclass. +

+ By default, the GCMBaseIntentService class belongs to the application + main package and is named + GCMConstants.DEFAULT_INTENT_SERVICE_CLASS_NAME. To use a new class, + the getGCMIntentServiceClassName(Context) must be overridden. +

+ +

+


+ +

+ + + + + + + + + + + +
+Constructor Summary
GCMBroadcastReceiver() + +
+           
+  + + + + + + + + + + + + + + + +
+Method Summary
+protected  java.lang.StringgetGCMIntentServiceClassName(Context context) + +
+          Gets the class name of the intent service that will handle GCM messages.
+ voidonReceive(Context context, + Intent intent) + +
+           
+  + + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+  +

+ + + + + + + + +
+Constructor Detail
+ +

+GCMBroadcastReceiver

+
+public GCMBroadcastReceiver()
+
+
+ + + + + + + + +
+Method Detail
+ +

+onReceive

+
+public final void onReceive(Context context,
+                            Intent intent)
+
+
+
+
+
+
+ +

+getGCMIntentServiceClassName

+
+protected java.lang.String getGCMIntentServiceClassName(Context context)
+
+
Gets the class name of the intent service that will handle GCM messages. +

+

+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + 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 0000000000000..feb22256db9fb --- /dev/null +++ b/docs/html/guide/google/gcm/client-javadoc/com/google/android/gcm/GCMConstants.html @@ -0,0 +1,652 @@ + + + + + + +GCMConstants + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +com.google.android.gcm +
+Class GCMConstants

+
+java.lang.Object
+  extended by com.google.android.gcm.GCMConstants
+
+
+
+
public final class GCMConstants
extends java.lang.Object
+ + +

+Constants used by the GCM library. +

+ +

+


+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Field Summary
+static java.lang.StringDEFAULT_INTENT_SERVICE_CLASS_NAME + +
+           
+static java.lang.StringERROR_ACCOUNT_MISSING + +
+          There is no Google account on the phone.
+static java.lang.StringERROR_AUTHENTICATION_FAILED + +
+          Bad password.
+static java.lang.StringERROR_INVALID_PARAMETERS + +
+          The request sent by the phone does not contain the expected parameters.
+static java.lang.StringERROR_INVALID_SENDER + +
+          The sender account is not recognized.
+static java.lang.StringERROR_PHONE_REGISTRATION_ERROR + +
+          Incorrect phone registration with Google.
+static java.lang.StringERROR_SERVICE_NOT_AVAILABLE + +
+          The device can't read the response, or there was a 500/503 from the + server that can be retried later.
+static java.lang.StringEXTRA_APPLICATION_PENDING_INTENT + +
+          Extra used on INTENT_TO_GCM_REGISTRATION to get the application + id.
+static java.lang.StringEXTRA_ERROR + +
+          Extra used on INTENT_FROM_GCM_REGISTRATION_CALLBACK to indicate + an error when the registration fails.
+static java.lang.StringEXTRA_REGISTRATION_ID + +
+          Extra used on INTENT_FROM_GCM_REGISTRATION_CALLBACK to indicate + the registration id when the registration succeeds.
+static java.lang.StringEXTRA_SENDER + +
+          Extra used on INTENT_TO_GCM_REGISTRATION to indicate the sender + account (a Google email) that owns the application.
+static java.lang.StringEXTRA_SPECIAL_MESSAGE + +
+          Type of message present in the INTENT_FROM_GCM_MESSAGE intent.
+static java.lang.StringEXTRA_TOTAL_DELETED + +
+          Number of messages deleted by the server because the device was idle.
+static java.lang.StringEXTRA_UNREGISTERED + +
+          Extra used on INTENT_FROM_GCM_REGISTRATION_CALLBACK to indicate + that the application has been unregistered.
+static java.lang.StringINTENT_FROM_GCM_LIBRARY_RETRY + +
+          Intent used by the GCM library to indicate that the registration call + should be retried.
+static java.lang.StringINTENT_FROM_GCM_MESSAGE + +
+          Intent sent by GCM containing a message.
+static java.lang.StringINTENT_FROM_GCM_REGISTRATION_CALLBACK + +
+          Intent sent by GCM indicating with the result of a registration request.
+static java.lang.StringINTENT_TO_GCM_REGISTRATION + +
+          Intent sent to GCM to register the application.
+static java.lang.StringINTENT_TO_GCM_UNREGISTRATION + +
+          Intent sent to GCM to unregister the application.
+static java.lang.StringPERMISSION_GCM_INTENTS + +
+          Permission necessary to receive GCM intents.
+static java.lang.StringVALUE_DELETED_MESSAGES + +
+          Special message indicating the server deleted the pending messages.
+  + + + + + + + +
+Method Summary
+  + + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+  +

+ + + + + + + + +
+Field Detail
+ +

+INTENT_TO_GCM_REGISTRATION

+
+public static final java.lang.String INTENT_TO_GCM_REGISTRATION
+
+
Intent sent to GCM to register the application. +

+

+
See Also:
Constant Field Values
+
+
+ +

+INTENT_TO_GCM_UNREGISTRATION

+
+public static final java.lang.String INTENT_TO_GCM_UNREGISTRATION
+
+
Intent sent to GCM to unregister the application. +

+

+
See Also:
Constant Field Values
+
+
+ +

+INTENT_FROM_GCM_REGISTRATION_CALLBACK

+
+public static final java.lang.String INTENT_FROM_GCM_REGISTRATION_CALLBACK
+
+
Intent sent by GCM indicating with the result of a registration request. +

+

+
See Also:
Constant Field Values
+
+
+ +

+INTENT_FROM_GCM_LIBRARY_RETRY

+
+public static final java.lang.String INTENT_FROM_GCM_LIBRARY_RETRY
+
+
Intent used by the GCM library to indicate that the registration call + should be retried. +

+

+
See Also:
Constant Field Values
+
+
+ +

+INTENT_FROM_GCM_MESSAGE

+
+public static final java.lang.String INTENT_FROM_GCM_MESSAGE
+
+
Intent sent by GCM containing a message. +

+

+
See Also:
Constant Field Values
+
+
+ +

+EXTRA_SENDER

+
+public static final java.lang.String EXTRA_SENDER
+
+
Extra used on INTENT_TO_GCM_REGISTRATION to indicate the sender + account (a Google email) that owns the application. +

+

+
See Also:
Constant Field Values
+
+
+ +

+EXTRA_APPLICATION_PENDING_INTENT

+
+public static final java.lang.String EXTRA_APPLICATION_PENDING_INTENT
+
+
Extra used on INTENT_TO_GCM_REGISTRATION to get the application + id. +

+

+
See Also:
Constant Field Values
+
+
+ +

+EXTRA_UNREGISTERED

+
+public static final java.lang.String EXTRA_UNREGISTERED
+
+
Extra used on INTENT_FROM_GCM_REGISTRATION_CALLBACK to indicate + that the application has been unregistered. +

+

+
See Also:
Constant Field Values
+
+
+ +

+EXTRA_ERROR

+
+public static final java.lang.String EXTRA_ERROR
+
+
Extra used on INTENT_FROM_GCM_REGISTRATION_CALLBACK to indicate + an error when the registration fails. See constants starting with ERROR_ + for possible values. +

+

+
See Also:
Constant Field Values
+
+
+ +

+EXTRA_REGISTRATION_ID

+
+public static final java.lang.String EXTRA_REGISTRATION_ID
+
+
Extra used on INTENT_FROM_GCM_REGISTRATION_CALLBACK to indicate + the registration id when the registration succeeds. +

+

+
See Also:
Constant Field Values
+
+
+ +

+EXTRA_SPECIAL_MESSAGE

+
+public static final java.lang.String EXTRA_SPECIAL_MESSAGE
+
+
Type of message present in the INTENT_FROM_GCM_MESSAGE intent. + This extra is only set for special messages sent from GCM, not for + messages originated from the application. +

+

+
See Also:
Constant Field Values
+
+
+ +

+VALUE_DELETED_MESSAGES

+
+public static final java.lang.String VALUE_DELETED_MESSAGES
+
+
Special message indicating the server deleted the pending messages. +

+

+
See Also:
Constant Field Values
+
+
+ +

+EXTRA_TOTAL_DELETED

+
+public static final java.lang.String EXTRA_TOTAL_DELETED
+
+
Number of messages deleted by the server because the device was idle. + Present only on messages of special type + VALUE_DELETED_MESSAGES +

+

+
See Also:
Constant Field Values
+
+
+ +

+PERMISSION_GCM_INTENTS

+
+public static final java.lang.String PERMISSION_GCM_INTENTS
+
+
Permission necessary to receive GCM intents. +

+

+
See Also:
Constant Field Values
+
+
+ +

+DEFAULT_INTENT_SERVICE_CLASS_NAME

+
+public static final java.lang.String DEFAULT_INTENT_SERVICE_CLASS_NAME
+
+
+
See Also:
GCMBroadcastReceiver, +Constant Field Values
+
+
+ +

+ERROR_SERVICE_NOT_AVAILABLE

+
+public static final java.lang.String ERROR_SERVICE_NOT_AVAILABLE
+
+
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. +

+

+
See Also:
Constant Field Values
+
+
+ +

+ERROR_ACCOUNT_MISSING

+
+public static final java.lang.String ERROR_ACCOUNT_MISSING
+
+
There is no Google account on the phone. The application should ask the + user to open the account manager and add a Google account. +

+

+
See Also:
Constant Field Values
+
+
+ +

+ERROR_AUTHENTICATION_FAILED

+
+public static final java.lang.String ERROR_AUTHENTICATION_FAILED
+
+
Bad password. The application should ask the user to enter his/her + password, and let user retry manually later. Fix on the device side. +

+

+
See Also:
Constant Field Values
+
+
+ +

+ERROR_INVALID_PARAMETERS

+
+public static final java.lang.String ERROR_INVALID_PARAMETERS
+
+
The request sent by the phone does not contain the expected parameters. + This phone doesn't currently support GCM. +

+

+
See Also:
Constant Field Values
+
+
+ +

+ERROR_INVALID_SENDER

+
+public static final java.lang.String ERROR_INVALID_SENDER
+
+
The sender account is not recognized. Fix on the device side. +

+

+
See Also:
Constant Field Values
+
+
+ +

+ERROR_PHONE_REGISTRATION_ERROR

+
+public static final java.lang.String ERROR_PHONE_REGISTRATION_ERROR
+
+
Incorrect phone registration with Google. This phone doesn't currently + support GCM. +

+

+
See Also:
Constant Field Values
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + 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 0000000000000..a933bc6f07a99 --- /dev/null +++ b/docs/html/guide/google/gcm/client-javadoc/com/google/android/gcm/GCMRegistrar.html @@ -0,0 +1,445 @@ + + + + + + +GCMRegistrar + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +com.google.android.gcm +
+Class GCMRegistrar

+
+java.lang.Object
+  extended by com.google.android.gcm.GCMRegistrar
+
+
+
+
public final class GCMRegistrar
extends java.lang.Object
+ + +

+Utilities for device registration. +

+ Note: this class uses a private SharedPreferences + object to keep track of the registration token. +

+ +

+


+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Method Summary
+static voidcheckDevice(Context context) + +
+          Checks if the device has the proper dependencies installed.
+static voidcheckManifest(Context context) + +
+          Checks that the application manifest is properly configured.
+static java.lang.StringgetRegistrationId(Context context) + +
+          Gets the current registration id for application on GCM service.
+static booleanisRegistered(Context context) + +
+          Checks whether the application was successfully registered on GCM + service.
+static booleanisRegisteredOnServer(Context context) + +
+          Checks whether the device was successfully registered in the server side.
+static voidonDestroy(Context context) + +
+          Clear internal resources.
+static voidregister(Context context, + java.lang.String... senderIds) + +
+          Initiate messaging registration for the current application.
+static voidsetRegisteredOnServer(Context context, + boolean flag) + +
+          Sets whether the device was successfully registered in the server side.
+static voidunregister(Context context) + +
+          Unregister the application.
+  + + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+  +

+ + + + + + + + +
+Method Detail
+ +

+checkDevice

+
+public static void checkDevice(Context context)
+
+
Checks if the device has the proper dependencies installed. +

+ This method should be called when the application starts to verify that + the device supports GCM. +

+

+
Parameters:
context - application context. +
Throws: +
java.lang.UnsupportedOperationException - if the device does not support GCM.
+
+
+
+ +

+checkManifest

+
+public static void checkManifest(Context context)
+
+
Checks that the application manifest is properly configured. +

+ A proper configuration means: +

    +
  1. It creates a custom permission called + PACKAGE_NAME.permission.C2D_MESSAGE. +
  2. It defines at least one BroadcastReceiver with category + PACKAGE_NAME. +
  3. The BroadcastReceiver(s) uses the + permission. +
  4. The BroadcastReceiver(s) handles the 3 GCM intents + (, + , + and ). +
+ ...where PACKAGE_NAME is the application package. +

+ 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. +

+

+
Parameters:
context - application context. +
Throws: +
java.lang.IllegalStateException - if any of the conditions above is not met.
+
+
+
+ +

+register

+
+public static void register(Context context,
+                            java.lang.String... senderIds)
+
+
Initiate messaging registration for the current application. +

+ The result will be returned as an + GCMConstants.INTENT_FROM_GCM_REGISTRATION_CALLBACK intent with + either a GCMConstants.EXTRA_REGISTRATION_ID or + GCMConstants.EXTRA_ERROR. +

+

+
Parameters:
context - application context.
senderIds - Google Project ID of the accounts authorized to send + messages to this application. +
Throws: +
java.lang.IllegalStateException - if device does not have all GCM + dependencies installed.
+
+
+
+ +

+unregister

+
+public static void unregister(Context context)
+
+
Unregister the application. +

+ The result will be returned as an + GCMConstants.INTENT_FROM_GCM_REGISTRATION_CALLBACK intent with an + GCMConstants.EXTRA_UNREGISTERED extra. +

+

+
+
+
+
+ +

+onDestroy

+
+public static void onDestroy(Context context)
+
+
Clear internal resources. + +

+ This method should be called by the main activity's onDestroy() + method. +

+

+
+
+
+
+ +

+getRegistrationId

+
+public static java.lang.String getRegistrationId(Context context)
+
+
Gets the current registration id for application on GCM service. +

+ If result is empty, the registration has failed. +

+

+ +
Returns:
registration id, or empty string if the registration is not + complete.
+
+
+
+ +

+isRegistered

+
+public static boolean isRegistered(Context context)
+
+
Checks whether the application was successfully registered on GCM + service. +

+

+
+
+
+
+ +

+setRegisteredOnServer

+
+public static void setRegisteredOnServer(Context context,
+                                         boolean flag)
+
+
Sets whether the device was successfully registered in the server side. +

+

+
+
+
+
+ +

+isRegisteredOnServer

+
+public static boolean isRegisteredOnServer(Context context)
+
+
Checks whether the device was successfully registered in the server side. +

+

+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + 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 0000000000000..9dc665fa12297 --- /dev/null +++ b/docs/html/guide/google/gcm/client-javadoc/com/google/android/gcm/package-frame.html @@ -0,0 +1,38 @@ + + + + + + +com.google.android.gcm + + + + + + + + + + + +com.google.android.gcm + + + + +
+Classes  + +
+GCMBaseIntentService +
+GCMBroadcastReceiver +
+GCMConstants +
+GCMRegistrar
+ + + + 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 0000000000000..2b15b813e1f10 --- /dev/null +++ b/docs/html/guide/google/gcm/client-javadoc/com/google/android/gcm/package-summary.html @@ -0,0 +1,167 @@ + + + + + + +com.google.android.gcm + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+

+Package com.google.android.gcm +

+ + + + + + + + + + + + + + + + + + + + + +
+Class Summary
GCMBaseIntentServiceSkeleton for application-specific IntentServices responsible for + handling communication from Google Cloud Messaging service.
GCMBroadcastReceiverBroadcastReceiver that receives GCM messages and delivers them to + an application-specific GCMBaseIntentService subclass.
GCMConstantsConstants used by the GCM library.
GCMRegistrarUtilities for device registration.
+  + +

+

+
+
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + 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 0000000000000..f36a8a6986cbc --- /dev/null +++ b/docs/html/guide/google/gcm/client-javadoc/com/google/android/gcm/package-tree.html @@ -0,0 +1,150 @@ + + + + + + +com.google.android.gcm Class Hierarchy + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Hierarchy For Package com.google.android.gcm +

+
+

+Class Hierarchy +

+ +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + 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 0000000000000..171c6a177bc6e --- /dev/null +++ b/docs/html/guide/google/gcm/client-javadoc/constant-values.html @@ -0,0 +1,308 @@ + + + + + + +Constant Field Values + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Constant Field Values

+
+
+Contents + + + + + + +
+com.google.*
+ +

+ + + + + + + + + + + + +
com.google.android.gcm.GCMBaseIntentService
+public static final java.lang.StringTAG"GCMBaseIntentService"
+ +

+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
com.google.android.gcm.GCMConstants
+public static final java.lang.StringDEFAULT_INTENT_SERVICE_CLASS_NAME".GCMIntentService"
+public static final java.lang.StringERROR_ACCOUNT_MISSING"ACCOUNT_MISSING"
+public static final java.lang.StringERROR_AUTHENTICATION_FAILED"AUTHENTICATION_FAILED"
+public static final java.lang.StringERROR_INVALID_PARAMETERS"INVALID_PARAMETERS"
+public static final java.lang.StringERROR_INVALID_SENDER"INVALID_SENDER"
+public static final java.lang.StringERROR_PHONE_REGISTRATION_ERROR"PHONE_REGISTRATION_ERROR"
+public static final java.lang.StringERROR_SERVICE_NOT_AVAILABLE"SERVICE_NOT_AVAILABLE"
+public static final java.lang.StringEXTRA_APPLICATION_PENDING_INTENT"app"
+public static final java.lang.StringEXTRA_ERROR"error"
+public static final java.lang.StringEXTRA_REGISTRATION_ID"registration_id"
+public static final java.lang.StringEXTRA_SENDER"sender"
+public static final java.lang.StringEXTRA_SPECIAL_MESSAGE"message_type"
+public static final java.lang.StringEXTRA_TOTAL_DELETED"total_deleted"
+public static final java.lang.StringEXTRA_UNREGISTERED"unregistered"
+public static final java.lang.StringINTENT_FROM_GCM_LIBRARY_RETRY"com.google.android.gcm.intent.RETRY"
+public static final java.lang.StringINTENT_FROM_GCM_MESSAGE"com.google.android.c2dm.intent.RECEIVE"
+public static final java.lang.StringINTENT_FROM_GCM_REGISTRATION_CALLBACK"com.google.android.c2dm.intent.REGISTRATION"
+public static final java.lang.StringINTENT_TO_GCM_REGISTRATION"com.google.android.c2dm.intent.REGISTER"
+public static final java.lang.StringINTENT_TO_GCM_UNREGISTRATION"com.google.android.c2dm.intent.UNREGISTER"
+public static final java.lang.StringPERMISSION_GCM_INTENTS"com.google.android.c2dm.permission.SEND"
+public static final java.lang.StringVALUE_DELETED_MESSAGES"deleted_messages"
+ +

+ +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + 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 0000000000000..ebdcc26a24487 --- /dev/null +++ b/docs/html/guide/google/gcm/client-javadoc/deprecated-list.html @@ -0,0 +1,142 @@ + + + + + + +Deprecated List + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Deprecated API

+
+
+Contents + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + 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 0000000000000..0dc47eb9829f3 --- /dev/null +++ b/docs/html/guide/google/gcm/client-javadoc/help-doc.html @@ -0,0 +1,209 @@ + + + + + + +API Help + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+How This API Document Is Organized

+
+This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.

+Package

+
+ +

+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:

+
+

+Class/Interface

+
+ +

+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:

+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.
+ +

+Annotation Type

+
+ +

+Each annotation type has its own separate page with the following sections:

+
+ +

+Enum

+
+ +

+Each enum has its own separate page with the following sections:

+
+

+Tree (Class Hierarchy)

+
+There is a Class Hierarchy 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 java.lang.Object. The interfaces do not inherit from java.lang.Object. +
+

+Deprecated API

+
+The Deprecated API 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.
+

+Index

+
+The Index contains an alphabetic list of all classes, interfaces, constructors, methods, and fields.
+

+Prev/Next

+These links take you to the next or previous class, interface, package, or related page.

+Frames/No Frames

+These links show and hide the HTML frames. All pages are available with or without frames. +

+

+Serialized Form

+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. +

+

+Constant Field Values

+The Constant Field Values page lists the static final fields and their values. +

+ + +This help file applies to API documentation generated using the standard doclet. + +
+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + 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 0000000000000..43b8e4ecf5718 --- /dev/null +++ b/docs/html/guide/google/gcm/client-javadoc/index-all.html @@ -0,0 +1,331 @@ + + + + + + +Index + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +C D E G I O P R S T U V
+

+C

+
+
checkDevice(Context) - +Static method in class com.google.android.gcm.GCMRegistrar +
Checks if the device has the proper dependencies installed. +
checkManifest(Context) - +Static method in class com.google.android.gcm.GCMRegistrar +
Checks that the application manifest is properly configured. +
com.google.android.gcm - package com.google.android.gcm
 
+
+

+D

+
+
DEFAULT_INTENT_SERVICE_CLASS_NAME - +Static variable in class com.google.android.gcm.GCMConstants +
  +
+
+

+E

+
+
ERROR_ACCOUNT_MISSING - +Static variable in class com.google.android.gcm.GCMConstants +
There is no Google account on the phone. +
ERROR_AUTHENTICATION_FAILED - +Static variable in class com.google.android.gcm.GCMConstants +
Bad password. +
ERROR_INVALID_PARAMETERS - +Static variable in class com.google.android.gcm.GCMConstants +
The request sent by the phone does not contain the expected parameters. +
ERROR_INVALID_SENDER - +Static variable in class com.google.android.gcm.GCMConstants +
The sender account is not recognized. +
ERROR_PHONE_REGISTRATION_ERROR - +Static variable in class com.google.android.gcm.GCMConstants +
Incorrect phone registration with Google. +
ERROR_SERVICE_NOT_AVAILABLE - +Static variable in class com.google.android.gcm.GCMConstants +
The device can't read the response, or there was a 500/503 from the + server that can be retried later. +
EXTRA_APPLICATION_PENDING_INTENT - +Static variable in class com.google.android.gcm.GCMConstants +
Extra used on GCMConstants.INTENT_TO_GCM_REGISTRATION to get the application + id. +
EXTRA_ERROR - +Static variable in class com.google.android.gcm.GCMConstants +
Extra used on GCMConstants.INTENT_FROM_GCM_REGISTRATION_CALLBACK to indicate + an error when the registration fails. +
EXTRA_REGISTRATION_ID - +Static variable in class com.google.android.gcm.GCMConstants +
Extra used on GCMConstants.INTENT_FROM_GCM_REGISTRATION_CALLBACK to indicate + the registration id when the registration succeeds. +
EXTRA_SENDER - +Static variable in class com.google.android.gcm.GCMConstants +
Extra used on GCMConstants.INTENT_TO_GCM_REGISTRATION to indicate the sender + account (a Google email) that owns the application. +
EXTRA_SPECIAL_MESSAGE - +Static variable in class com.google.android.gcm.GCMConstants +
Type of message present in the GCMConstants.INTENT_FROM_GCM_MESSAGE intent. +
EXTRA_TOTAL_DELETED - +Static variable in class com.google.android.gcm.GCMConstants +
Number of messages deleted by the server because the device was idle. +
EXTRA_UNREGISTERED - +Static variable in class com.google.android.gcm.GCMConstants +
Extra used on GCMConstants.INTENT_FROM_GCM_REGISTRATION_CALLBACK to indicate + that the application has been unregistered. +
+
+

+G

+
+
GCMBaseIntentService - Class in com.google.android.gcm
Skeleton for application-specific IntentServices responsible for + handling communication from Google Cloud Messaging service.
GCMBaseIntentService(String) - +Constructor for class com.google.android.gcm.GCMBaseIntentService +
Subclasses must create a public no-arg constructor and pass the + sender id to be used for registration. +
GCMBroadcastReceiver - Class in com.google.android.gcm
BroadcastReceiver that receives GCM messages and delivers them to + an application-specific GCMBaseIntentService subclass.
GCMBroadcastReceiver() - +Constructor for class com.google.android.gcm.GCMBroadcastReceiver +
  +
GCMConstants - Class in com.google.android.gcm
Constants used by the GCM library.
GCMRegistrar - Class in com.google.android.gcm
Utilities for device registration.
getGCMIntentServiceClassName(Context) - +Method in class com.google.android.gcm.GCMBroadcastReceiver +
Gets the class name of the intent service that will handle GCM messages. +
getRegistrationId(Context) - +Static method in class com.google.android.gcm.GCMRegistrar +
Gets the current registration id for application on GCM service. +
+
+

+I

+
+
INTENT_FROM_GCM_LIBRARY_RETRY - +Static variable in class com.google.android.gcm.GCMConstants +
Intent used by the GCM library to indicate that the registration call + should be retried. +
INTENT_FROM_GCM_MESSAGE - +Static variable in class com.google.android.gcm.GCMConstants +
Intent sent by GCM containing a message. +
INTENT_FROM_GCM_REGISTRATION_CALLBACK - +Static variable in class com.google.android.gcm.GCMConstants +
Intent sent by GCM indicating with the result of a registration request. +
INTENT_TO_GCM_REGISTRATION - +Static variable in class com.google.android.gcm.GCMConstants +
Intent sent to GCM to register the application. +
INTENT_TO_GCM_UNREGISTRATION - +Static variable in class com.google.android.gcm.GCMConstants +
Intent sent to GCM to unregister the application. +
isRegistered(Context) - +Static method in class com.google.android.gcm.GCMRegistrar +
Checks whether the application was successfully registered on GCM + service. +
isRegisteredOnServer(Context) - +Static method in class com.google.android.gcm.GCMRegistrar +
Checks whether the device was successfully registered in the server side. +
+
+

+O

+
+
onDeletedMessages(Context, int) - +Method in class com.google.android.gcm.GCMBaseIntentService +
Called when the GCM server tells pending messages have been deleted + because the device was idle. +
onDestroy(Context) - +Static method in class com.google.android.gcm.GCMRegistrar +
Clear internal resources. +
onError(Context, String) - +Method in class com.google.android.gcm.GCMBaseIntentService +
Called on registration or unregistration error. +
onHandleIntent(Intent) - +Method in class com.google.android.gcm.GCMBaseIntentService +
  +
onMessage(Context, Intent) - +Method in class com.google.android.gcm.GCMBaseIntentService +
Called when a cloud message has been received. +
onReceive(Context, Intent) - +Method in class com.google.android.gcm.GCMBroadcastReceiver +
  +
onRecoverableError(Context, String) - +Method in class com.google.android.gcm.GCMBaseIntentService +
Called on a registration error that could be retried. +
onRegistered(Context, String) - +Method in class com.google.android.gcm.GCMBaseIntentService +
Called after a device has been registered. +
onUnregistered(Context, String) - +Method in class com.google.android.gcm.GCMBaseIntentService +
Called after a device has been unregistered. +
+
+

+P

+
+
PERMISSION_GCM_INTENTS - +Static variable in class com.google.android.gcm.GCMConstants +
Permission necessary to receive GCM intents. +
+
+

+R

+
+
register(Context, String...) - +Static method in class com.google.android.gcm.GCMRegistrar +
Initiate messaging registration for the current application. +
+
+

+S

+
+
setRegisteredOnServer(Context, boolean) - +Static method in class com.google.android.gcm.GCMRegistrar +
Sets whether the device was successfully registered in the server side. +
+
+

+T

+
+
TAG - +Static variable in class com.google.android.gcm.GCMBaseIntentService +
  +
+
+

+U

+
+
unregister(Context) - +Static method in class com.google.android.gcm.GCMRegistrar +
Unregister the application. +
+
+

+V

+
+
VALUE_DELETED_MESSAGES - +Static variable in class com.google.android.gcm.GCMConstants +
Special message indicating the server deleted the pending messages. +
+
+C D E G I O P R S T U V + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + 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 0000000000000..a7753f74246d1 --- /dev/null +++ b/docs/html/guide/google/gcm/client-javadoc/index.html @@ -0,0 +1,38 @@ + + + + + + +Generated Documentation (Untitled) + + + + + + + + + + +<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> + + + 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 0000000000000..6ea6fb3eea171 --- /dev/null +++ b/docs/html/guide/google/gcm/client-javadoc/overview-tree.html @@ -0,0 +1,152 @@ + + + + + + +Class Hierarchy + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Hierarchy For All Packages

+
+
+
Package Hierarchies:
com.google.android.gcm
+
+

+Class Hierarchy +

+ +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + 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 0000000000000..149691e0828da --- /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 0000000000000000000000000000000000000000..c814867a13deb0ca7ea2156c6ca1d5a03372af7e GIT binary patch literal 57 zcmZ?wbhEHbIIT!9-C*e{wE9>Kx3D)-;0v)C; KYxQGgum%9JOA&7X literal 0 HcmV?d00001 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 0000000000000..6ea9e5161615f --- /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 0000000000000..2e1e9755180d6 --- /dev/null +++ b/docs/html/guide/google/gcm/demo.jd @@ -0,0 +1,259 @@ +page.title=GCM Demo Application +@jd:body + +
+
+ +

Quickview

+ +
    +
  • Build and run the GCM demo app.
  • +
  • Understand how to set up both the client and server sides of a GCM app.
  • +
  • Become familiar with the GCM helper libraries.
  • +
+ + +

In this document

+ +
    +
  1. Requirements
  2. +
  3. Setting Up GCM
  4. +
  5. Setting Up the Server +
      +
    1. Using a standard web server
    2. +
    3. Using App Engine for Java
    4. +
    +
  6. +
  7. Setting Up the Device
  8. +
+ +
+
+ +

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.

+ + +

This demo consists of the following pieces:

+ +

Here is the API reference documentation for the helper libraries on which the demo is based:

+ +

Requirements

+

For the web server:

+ +

For the Android application:

+ +

Setting Up GCM

+

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 Google API Console.

+

For instructions on how to set up GCM, see Getting Started.

+ + +

Setting Up the Server

+

This section describes the different options for setting up a server.

+

Using a standard web server

+

To set up the server using a standard, servlet-compliant web server:

+
    +
  1. From the SDK Manager, install Extras > Google Cloud Messaging for Android Library. + + +

    This creates a gcm directory under YOUR_SDK_ROOT/extras/google/ containing these subdirectories: gcm-client, gcm-demo-appengine, gcm-demo-client, gcm-demo-server, and gcm-server.

    +
  2. + +
  3. In a text editor, edit the gcm-demo-server/WebContent/WEB-INF/classes/api.key and replace the existing text with the API key obtained above.
  4. +
  5. In a shell window, go to the gcm-demo-server directory.
  6. +
  7. Generate the server's WAR file by running ant war:
  8. + +
    $ 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: dist/gcm-demo.war
    +
    +BUILD SUCCESSFUL
    +Total time: 0 seconds
    +
    + +
  9. Deploy the dist/gcm-demo.war to your running server. For instance, if you're using Jetty, copy gcm-demo.war to the webapps directory of the Jetty installation.
  10. +
  11. 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 http://192.168.1.10:8080/gcm-demo/home, where gcm-demo is the application context and /home is the path of the main servlet. + +
  12. +
+

Note: You can get the IP by running ifconfig on Linux or MacOS, or ipconfig on Windows.

+

+

You server is now ready.

+

Using App Engine for Java

+ +

To set up the server using a standard App Engine for Java:

+
    +
  1. From the SDK Manager, install Extras > Google Cloud Messaging for Android Library. +

    This creates a gcm directory under YOUR_SDK_ROOT/extras/google/ containing these subdirectories: gcm-client, gcm-demo-appengine, gcm-demo-client, gcm-demo-server, and gcm-server.

    +
  2. +
  3. In a text editor, edit the gcm-demo-appengine/src/com/google/android/gcm/demo/server/ApiKeyInitializer.java and replace the existing text with the API key obtained above. +

    Note: 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 Datastore Viewer to change it later.

    + +
  4. +
  5. In a shell window, go to the gcm-api-server directory.
  6. +
  7. Start the development App Engine server by ant runserver, using the -Dsdk.dir to indicate the location of the App Engine SDK and -Dserver.host to set your server's hostname or IP address:
  8. + +
    +$ 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
    +
    + +
  9. 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 http://192.168.1.10:8080/home, where /home is the path of the main servlet.
  10. + +

    Note: You can get the IP by running ifconfig on Linux or MacOS, or ipconfig on Windows.

    + +

    +
+

You server is now ready.

+

Setting Up the Device

+

To set up the device:

+
    +
  1. From the SDK Manager, install Extras > Google Cloud Messaging for Android Library. +

    This creates a gcm directory under YOUR_SDK_ROOT/extras/google containing these subdirectories: gcm-client, gcm-demo-appengine, gcm-demo-client, gcm-demo-server, gcm-server, and source.properties.

    +
  2. +
  3. Using a text editor, open gcm-demo-client/src/com/google/android/gcm/demo/app/CommonUtilities.java and set the proper values for the SENDER_ID and SERVER_URL constants. For example:
  4. + +
    +static final String SERVER_URL = "http://192.168.1.10:8080/gcm-demo";
    +static final String SENDER_ID = "4815162342";
    +

    Note that the SERVER_URL 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 (/). Also note that SENDER_ID is the Google API project ID you obtained in the server setup steps above.

    + +
  5. In a shell window, go to the gcm-demo-client directory.
  6. +
  7. Use the SDK's android tool to generate the ant build files:
  8. + +
    +$ android update project --name GCMDemo -p . --target android-16
    +Updated project.properties
    +Updated local.properties
    +Updated file ./build.xml
    +Updated file ./proguard-project.txt
    +
    +

    If this command fails becase android-16 is not recognized, try a different target (as long as it is at least android-15).

    + +
  9. Use ant to build the application's APK file:
  10. + +
    +$ 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: bin/build.prop
    +[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
    + 
    + +
  11. Start the Android emulator:
  12. +
    $emulator -avd my_avd
    +
    + +

    This example assumes there is an AVD (Android Virtual Device) named my_avd previously configured with Android 2.2 and Google APIs level 8. For more information on how to run an Android emulator, see Managing Virtual Devices in the Android Developers Guide.

    + +
  13. Make sure there is a Google account added to the emulator. It doesn't have to be any account (like the senderId) in particular.
  14. + +

    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.

    + +
  15. Install the application in the emulator:
  16. + +
    +$ 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
    +
    +
  17. In the emulator, launch the GCM Demo app. The initial screen should look like this:
  18. +

    +

    Note: 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.

    +
  19. Now go back to your browser and refresh the page. It will show that there is one device registered:
  20. + +

    + +
  21. Click on Send Message. The browser should show:
  22. +

    + +

    And in your emulator:

    + +

    + +

    Note: 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.

    +
+ diff --git a/docs/html/guide/google/gcm/gcm.jd b/docs/html/guide/google/gcm/gcm.jd new file mode 100644 index 0000000000000..d871fb4a94029 --- /dev/null +++ b/docs/html/guide/google/gcm/gcm.jd @@ -0,0 +1,943 @@ +page.title=GCM Architectural Overview +@jd:body + +
+
+ +

Quickview

+ +
    +
  • Get an introduction to key GCM terms and concepts.
  • +
  • Learn the basic features of a GCM application.
  • +
  • Understand the role of the 3rd-party application server, and how to send messages and process results.
  • +
+ + +

In this document

+ +
    +
  1. Introduction
  2. +
  3. Architectural Overview +
      +
    1. Lifecycle Flow
    2. +
    3. What Does the User See?
    4. +
    +
  4. +
  5. Writing Android Applications that use GCM +
      +
    1. Creating the Manifest
    2. +
    3. Registering for GCM
    4. +
    5. Unregistering from GCM
    6. +
    7. Handling Intents sent by GCM +
        +
      1. Handling Registration Results
      2. +
      3. Handling Received Data
      4. +
      +
    8. +
    9. Developing and Testing Your Android Applications
    10. +
    +
  6. +
  7. Role of the 3rd-party Application Server +
      +
    1. Sending Messages +
        +
      1. Request format
      2. +
      3. Response format
      4. +
      +
    2. +
    +
  8. Viewing statistics +
  9. +
  10. Examples
  11. +
+ + + +
+
+ +

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.

+

To jump right into using GCM with your Android + applications, see the instructions in Getting Started.

+ + + + +

Introduction

+ +

Here are the primary characteristics of Google Cloud +Messaging (GCM):

+ + +

Architectural Overview

+

This section gives an overview of how GCM works.

+

This table summarizes the key terms and concepts involved in GCM. It is +divided into these categories:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Components
Mobile DeviceThe 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.
3rd-party Application ServerAn 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.
GCM ServersThe Google servers involved in taking messages from the 3rd-party +application server and sending them to the device.
Credentials
Sender IDA project ID you acquire from the API console, as described in Getting Started. The sender +ID is used in the registration process to identify an +Android application that is permitted to send messages to the device.
Application IDThe Android application that is registering to receive messages. The Android application +is identified by the package name from the manifest. +This ensures that the messages are targeted to the correct Android application.
Registration IDAn 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.
Google User AccountFor 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.
Sender Auth TokenAn 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.
+ +

Lifecycle Flow

+ +

Here are the primary processes involved in cloud-to-device messaging:

+ + + +

These processes are described in more detail below.

+ +

Enabling GCM

+ +

This is the sequence of events that occurs when an Android application +running on a mobile device registers to receive messages:

+ +
    +
  1. The first time the Android application needs to use the messaging service, it +fires off a registration Intent to a GCM server. +

    This registration Intent +(com.google.android.c2dm.intent.REGISTER) includes the sender ID, and the Android application ID.

    +

    Note: 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 onCreate(), but only if the application is not registered yet. +

    +
  2. +
  3. If the registration is successful, the GCM server broadcasts a com.google.android.c2dm.intent.REGISTRATION intent which gives the Android application a registration +ID. +

    The Android application should store this ID for later use (for instance, to check on onCreate() 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 com.google.android.c2dm.intent.REGISTRATION intent may be called +multiple times. Your Android application needs to be able to respond +accordingly.

  4. +
  5. 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.
  6. +
+ +

The registration ID lasts until the Android application explicitly unregisters +itself, or until Google refreshes the registration ID for your Android application.

+ +

Note: 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 NotRegistered error). +

+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.

+

+ +

Sending a Message

+ +

For an application server to send a message to an Android application, the following things must be in +place:

+ + + +

Here is the sequence of events that occurs when the application server sends a +message:

+ +
    +
  1. The application server sends a message to GCM servers.
  2. +
  3. Google enqueues and stores the message in case the device is +offline.
  4. +
  5. When the device is online, Google sends the message to the device.
  6. +
  7. 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.
  8. +
  9. 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.
  10. +
+ +

An Android application can unregister GCM if it no longer wants to receive +messages.

+ +

Receiving a Message

+ +

This is the sequence of events that occurs when an Android application +installed on a mobile device receives a message:

+ +
    +
  1. The system receives the incoming message and extracts the raw key/value +pairs from the message payload, if any.
  2. +
  3. The system passes the key/value pairs to the targeted Android application +in a com.google.android.c2dm.intent.RECEIVE Intent as a set of +extras.
  4. +
  5. The Android application extracts the raw data +from the com.google.android.c2dm.intent.RECEIVE Intent by key and processes the data.
  6. +
+ +

What Does the User See?

+ +

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.

+ +

Writing Android Applications that Use GCM

+ +

To write Android applications that use GCM, you must have an application +server that can perform the tasks described in Role of the +3rd-party Application Server. This section describes the steps you take to +create a client application that uses GCM.

+ +

Remember that there is no user interface associated with GCM. +However you choose to process messages in your Android application is up to you.

+ +

There are two primary steps involved in writing a client Android application:

+ + + +

Creating the Manifest

+ +

Every Android application must have an AndroidManifest.xml 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 Android Developers Guide. To use the GCM feature, the +manifest must include the following:

+ + + +

Here are excerpts from a manifest that supports GCM:

+ +
+<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>
+
+

Registering for GCM

+ +

An Android application needs to register with GCM servers before it can receive messages. To register, the application sends an Intent +(com.google.android.c2dm.intent.REGISTER), with 2 extra parameters: +

+ + + +

For example:

+ +
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);
+ +

This intent will be asynchronously sent to the GCM server, and the response will be delivered to +the application as a com.google.android.c2dm.intent.REGISTRATION intent containing +the registration ID assigned to the Android application running on that particular device.

+ +

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.

+ +

Unregistering from GCM

+ +

To unregister from GCM, do the following:

+ +
Intent unregIntent = new Intent("com.google.android.c2dm.intent.UNREGISTER");
+unregIntent.putExtra("app", PendingIntent.getBroadcast(this, 0, new Intent(), 0));
+startService(unregIntent);
+
+ +

Similar to the registration request, this intent is sent asynchronously, and the response comes as a com.google.android.c2dm.intent.REGISTRATION intent. + + +

Handling Intents sent by GCM

+ +

As discussed in Creating the Manifest, the manifest +defines a broadcast receiver for the com.google.android.c2dm.intent.REGISTRATION and com.google.android.c2dm.intent.RECEIVE intents. +These intents are sent by GCM to indicate that a device was registered (or unregistered), or to deliver messages, respectively.

+ +

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 onReceive() 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:

+ + +
+public class MyBroadcastReceiver extends BroadcastReceiver {
+
+    @Override
+    public final void onReceive(Context context, Intent intent) {
+        MyIntentService.runIntentInService(context, intent);
+        setResult(Activity.RESULT_OK, null, null);
+    }
+}
+
+ +

Then in MyIntentService:

+
+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();
+            }
+        }
+    }
+}
+
+ +

Note: your application must acquire a wake lock before starting the service—otherwise the device could be put to sleep before the service is started.

+ +

Handling Registration Results

+ +

When a com.google.android.c2dm.intent.REGISTRATION intent is received, it could potentially contain 3 extras: registration_id, error, and unregistered. + +

When a registration succeeds, registration_id 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.

+ +

Note: Although the com.google.android.c2dm.intent.REGISTRATION 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.

+ +

When an unregistration succeeds, only the unregistered 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).

+ +

If the application request (be it register or unregister) fails, the error will be set with an error code, and the other extras will not be set. + +Here are the possible error codes:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Error CodeDescription
SERVICE_NOT_AVAILABLEThe 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 Advanced Topics for more information.
ACCOUNT_MISSINGThere 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.
AUTHENTICATION_FAILEDBad 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.
INVALID_SENDERThe sender account is not recognized. This must be fixed on the Android application side. The developer must fix the application to provide the right sender extra in the com.google.android.c2dm.intent.REGISTER intent.
PHONE_REGISTRATION_ERROR Incorrect phone registration with Google. This +phone doesn't currently support GCM.
INVALID_PARAMETERSThe request sent by the phone does not contain the expected parameters. This phone doesn't currently support GCM.
+ + + + +

Here's an example on how to handle the registration in the MyIntentService example:

+ +
+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 Advanced Topics)
+        } else {
+            // Unrecoverable error, log it
+            Log.i(TAG, "Received error: " + error);
+        }
+    }
+}
+ +

Handling Received Data

+ +

The com.google.android.c2dm.intent.RECEIVE 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 data parameter, they are available as +extras in this intent, with the keys being the extra names. + +

Here is an example, again using the MyIntentReceiver class:

+ +
+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
+}
+ +

Developing and Testing Your Android Applications

+ +

Here are some guidelines for developing and testing an Android application +that uses the GCM feature:

+ + + +

Role of the 3rd-party Application Server

+ +

Before you can write client Android applications that use the GCM feature, you must +have an application server that meets the following criteria:

+ + + +

Sending Messages

+

This section describes how the 3rd-party application server sends messages to one or more mobile devices. Note the following:

+ +

Before the 3rd-party application server can send a message to an + Android application, it must have received a registration ID from it.

+

Request format

+

To send a message, the application server issues a POST request to https://android.googleapis.com/gcm/send.

+

A message request is made of 2 parts: HTTP header and HTTP body.

+ +

The HTTP header must contain the following headers:

+ + +

For example: +

+
Content-Type:application/json
+Authorization:key=AIzaSyB-1uEai2WiUapxCs2Q0GZYzPu7Udno5aA
+
+{
+  "registration_id" : "APA91bHun4MxP5egoKMwt2KZFBaFUH-1RYqx...",
+  "data" : {
+    ...
+  },
+}
+

+

Note: If Content-Type is omitted, the format is assumed to be plain text.

+

+ +

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:

+ + + + + + + + + + + + + + + + + + + + + + + + + +
FieldDescription
registration_idsA 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.
collapse_keyAn 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 Advanced Topics for more discussion of this topic. Optional, unless you are using the time_to_live parameter—in that case, you must also specify a collapse_key.
dataA 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, "data":{"score":"3x1"} would result in an intent extra named score whose value is the string 3x1 +There is no limit on the number of key/value pairs, though there is a limit on the total size of the message. Optional.
delay_while_idleIf 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 collapse_key value will be +sent. Optional. The default value is false, and must be a JSON boolean.
time_to_liveHow 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 collapse_key.
+ +

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: + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldDescription
registration_idMust contain the registration ID of the single device receiving the message. Required.
collapse_keySame as JSON (see previous table). Optional.
data.<key>Payload data, expressed as parameters prefixed with data. and suffixed as the key. For instance, a parameter of data.score=3x1 would result in an intent extra named score whose value is the string 3x1. There is no limit on the number of key/value parameters, though there is a limit on the total size of the message. Optional.
delay_while_idleShould be represented as 1 or true for true, anything else for false. Optional. The default value is false.
time_to_liveSame as JSON (see previous table). Optional.
+ + + +

Example requests

+

Here is the smallest possible request (a message without any parameters and just one recipient) using JSON:

+
{ "registration_ids": [ "42" ] }
+ +

And here the same example using plain text:

+
registration_id=42
+ +

Here is a message with a payload and 6 recipients:

+
{ "data": {
+    "score": "5x1",
+    "time": "15:10"
+  },
+  "registration_ids": ["4", "8", "15", "16", "23", "42"]
+}
+

Here is a message with all optional fields set and 6 recipients:

+
{ "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"]
+}
+

And here is the same message using plain-text format (but just 1 recipient):

+ +
collapse_key=score_update&time_to_live=108&delay_while_idle=1&data.score=4x8&data.time=15:16.2342&registration_id=42
+  
+ +

Note: 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 this support link. +

+ +

Response format

+ +

There are two possible outcomes when trying to send a message:

+ + +

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).

+ +

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.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
ResponseDescription
200Message 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 Interpreting a success response for more details.
400Only 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.
401There was an error authenticating the sender account. Troubleshoot
500There was an internal error in the GCM server while trying to process the request. Troubleshoot
503Indicates that the server is temporarily unavailable (i.e., because of timeouts, etc ). Sender must retry later, honoring any Retry-After header + included in the response. Application servers must implement exponential back-off. The GCM server took too long to process the request. Troubleshoot
+ +

Interpreting a success response

+

When a JSON request is successful (HTTP status code 200), the response body contains a JSON object with the following fields:

+ + + + + + + + + + + + + + + + + + + + + + + + + +
FieldDescription
multicast_idUnique ID (number) identifying the multicast message.
successNumber of messages that were processed without an error.
failureNumber of messages that could not be processed.
canonical_idsNumber of results that contain a canonical registration ID. See Advanced Topics for more discussion of this topic.
resultsArray 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:
+
    +
  • message_id: String representing the message when it was successfully processed.
  • +
  • registration_id: 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.
    +
  • +
  • error: 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).
  • +
+

If the value of failure and canonical_ids 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:

+ + +

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 id=ID of sent message or Error=GCM error code. The second line, if available, +has the format of registration_id=canonical ID. 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:

+ + +

Interpreting an error response

+

Here are the recommendations for handling the different types of error that might occur when trying to send a message to a device:

+ +
+
Missing Registration ID
+
Check that the request contains a registration ID (either in the registration_id parameter in a plain text message, or in the registration_ids field in JSON). +
Happens when error code is MissingRegistration.
+
Invalid Registration ID
+
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 com.google.android.c2dm.intent.REGISTRATION intent and that you're not truncating it or adding additional characters. +
Happens when error code is InvalidRegistration.
+
Mismatched Sender
+
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 MismatchSenderId.
+
Unregistered Device
+
An existing registration ID may cease to be valid in a number of scenarios, including: +
    +
  • If the application manually unregisters by issuing a com.google.android.c2dm.intent.UNREGISTER intent.
  • +
  • If the application is automatically unregistered, which can happen (but is not guaranteed) if the user uninstalls the application.
  • +
  • If the registration ID expires. Google might decide to refresh registration IDs.
  • +
+For all these cases, you should remove this registration ID from the 3rd-party server and stop using it to send +messages. +
Happens when error code is NotRegistered.
+
Message Too Big
+
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. +
Happens when error code is MessageTooBig.
+
Authentication Error
+
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 Authorization header is the correct API key associated with your project. +
Happens when the HTTP status code is 401. +
+
Internal Server Error/Timeout
+
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: +
    +
  • Honor the Retry-After header if it's included in the response from the GCM server.
  • +
  • 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.
  • +
+Senders that cause problems risk being blacklisted. +
Happens when the HTTP status code is 500 or 503; or when the error field of a JSON object in the results array is Unavailable. +
+
+

Example responses

+

This section shows a few examples of responses indicating messages that were processed successfully. See Example requests for the requests these responses are based on.

+

Here is a simple case of a JSON message successfully sent to one recipient without canonical IDs in the response:

+
{ "multicast_id": 108,
+  "success": 1,
+  "failure": 0,
+  "canonical_ids": 0,
+  "results": [
+    { "message_id": "1:08" }
+  ]
+}
+ +

Or if the request was in plain-text format:

+
id=1:08
+
+ +

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:

+
{ "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"}
+  ]
+}
+
+

In this example:

+ +

Or if just the 4th message above was sent using plain-text format:

+
Error=InvalidRegistration
+
+

If the 5th message above was also sent using plain-text format:

+
id=1:2342
+registration_id=32
+
+ + +

Viewing statistics

+ +

To view statistics and any error messages for your GCM applications:

+
    +
  1. Go to play.google.com/apps/publish.
  2. +
  3. Login with your developer account. +

    You will see a page that has a list of all of your apps.

  4. +
  5. Click on the "statistics" link next to the app for which you want to view GCM stats. +

    Now you are on the statistics page.

  6. +
  7. Go to the drop-down menu and select the GCM metric you want to view. +
  8. +
+

Examples

+

See the GCM Demo Application document.

+ diff --git a/docs/html/guide/google/gcm/gs.jd b/docs/html/guide/google/gcm/gs.jd new file mode 100644 index 0000000000000..5e426c2303b8a --- /dev/null +++ b/docs/html/guide/google/gcm/gs.jd @@ -0,0 +1,203 @@ +page.title=GCM: Getting Started +@jd:body + +
+ +
+ +

This document describes how to write an Android application and the server-side logic, using the helper libraries (client and server) provided by GCM.

+ + +

Creating a Google API project

+

To create a Google API project:

+
    +
  1. Open the Google APIs Console page. +
  2. +
  3. If you haven't created an API project yet, this page will prompt you to do so: +

    +

    Note: If you already have existing projects, the first page you see will be the Dashboard page. From there you can create a new project by opening the project drop-down menu (upper left corner) and choosing Other projects > Create.

  4. +
  5. Click Create project. + Your browser URL will change to something like:
  6. + +
     https://code.google.com/apis/console/#project:4815162342
    + +
  7. Take note of the value after #project: (4815162342 in this example). This is your project ID, and it will be used later on as the GCM sender ID.
  8. + +
+

Enabling the GCM Service

+

To enable the GCM service:

+
    +
  1. In the main Google APIs Console page, select Services.
  2. +
  3. Turn the Google Cloud Messaging toggle to ON.
  4. +
  5. In the Terms of Service page, accept the terms. +
  6. +
+

Obtaining an API Key

+

To obtain an API key:

+
    +
  1. In the main Google APIs Console page, select API Access. You will see a screen that resembles the following:

  2. + +
    +
    + +
    +
    + +
  3. Click Create new Server key. The following screen appears:

  4. + +
    +
    + +
    +
    + +
  5. Click Create:

  6. + +
    +
    + +
    +
    + + +
+

Take note of the API key value (YourKeyWillBeShownHere) in this example, as it will be used later on.

+

Note: If you need to rotate the key, click Generate new key. 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 Delete key.

+ +

Install the Helper Libraries

+

To perform the steps described in the following sections, you must first install the helper libraries (reference: client and server). From the SDK Manager, install Extras > Google Cloud Messaging for Android Library. This creates a gcm directory under YOUR_SDK_ROOT/extras/google/ containing these subdirectories: gcm-client, gcm-demo-appengine, gcm-demo-client, gcm-demo-server, and gcm-server.

+

Writing the Android Application

+

This section describes the steps involved in writing an Android application that uses GCM.

+

Step 1: Copy the gcm.jar file into your application classpath

+

To write your Android application, first copy the gcm.jar file from the SDK's gcm-client/dist directory to your application classpath.

+

Step 2: Make the following changes in the application's Android manifest

+
    +
  1. GCM requires Android 2.2 or later, so if your application cannot work without GCM, add the following line, where xx is the latest target SDK version:
  2. + +
    <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="xx"/>
    + +
  3. Declare and use a custom permission so only this application can receive GCM messages:
    +
  4. + +
    <permission android:name="my_app_package.permission.C2D_MESSAGE" android:protectionLevel="signature" />
    +<uses-permission android:name="my_app_package.permission.C2D_MESSAGE" /> 
    +

    This permission must be called my_app_package.permission.C2D_MESSAGE (where my_app_package is the package name of your app as defined by the manifest tag), otherwise it will not work.

    +

    Note: This permission is not required if you are targeting your application to 4.1 or above (i.e., minSdkVersion 16)

    + +
  5. Add the permission to receive GCM messages:
  6. + +
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    + +
  7. Add the following broadcast receiver:
  8. + +
    <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>
    +

    This broadcast receiver is responsible for handling the 2 intents that can be sent by GCM (com.google.android.c2dm.intent.RECEIVE and com.google.android.c2dm.intent.REGISTRATION) 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 com.google.android.c2dm.permission.SEND 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).

    +

    Notice that android:name 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).
    +

    + +
  9. Add the following intent service:
  10. + + +
    <service android:name=".GCMIntentService" />
    + +
+

This intent service will be called by the GCMBroadcastReceiver (which is is provided by GCM library), as shown in the next step. It must be named my_app_package.GCMIntentService, unless you use a subclass of GCMBroadcastReceiver that overrides the method used to name the service.

+


+ Step 3: Write the my_app_package.GCMIntentService class

+

Next write the my_app_package.GCMIntentService class, overriding the following callback methods (which are called by GCMBroadcastReceiver):
+

+ + +

Note: 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.

+ +

Step 4: Write your application's main activity

+Add the following import statement in your application's main activity: +
import com.google.android.gcm.GCMRegistrar;
+

In the onCreate() method, add the following code:

+
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");
+}
+

The checkDevice() 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 checkManifest() method verifies that the application manifest contains meets all the requirements described in Writing the Android Application (this method is only necessary when you are developing the application; once the application is ready to be published, you can remove it).

+ +

Once the sanity checks are done, the device calls GCMRegsistrar.register() to register the device, passing the SENDER_ID you got when you signed up for GCM. But since the GCMRegistrar singleton keeps track of the registration ID upon the arrival of registration intents, you can call GCMRegistrar.getRegistrationId() first to check if the device is already registered.

+

Note: 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 Advanced Topics for more details on how to handle this scenario.

+ +

Writing the Server-side Application

+ +

To write the server-side application:

+
    +
  1. Copy the gcm-server.jar file from the SDK's gcm-server/dist directory to your server classpath.
  2. +
  3. 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.
  4. +
  5. Similarly, create a servlet used to unregister registration IDs.
    +
  6. +
  7. When the server needs to send a message to the device, it can use the com.google.android.gcm.server.Sender helper class from the GCM library. For example:
  8. +
+ +
import com.google.android.gcm.server.*;
+
+Sender sender = new Sender(myApiKey);
+Message message = new Message.Builder(regId).build();
+Result result = sender.send(message, 5);
+ +

The snippet above does the following: +

+

It's now necessary to parse the result and take the proper action in the following cases:

+ +

Here's a code snippet that handles these 2 conditions:

+
+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
+ }
+}
diff --git a/docs/html/guide/google/gcm/index.jd b/docs/html/guide/google/gcm/index.jd new file mode 100644 index 0000000000000..cba8d0b19d0f3 --- /dev/null +++ b/docs/html/guide/google/gcm/index.jd @@ -0,0 +1,25 @@ +page.title=Google Cloud Messaging for Android +@jd:body + + +

+

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.

+ +

To learn more about GCM, read the following documents:

+ +
+
Getting Started
+
Read this document to learn the basic steps involved in developing Android applications based on GCM.
+
Architectural Overview
+
Read this document for a description of the underlying concepts and architecture in GCM.
+
Demo App Tutorial
+
Read this document to walk through setting up and running the GCM demo app.
+
Advanced Topics
+
Read this document to get a more in-depth understanding of key GCM features.
+
Migration
+
Read this document if you are a C2DM developer moving to GCM.
+
+ +

GCM also provides helper libraries for client and server development.

+ + 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 0000000000000..d2fe43d85855e --- /dev/null +++ b/docs/html/guide/google/gcm/server-javadoc/allclasses-frame.html @@ -0,0 +1,43 @@ + + + + + + +All Classes + + + + + + + + + + + +All Classes +
+ + + + + +
Constants +
+InvalidRequestException +
+Message +
+Message.Builder +
+MulticastResult +
+Result +
+Sender +
+
+ + + 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 0000000000000..0f0dc961ff5a9 --- /dev/null +++ b/docs/html/guide/google/gcm/server-javadoc/allclasses-noframe.html @@ -0,0 +1,43 @@ + + + + + + +All Classes + + + + + + + + + + + +All Classes +
+ + + + + +
Constants +
+InvalidRequestException +
+Message +
+Message.Builder +
+MulticastResult +
+Result +
+Sender +
+
+ + + 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 0000000000000..09ac01162be23 --- /dev/null +++ b/docs/html/guide/google/gcm/server-javadoc/com/google/android/gcm/server/Constants.html @@ -0,0 +1,764 @@ + + + + + + +Constants + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +com.google.android.gcm.server +
+Class Constants

+
+java.lang.Object
+  extended by com.google.android.gcm.server.Constants
+
+
+
+
public final class Constants
extends java.lang.Object
+ + +

+Constants used on GCM service communication. +

+ +

+


+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Field Summary
+static java.lang.StringERROR_DEVICE_QUOTA_EXCEEDED + +
+          Too many messages sent by the sender to a specific device.
+static java.lang.StringERROR_INVALID_REGISTRATION + +
+          Bad registration_id.
+static java.lang.StringERROR_MESSAGE_TOO_BIG + +
+          The payload of the message is too big, see the limitations.
+static java.lang.StringERROR_MISMATCH_SENDER_ID + +
+          The sender_id contained in the registration_id does not match the + sender_id used to register with the GCM servers.
+static java.lang.StringERROR_MISSING_COLLAPSE_KEY + +
+          Collapse key is required.
+static java.lang.StringERROR_MISSING_REGISTRATION + +
+          Missing registration_id.
+static java.lang.StringERROR_NOT_REGISTERED + +
+          The user has uninstalled the application or turned off notifications.
+static java.lang.StringERROR_QUOTA_EXCEEDED + +
+          Too many messages sent by the sender.
+static java.lang.StringERROR_UNAVAILABLE + +
+          Used to indicate that a particular message could not be sent because + the GCM servers were not available.
+static java.lang.StringGCM_SEND_ENDPOINT + +
+          Endpoint for sending messages.
+static java.lang.StringJSON_CANONICAL_IDS + +
+          JSON-only field representing the number of messages with a canonical + registration id.
+static java.lang.StringJSON_ERROR + +
+          JSON-only field representing the error field of an individual request.
+static java.lang.StringJSON_FAILURE + +
+          JSON-only field representing the number of failed messages.
+static java.lang.StringJSON_MESSAGE_ID + +
+          JSON-only field sent by GCM when a message was successfully sent.
+static java.lang.StringJSON_MULTICAST_ID + +
+          JSON-only field representing the id of the multicast request.
+static java.lang.StringJSON_PAYLOAD + +
+          JSON-only field representing the payload data.
+static java.lang.StringJSON_REGISTRATION_IDS + +
+          JSON-only field representing the registration ids.
+static java.lang.StringJSON_RESULTS + +
+          JSON-only field representing the result of each individual request.
+static java.lang.StringJSON_SUCCESS + +
+          JSON-only field representing the number of successful messages.
+static java.lang.StringPARAM_COLLAPSE_KEY + +
+          HTTP parameter for collapse key.
+static java.lang.StringPARAM_DELAY_WHILE_IDLE + +
+          HTTP parameter for delaying the message delivery if the device is idle.
+static java.lang.StringPARAM_PAYLOAD_PREFIX + +
+          Prefix to HTTP parameter used to pass key-values in the message payload.
+static java.lang.StringPARAM_REGISTRATION_ID + +
+          HTTP parameter for registration id.
+static java.lang.StringPARAM_TIME_TO_LIVE + +
+          Prefix to HTTP parameter used to set the message time-to-live.
+static java.lang.StringTOKEN_CANONICAL_REG_ID + +
+          Token returned by GCM when the requested registration id has a canonical + value.
+static java.lang.StringTOKEN_ERROR + +
+          Token returned by GCM when there was an error sending a message.
+static java.lang.StringTOKEN_MESSAGE_ID + +
+          Token returned by GCM when a message was successfully sent.
+  + + + + + + + +
+Method Summary
+  + + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+  +

+ + + + + + + + +
+Field Detail
+ +

+GCM_SEND_ENDPOINT

+
+public static final java.lang.String GCM_SEND_ENDPOINT
+
+
Endpoint for sending messages. +

+

+
See Also:
Constant Field Values
+
+
+ +

+PARAM_REGISTRATION_ID

+
+public static final java.lang.String PARAM_REGISTRATION_ID
+
+
HTTP parameter for registration id. +

+

+
See Also:
Constant Field Values
+
+
+ +

+PARAM_COLLAPSE_KEY

+
+public static final java.lang.String PARAM_COLLAPSE_KEY
+
+
HTTP parameter for collapse key. +

+

+
See Also:
Constant Field Values
+
+
+ +

+PARAM_DELAY_WHILE_IDLE

+
+public static final java.lang.String PARAM_DELAY_WHILE_IDLE
+
+
HTTP parameter for delaying the message delivery if the device is idle. +

+

+
See Also:
Constant Field Values
+
+
+ +

+PARAM_PAYLOAD_PREFIX

+
+public static final java.lang.String PARAM_PAYLOAD_PREFIX
+
+
Prefix to HTTP parameter used to pass key-values in the message payload. +

+

+
See Also:
Constant Field Values
+
+
+ +

+PARAM_TIME_TO_LIVE

+
+public static final java.lang.String PARAM_TIME_TO_LIVE
+
+
Prefix to HTTP parameter used to set the message time-to-live. +

+

+
See Also:
Constant Field Values
+
+
+ +

+ERROR_QUOTA_EXCEEDED

+
+public static final java.lang.String ERROR_QUOTA_EXCEEDED
+
+
Too many messages sent by the sender. Retry after a while. +

+

+
See Also:
Constant Field Values
+
+
+ +

+ERROR_DEVICE_QUOTA_EXCEEDED

+
+public static final java.lang.String ERROR_DEVICE_QUOTA_EXCEEDED
+
+
Too many messages sent by the sender to a specific device. + Retry after a while. +

+

+
See Also:
Constant Field Values
+
+
+ +

+ERROR_MISSING_REGISTRATION

+
+public static final java.lang.String ERROR_MISSING_REGISTRATION
+
+
Missing registration_id. + Sender should always add the registration_id to the request. +

+

+
See Also:
Constant Field Values
+
+
+ +

+ERROR_INVALID_REGISTRATION

+
+public static final java.lang.String ERROR_INVALID_REGISTRATION
+
+
Bad registration_id. Sender should remove this registration_id. +

+

+
See Also:
Constant Field Values
+
+
+ +

+ERROR_MISMATCH_SENDER_ID

+
+public static final java.lang.String ERROR_MISMATCH_SENDER_ID
+
+
The sender_id contained in the registration_id does not match the + sender_id used to register with the GCM servers. +

+

+
See Also:
Constant Field Values
+
+
+ +

+ERROR_NOT_REGISTERED

+
+public static final java.lang.String ERROR_NOT_REGISTERED
+
+
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. +

+

+
See Also:
Constant Field Values
+
+
+ +

+ERROR_MESSAGE_TOO_BIG

+
+public static final java.lang.String ERROR_MESSAGE_TOO_BIG
+
+
The payload of the message is too big, see the limitations. + Reduce the size of the message. +

+

+
See Also:
Constant Field Values
+
+
+ +

+ERROR_MISSING_COLLAPSE_KEY

+
+public static final java.lang.String ERROR_MISSING_COLLAPSE_KEY
+
+
Collapse key is required. Include collapse key in the request. +

+

+
See Also:
Constant Field Values
+
+
+ +

+ERROR_UNAVAILABLE

+
+public static final java.lang.String ERROR_UNAVAILABLE
+
+
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. +

+

+
See Also:
Constant Field Values
+
+
+ +

+TOKEN_MESSAGE_ID

+
+public static final java.lang.String TOKEN_MESSAGE_ID
+
+
Token returned by GCM when a message was successfully sent. +

+

+
See Also:
Constant Field Values
+
+
+ +

+TOKEN_CANONICAL_REG_ID

+
+public static final java.lang.String TOKEN_CANONICAL_REG_ID
+
+
Token returned by GCM when the requested registration id has a canonical + value. +

+

+
See Also:
Constant Field Values
+
+
+ +

+TOKEN_ERROR

+
+public static final java.lang.String TOKEN_ERROR
+
+
Token returned by GCM when there was an error sending a message. +

+

+
See Also:
Constant Field Values
+
+
+ +

+JSON_REGISTRATION_IDS

+
+public static final java.lang.String JSON_REGISTRATION_IDS
+
+
JSON-only field representing the registration ids. +

+

+
See Also:
Constant Field Values
+
+
+ +

+JSON_PAYLOAD

+
+public static final java.lang.String JSON_PAYLOAD
+
+
JSON-only field representing the payload data. +

+

+
See Also:
Constant Field Values
+
+
+ +

+JSON_SUCCESS

+
+public static final java.lang.String JSON_SUCCESS
+
+
JSON-only field representing the number of successful messages. +

+

+
See Also:
Constant Field Values
+
+
+ +

+JSON_FAILURE

+
+public static final java.lang.String JSON_FAILURE
+
+
JSON-only field representing the number of failed messages. +

+

+
See Also:
Constant Field Values
+
+
+ +

+JSON_CANONICAL_IDS

+
+public static final java.lang.String JSON_CANONICAL_IDS
+
+
JSON-only field representing the number of messages with a canonical + registration id. +

+

+
See Also:
Constant Field Values
+
+
+ +

+JSON_MULTICAST_ID

+
+public static final java.lang.String JSON_MULTICAST_ID
+
+
JSON-only field representing the id of the multicast request. +

+

+
See Also:
Constant Field Values
+
+
+ +

+JSON_RESULTS

+
+public static final java.lang.String JSON_RESULTS
+
+
JSON-only field representing the result of each individual request. +

+

+
See Also:
Constant Field Values
+
+
+ +

+JSON_ERROR

+
+public static final java.lang.String JSON_ERROR
+
+
JSON-only field representing the error field of an individual request. +

+

+
See Also:
Constant Field Values
+
+
+ +

+JSON_MESSAGE_ID

+
+public static final java.lang.String JSON_MESSAGE_ID
+
+
JSON-only field sent by GCM when a message was successfully sent. +

+

+
See Also:
Constant Field Values
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + 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 0000000000000..4b3271c753ec0 --- /dev/null +++ b/docs/html/guide/google/gcm/server-javadoc/com/google/android/gcm/server/InvalidRequestException.html @@ -0,0 +1,310 @@ + + + + + + +InvalidRequestException + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +com.google.android.gcm.server +
+Class InvalidRequestException

+
+java.lang.Object
+  extended by java.lang.Throwable
+      extended by java.lang.Exception
+          extended by java.io.IOException
+              extended by com.google.android.gcm.server.InvalidRequestException
+
+
+
All Implemented Interfaces:
java.io.Serializable
+
+
+
+
public final class InvalidRequestException
extends java.io.IOException
+ + +

+Exception thrown when GCM returned an error due to an invalid request. +

+ This is equivalent to GCM posts that return an HTTP error different of 200. +

+ +

+

+
See Also:
Serialized Form
+
+ +

+ + + + + + + + + + + + + + +
+Constructor Summary
InvalidRequestException(int status) + +
+           
InvalidRequestException(int status, + java.lang.String description) + +
+           
+  + + + + + + + + + + + + + + + +
+Method Summary
+ java.lang.StringgetDescription() + +
+          Gets the error description.
+ intgetHttpStatusCode() + +
+          Gets the HTTP Status Code.
+  + + + + + + + +
Methods inherited from class java.lang.Throwable
fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
+  + + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
+  +

+ + + + + + + + +
+Constructor Detail
+ +

+InvalidRequestException

+
+public InvalidRequestException(int status)
+
+
+
+ +

+InvalidRequestException

+
+public InvalidRequestException(int status,
+                               java.lang.String description)
+
+
+ + + + + + + + +
+Method Detail
+ +

+getHttpStatusCode

+
+public int getHttpStatusCode()
+
+
Gets the HTTP Status Code. +

+

+
+
+
+
+ +

+getDescription

+
+public java.lang.String getDescription()
+
+
Gets the error description. +

+

+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + 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 0000000000000..5952e87ae04f5 --- /dev/null +++ b/docs/html/guide/google/gcm/server-javadoc/com/google/android/gcm/server/Message.Builder.html @@ -0,0 +1,337 @@ + + + + + + +Message.Builder + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +com.google.android.gcm.server +
+Class Message.Builder

+
+java.lang.Object
+  extended by com.google.android.gcm.server.Message.Builder
+
+
+
Enclosing class:
Message
+
+
+
+
public static final class Message.Builder
extends java.lang.Object
+ + +

+


+ +

+ + + + + + + + + + + +
+Constructor Summary
Message.Builder() + +
+           
+  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Method Summary
+ Message.BuilderaddData(java.lang.String key, + java.lang.String value) + +
+          Adds a key/value pair to the payload data.
+ Messagebuild() + +
+           
+ Message.BuildercollapseKey(java.lang.String value) + +
+          Sets the collapseKey property.
+ Message.BuilderdelayWhileIdle(boolean value) + +
+          Sets the delayWhileIdle property (default value is false).
+ Message.BuildertimeToLive(int value) + +
+          Sets the time to live, in seconds.
+  + + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+  +

+ + + + + + + + +
+Constructor Detail
+ +

+Message.Builder

+
+public Message.Builder()
+
+
+ + + + + + + + +
+Method Detail
+ +

+collapseKey

+
+public Message.Builder collapseKey(java.lang.String value)
+
+
Sets the collapseKey property. +

+

+
+
+
+
+ +

+delayWhileIdle

+
+public Message.Builder delayWhileIdle(boolean value)
+
+
Sets the delayWhileIdle property (default value is false). +

+

+
+
+
+
+ +

+timeToLive

+
+public Message.Builder timeToLive(int value)
+
+
Sets the time to live, in seconds. +

+

+
+
+
+
+ +

+addData

+
+public Message.Builder addData(java.lang.String key,
+                               java.lang.String value)
+
+
Adds a key/value pair to the payload data. +

+

+
+
+
+
+ +

+build

+
+public Message build()
+
+
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + 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 0000000000000..0773686b53afd --- /dev/null +++ b/docs/html/guide/google/gcm/server-javadoc/com/google/android/gcm/server/Message.html @@ -0,0 +1,369 @@ + + + + + + +Message + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +com.google.android.gcm.server +
+Class Message

+
+java.lang.Object
+  extended by com.google.android.gcm.server.Message
+
+
+
All Implemented Interfaces:
java.io.Serializable
+
+
+
+
public final class Message
extends java.lang.Object
implements java.io.Serializable
+ + +

+GCM message. + +

+ Instances of this class are immutable and should be created using a + Message.Builder. Examples: + + Simplest message: +


+ Message message = new Message.Builder().build();
+ 
+ + Message with optional attributes: +

+ Message message = new Message.Builder()
+    .collapseKey(collapseKey)
+    .timeToLive(3)
+    .delayWhileIdle(true)
+    .build();
+ 
+ + Message with optional attributes and payload data: +

+ Message message = new Message.Builder()
+    .collapseKey(collapseKey)
+    .timeToLive(3)
+    .delayWhileIdle(true)
+    .addData("key1", "value1")
+    .addData("key2", "value2")
+    .build();
+ 
+

+ +

+

+
See Also:
Serialized Form
+
+ +

+ + + + + + + + + + + +
+Nested Class Summary
+static classMessage.Builder + +
+           
+  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Method Summary
+ java.lang.StringgetCollapseKey() + +
+          Gets the collapse key.
+ java.util.Map<java.lang.String,java.lang.String>getData() + +
+          Gets the payload data, which is immutable.
+ java.lang.IntegergetTimeToLive() + +
+          Gets the time to live (in seconds).
+ java.lang.BooleanisDelayWhileIdle() + +
+          Gets the delayWhileIdle flag.
+ java.lang.StringtoString() + +
+           
+  + + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
+  +

+ + + + + + + + +
+Method Detail
+ +

+getCollapseKey

+
+public java.lang.String getCollapseKey()
+
+
Gets the collapse key. +

+

+
+
+
+
+
+
+
+ +

+isDelayWhileIdle

+
+public java.lang.Boolean isDelayWhileIdle()
+
+
Gets the delayWhileIdle flag. +

+

+
+
+
+
+
+
+
+ +

+getTimeToLive

+
+public java.lang.Integer getTimeToLive()
+
+
Gets the time to live (in seconds). +

+

+
+
+
+
+
+
+
+ +

+getData

+
+public java.util.Map<java.lang.String,java.lang.String> getData()
+
+
Gets the payload data, which is immutable. +

+

+
+
+
+
+
+
+
+ +

+toString

+
+public java.lang.String toString()
+
+
+
Overrides:
toString in class java.lang.Object
+
+
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + 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 0000000000000..f9df609161a3d --- /dev/null +++ b/docs/html/guide/google/gcm/server-javadoc/com/google/android/gcm/server/MulticastResult.html @@ -0,0 +1,397 @@ + + + + + + +MulticastResult + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +com.google.android.gcm.server +
+Class MulticastResult

+
+java.lang.Object
+  extended by com.google.android.gcm.server.MulticastResult
+
+
+
All Implemented Interfaces:
java.io.Serializable
+
+
+
+
public final class MulticastResult
extends java.lang.Object
implements java.io.Serializable
+ + +

+Result of a GCM multicast message request . +

+ +

+

+
See Also:
Serialized Form
+
+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Method Summary
+ intgetCanonicalIds() + +
+          Gets the number of successful messages that also returned a canonical + registration id.
+ intgetFailure() + +
+          Gets the number of failed messages.
+ longgetMulticastId() + +
+          Gets the multicast id.
+ java.util.List<Result>getResults() + +
+          Gets the results of each individual message, which is immutable.
+ java.util.List<java.lang.Long>getRetryMulticastIds() + +
+          Gets additional ids if more than one multicast message was sent.
+ intgetSuccess() + +
+          Gets the number of successful messages.
+ intgetTotal() + +
+          Gets the total number of messages sent, regardless of the status.
+ java.lang.StringtoString() + +
+           
+  + + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
+  +

+ + + + + + + + +
+Method Detail
+ +

+getMulticastId

+
+public long getMulticastId()
+
+
Gets the multicast id. +

+

+
+
+
+
+
+
+
+ +

+getSuccess

+
+public int getSuccess()
+
+
Gets the number of successful messages. +

+

+
+
+
+
+
+
+
+ +

+getTotal

+
+public int getTotal()
+
+
Gets the total number of messages sent, regardless of the status. +

+

+
+
+
+
+
+
+
+ +

+getFailure

+
+public int getFailure()
+
+
Gets the number of failed messages. +

+

+
+
+
+
+
+
+
+ +

+getCanonicalIds

+
+public int getCanonicalIds()
+
+
Gets the number of successful messages that also returned a canonical + registration id. +

+

+
+
+
+
+
+
+
+ +

+getResults

+
+public java.util.List<Result> getResults()
+
+
Gets the results of each individual message, which is immutable. +

+

+
+
+
+
+
+
+
+ +

+getRetryMulticastIds

+
+public java.util.List<java.lang.Long> getRetryMulticastIds()
+
+
Gets additional ids if more than one multicast message was sent. +

+

+
+
+
+
+
+
+
+ +

+toString

+
+public java.lang.String toString()
+
+
+
Overrides:
toString in class java.lang.Object
+
+
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + 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 0000000000000..14d4b34ce4a32 --- /dev/null +++ b/docs/html/guide/google/gcm/server-javadoc/com/google/android/gcm/server/Result.html @@ -0,0 +1,322 @@ + + + + + + +Result + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +com.google.android.gcm.server +
+Class Result

+
+java.lang.Object
+  extended by com.google.android.gcm.server.Result
+
+
+
All Implemented Interfaces:
java.io.Serializable
+
+
+
+
public final class Result
extends java.lang.Object
implements java.io.Serializable
+ + +

+Result of a GCM message request that returned HTTP status code 200. + +

+ If the message is successfully created, the getMessageId() returns + the message id and getErrorCodeName() returns null; + otherwise, getMessageId() returns null and + getErrorCodeName() returns the code of the error. + +

+ 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. + +

+ In a nutshell, the workflow to handle a result is: +

+   - Call getMessageId():
+     - null means error, call getErrorCodeName()
+     - non-null means the message was created:
+       - Call getCanonicalRegistrationId()
+         - if it returns null, do nothing.
+         - otherwise, update the server datastore with the new id.
+ 
+

+ +

+

+
See Also:
Serialized Form
+
+ +

+ + + + + + + + + + + + + + + + + + + + + + + + +
+Method Summary
+ java.lang.StringgetCanonicalRegistrationId() + +
+          Gets the canonical registration id, if any.
+ java.lang.StringgetErrorCodeName() + +
+          Gets the error code, if any.
+ java.lang.StringgetMessageId() + +
+          Gets the message id, if any.
+ java.lang.StringtoString() + +
+           
+  + + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
+  +

+ + + + + + + + +
+Method Detail
+ +

+getMessageId

+
+public java.lang.String getMessageId()
+
+
Gets the message id, if any. +

+

+
+
+
+
+
+
+
+ +

+getCanonicalRegistrationId

+
+public java.lang.String getCanonicalRegistrationId()
+
+
Gets the canonical registration id, if any. +

+

+
+
+
+
+
+
+
+ +

+getErrorCodeName

+
+public java.lang.String getErrorCodeName()
+
+
Gets the error code, if any. +

+

+
+
+
+
+
+
+
+ +

+toString

+
+public java.lang.String toString()
+
+
+
Overrides:
toString in class java.lang.Object
+
+
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + 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 0000000000000..4f1a2ac993bfc --- /dev/null +++ b/docs/html/guide/google/gcm/server-javadoc/com/google/android/gcm/server/Sender.html @@ -0,0 +1,662 @@ + + + + + + +Sender + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +com.google.android.gcm.server +
+Class Sender

+
+java.lang.Object
+  extended by com.google.android.gcm.server.Sender
+
+
+
+
public class Sender
extends java.lang.Object
+ + +

+Helper class to send messages to the GCM service using an API Key. +

+ +

+


+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Field Summary
+protected static intBACKOFF_INITIAL_DELAY + +
+          Initial delay before first retry, without jitter.
+protected  java.util.logging.Loggerlogger + +
+           
+protected static intMAX_BACKOFF_DELAY + +
+          Maximum delay before a retry.
+protected  java.util.Randomrandom + +
+           
+protected static java.lang.StringUTF8 + +
+           
+  + + + + + + + + + + +
+Constructor Summary
Sender(java.lang.String key) + +
+          Default constructor.
+  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Method Summary
+protected static voidaddParameter(java.lang.StringBuilder body, + java.lang.String name, + java.lang.String value) + +
+          Adds a new parameter to the HTTP POST body.
+protected  java.net.HttpURLConnectiongetConnection(java.lang.String url) + +
+          Gets an HttpURLConnection given an URL.
+protected static java.lang.StringgetString(java.io.InputStream stream) + +
+          Convenience method to convert an InputStream to a String.
+protected static java.lang.StringBuildernewBody(java.lang.String name, + java.lang.String value) + +
+          Creates a StringBuilder to be used as the body of an HTTP POST.
+protected static java.util.Map<java.lang.String,java.lang.String>newKeyValues(java.lang.String key, + java.lang.String value) + +
+          Creates a map with just one key-value pair.
+protected  java.net.HttpURLConnectionpost(java.lang.String url, + java.lang.String body) + +
+          Make an HTTP post to a given URL.
+protected  java.net.HttpURLConnectionpost(java.lang.String url, + java.lang.String contentType, + java.lang.String body) + +
+           
+ MulticastResultsend(Message message, + java.util.List<java.lang.String> regIds, + int retries) + +
+          Sends a message to many devices, retrying in case of unavailability.
+ Resultsend(Message message, + java.lang.String registrationId, + int retries) + +
+          Sends a message to one device, retrying in case of unavailability.
+ MulticastResultsendNoRetry(Message message, + java.util.List<java.lang.String> registrationIds) + +
+          Sends a message without retrying in case of service unavailability.
+ ResultsendNoRetry(Message message, + java.lang.String registrationId) + +
+          Sends a message without retrying in case of service unavailability.
+  + + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+  +

+ + + + + + + + +
+Field Detail
+ +

+UTF8

+
+protected static final java.lang.String UTF8
+
+
+
See Also:
Constant Field Values
+
+
+ +

+BACKOFF_INITIAL_DELAY

+
+protected static final int BACKOFF_INITIAL_DELAY
+
+
Initial delay before first retry, without jitter. +

+

+
See Also:
Constant Field Values
+
+
+ +

+MAX_BACKOFF_DELAY

+
+protected static final int MAX_BACKOFF_DELAY
+
+
Maximum delay before a retry. +

+

+
See Also:
Constant Field Values
+
+
+ +

+random

+
+protected final java.util.Random random
+
+
+
+
+
+ +

+logger

+
+protected final java.util.logging.Logger logger
+
+
+
+
+ + + + + + + + +
+Constructor Detail
+ +

+Sender

+
+public Sender(java.lang.String key)
+
+
Default constructor. +

+

+
Parameters:
key - API key obtained through the Google API Console.
+
+ + + + + + + + +
+Method Detail
+ +

+send

+
+public Result send(Message message,
+                   java.lang.String registrationId,
+                   int retries)
+            throws java.io.IOException
+
+
Sends a message to one device, retrying in case of unavailability. + +

+ Note: this method uses exponential back-off to retry in + case of service unavailability and hence could block the calling thread + for many seconds. +

+

+
Parameters:
message - message to be sent, including the device's registration id.
registrationId - device where the message will be sent.
retries - number of retries in case of service unavailability errors. +
Returns:
result of the request (see its javadoc for more details) +
Throws: +
java.lang.IllegalArgumentException - if registrationId is null. +
InvalidRequestException - if GCM didn't returned a 200 or 503 status. +
java.io.IOException - if message could not be sent.
+
+
+
+ +

+sendNoRetry

+
+public Result sendNoRetry(Message message,
+                          java.lang.String registrationId)
+                   throws java.io.IOException
+
+
Sends a message without retrying in case of service unavailability. See + send(Message, String, int) for more info. +

+

+ +
Returns:
result of the post, or null if the GCM service was + unavailable. +
Throws: +
InvalidRequestException - if GCM didn't returned a 200 or 503 status. +
java.lang.IllegalArgumentException - if registrationId is null. +
java.io.IOException
+
+
+
+ +

+send

+
+public MulticastResult send(Message message,
+                            java.util.List<java.lang.String> regIds,
+                            int retries)
+                     throws java.io.IOException
+
+
Sends a message to many devices, retrying in case of unavailability. + +

+ Note: this method uses exponential back-off to retry in + case of service unavailability and hence could block the calling thread + for many seconds. +

+

+
Parameters:
message - message to be sent.
regIds - registration id of the devices that will receive + the message.
retries - number of retries in case of service unavailability errors. +
Returns:
combined result of all requests made. +
Throws: +
java.lang.IllegalArgumentException - if registrationIds is null or + empty. +
InvalidRequestException - if GCM didn't returned a 200 or 503 status. +
java.io.IOException - if message could not be sent.
+
+
+
+ +

+sendNoRetry

+
+public MulticastResult sendNoRetry(Message message,
+                                   java.util.List<java.lang.String> registrationIds)
+                            throws java.io.IOException
+
+
Sends a message without retrying in case of service unavailability. See + send(Message, List, int) for more info. +

+

+ +
Returns:
true if the message was sent successfully, + false if it failed but could be retried. +
Throws: +
java.lang.IllegalArgumentException - if registrationIds is null or + empty. +
InvalidRequestException - if GCM didn't returned a 200 status. +
java.io.IOException - if message could not be sent or received.
+
+
+
+ +

+post

+
+protected java.net.HttpURLConnection post(java.lang.String url,
+                                          java.lang.String body)
+                                   throws java.io.IOException
+
+
Make an HTTP post to a given URL. +

+

+ +
Returns:
HTTP response. +
Throws: +
java.io.IOException
+
+
+
+ +

+post

+
+protected java.net.HttpURLConnection post(java.lang.String url,
+                                          java.lang.String contentType,
+                                          java.lang.String body)
+                                   throws java.io.IOException
+
+
+ +
Throws: +
java.io.IOException
+
+
+
+ +

+newKeyValues

+
+protected static final java.util.Map<java.lang.String,java.lang.String> newKeyValues(java.lang.String key,
+                                                                                     java.lang.String value)
+
+
Creates a map with just one key-value pair. +

+

+
+
+
+
+ +

+newBody

+
+protected static java.lang.StringBuilder newBody(java.lang.String name,
+                                                 java.lang.String value)
+
+
Creates a StringBuilder to be used as the body of an HTTP POST. +

+

+
Parameters:
name - initial parameter for the POST.
value - initial value for that parameter. +
Returns:
StringBuilder to be used an HTTP POST body.
+
+
+
+ +

+addParameter

+
+protected static void addParameter(java.lang.StringBuilder body,
+                                   java.lang.String name,
+                                   java.lang.String value)
+
+
Adds a new parameter to the HTTP POST body. +

+

+
Parameters:
body - HTTP POST body
name - parameter's name
value - parameter's value
+
+
+
+ +

+getConnection

+
+protected java.net.HttpURLConnection getConnection(java.lang.String url)
+                                            throws java.io.IOException
+
+
Gets an HttpURLConnection given an URL. +

+

+ +
Throws: +
java.io.IOException
+
+
+
+ +

+getString

+
+protected static java.lang.String getString(java.io.InputStream stream)
+                                     throws java.io.IOException
+
+
Convenience method to convert an InputStream to a String. + +

+ If the stream ends in a newline character, it will be stripped. +

+

+ +
Throws: +
java.io.IOException
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + 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 0000000000000..8312f46792965 --- /dev/null +++ b/docs/html/guide/google/gcm/server-javadoc/com/google/android/gcm/server/package-frame.html @@ -0,0 +1,53 @@ + + + + + + +com.google.android.gcm.server + + + + + + + + + + + +com.google.android.gcm.server + + + + +
+Classes  + +
+Constants +
+Message +
+Message.Builder +
+MulticastResult +
+Result +
+Sender
+ + + + + + +
+Exceptions  + +
+InvalidRequestException
+ + + + 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 0000000000000..27b05645858a1 --- /dev/null +++ b/docs/html/guide/google/gcm/server-javadoc/com/google/android/gcm/server/package-summary.html @@ -0,0 +1,187 @@ + + + + + + +com.google.android.gcm.server + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+

+Package com.google.android.gcm.server +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class Summary
ConstantsConstants used on GCM service communication.
MessageGCM message.
Message.Builder 
MulticastResultResult of a GCM multicast message request .
ResultResult of a GCM message request that returned HTTP status code 200.
SenderHelper class to send messages to the GCM service using an API Key.
+  + +

+ + + + + + + + + +
+Exception Summary
InvalidRequestExceptionException thrown when GCM returned an error due to an invalid request.
+  + +

+

+
+
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + 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 0000000000000..81efcef77867f --- /dev/null +++ b/docs/html/guide/google/gcm/server-javadoc/com/google/android/gcm/server/package-tree.html @@ -0,0 +1,156 @@ + + + + + + +com.google.android.gcm.server Class Hierarchy + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Hierarchy For Package com.google.android.gcm.server +

+
+

+Class Hierarchy +

+ +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + 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 0000000000000..5efe6f5121fe9 --- /dev/null +++ b/docs/html/guide/google/gcm/server-javadoc/constant-values.html @@ -0,0 +1,356 @@ + + + + + + +Constant Field Values + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Constant Field Values

+
+
+Contents + + + + + + +
+com.google.*
+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
com.google.android.gcm.server.Constants
+public static final java.lang.StringERROR_DEVICE_QUOTA_EXCEEDED"DeviceQuotaExceeded"
+public static final java.lang.StringERROR_INVALID_REGISTRATION"InvalidRegistration"
+public static final java.lang.StringERROR_MESSAGE_TOO_BIG"MessageTooBig"
+public static final java.lang.StringERROR_MISMATCH_SENDER_ID"MismatchSenderId"
+public static final java.lang.StringERROR_MISSING_COLLAPSE_KEY"MissingCollapseKey"
+public static final java.lang.StringERROR_MISSING_REGISTRATION"MissingRegistration"
+public static final java.lang.StringERROR_NOT_REGISTERED"NotRegistered"
+public static final java.lang.StringERROR_QUOTA_EXCEEDED"QuotaExceeded"
+public static final java.lang.StringERROR_UNAVAILABLE"Unavailable"
+public static final java.lang.StringGCM_SEND_ENDPOINT"https://android.googleapis.com/gcm/send"
+public static final java.lang.StringJSON_CANONICAL_IDS"canonical_ids"
+public static final java.lang.StringJSON_ERROR"error"
+public static final java.lang.StringJSON_FAILURE"failure"
+public static final java.lang.StringJSON_MESSAGE_ID"message_id"
+public static final java.lang.StringJSON_MULTICAST_ID"multicast_id"
+public static final java.lang.StringJSON_PAYLOAD"data"
+public static final java.lang.StringJSON_REGISTRATION_IDS"registration_ids"
+public static final java.lang.StringJSON_RESULTS"results"
+public static final java.lang.StringJSON_SUCCESS"success"
+public static final java.lang.StringPARAM_COLLAPSE_KEY"collapse_key"
+public static final java.lang.StringPARAM_DELAY_WHILE_IDLE"delay_while_idle"
+public static final java.lang.StringPARAM_PAYLOAD_PREFIX"data."
+public static final java.lang.StringPARAM_REGISTRATION_ID"registration_id"
+public static final java.lang.StringPARAM_TIME_TO_LIVE"time_to_live"
+public static final java.lang.StringTOKEN_CANONICAL_REG_ID"registration_id"
+public static final java.lang.StringTOKEN_ERROR"Error"
+public static final java.lang.StringTOKEN_MESSAGE_ID"id"
+ +

+ +

+ + + + + + + + + + + + + + + + + + + + + + +
com.google.android.gcm.server.Sender
+protected static final intBACKOFF_INITIAL_DELAY1000
+protected static final intMAX_BACKOFF_DELAY1024000
+protected static final java.lang.StringUTF8"UTF-8"
+ +

+ +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + 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 0000000000000..00826140ecab0 --- /dev/null +++ b/docs/html/guide/google/gcm/server-javadoc/deprecated-list.html @@ -0,0 +1,142 @@ + + + + + + +Deprecated List + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Deprecated API

+
+
+Contents + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + 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 0000000000000..72f9fb2edeaa4 --- /dev/null +++ b/docs/html/guide/google/gcm/server-javadoc/help-doc.html @@ -0,0 +1,209 @@ + + + + + + +API Help + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+How This API Document Is Organized

+
+This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.

+Package

+
+ +

+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:

    +
  • Interfaces (italic)
  • Classes
  • Enums
  • Exceptions
  • Errors
  • Annotation Types
+
+

+Class/Interface

+
+ +

+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:

    +
  • Class inheritance diagram
  • Direct Subclasses
  • All Known Subinterfaces
  • All Known Implementing Classes
  • Class/interface declaration
  • Class/interface description +

    +

  • Nested Class Summary
  • Field Summary
  • Constructor Summary
  • Method Summary +

    +

  • Field Detail
  • Constructor Detail
  • Method Detail
+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.
+ +

+Annotation Type

+
+ +

+Each annotation type has its own separate page with the following sections:

    +
  • Annotation Type declaration
  • Annotation Type description
  • Required Element Summary
  • Optional Element Summary
  • Element Detail
+
+ +

+Enum

+
+ +

+Each enum has its own separate page with the following sections:

    +
  • Enum declaration
  • Enum description
  • Enum Constant Summary
  • Enum Constant Detail
+
+

+Tree (Class Hierarchy)

+
+There is a Class Hierarchy 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 java.lang.Object. The interfaces do not inherit from java.lang.Object.
    +
  • When viewing the Overview page, clicking on "Tree" displays the hierarchy for all packages.
  • When viewing a particular package, class or interface page, clicking "Tree" displays the hierarchy for only that package.
+
+

+Deprecated API

+
+The Deprecated API 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.
+

+Index

+
+The Index contains an alphabetic list of all classes, interfaces, constructors, methods, and fields.
+

+Prev/Next

+These links take you to the next or previous class, interface, package, or related page.

+Frames/No Frames

+These links show and hide the HTML frames. All pages are available with or without frames. +

+

+Serialized Form

+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. +

+

+Constant Field Values

+The Constant Field Values page lists the static final fields and their values. +

+ + +This help file applies to API documentation generated using the standard doclet. + +
+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + 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 0000000000000..e6325cb8fc142 --- /dev/null +++ b/docs/html/guide/google/gcm/server-javadoc/index-all.html @@ -0,0 +1,431 @@ + + + + + + +Index + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +A B C D E G I J L M N P R S T U
+

+A

+
+
addData(String, String) - +Method in class com.google.android.gcm.server.Message.Builder +
Adds a key/value pair to the payload data. +
addParameter(StringBuilder, String, String) - +Static method in class com.google.android.gcm.server.Sender +
Adds a new parameter to the HTTP POST body. +
+
+

+B

+
+
BACKOFF_INITIAL_DELAY - +Static variable in class com.google.android.gcm.server.Sender +
Initial delay before first retry, without jitter. +
build() - +Method in class com.google.android.gcm.server.Message.Builder +
  +
+
+

+C

+
+
collapseKey(String) - +Method in class com.google.android.gcm.server.Message.Builder +
Sets the collapseKey property. +
com.google.android.gcm.server - package com.google.android.gcm.server
 
Constants - Class in com.google.android.gcm.server
Constants used on GCM service communication.
+
+

+D

+
+
delayWhileIdle(boolean) - +Method in class com.google.android.gcm.server.Message.Builder +
Sets the delayWhileIdle property (default value is false). +
+
+

+E

+
+
ERROR_DEVICE_QUOTA_EXCEEDED - +Static variable in class com.google.android.gcm.server.Constants +
Too many messages sent by the sender to a specific device. +
ERROR_INVALID_REGISTRATION - +Static variable in class com.google.android.gcm.server.Constants +
Bad registration_id. +
ERROR_MESSAGE_TOO_BIG - +Static variable in class com.google.android.gcm.server.Constants +
The payload of the message is too big, see the limitations. +
ERROR_MISMATCH_SENDER_ID - +Static variable in class com.google.android.gcm.server.Constants +
The sender_id contained in the registration_id does not match the + sender_id used to register with the GCM servers. +
ERROR_MISSING_COLLAPSE_KEY - +Static variable in class com.google.android.gcm.server.Constants +
Collapse key is required. +
ERROR_MISSING_REGISTRATION - +Static variable in class com.google.android.gcm.server.Constants +
Missing registration_id. +
ERROR_NOT_REGISTERED - +Static variable in class com.google.android.gcm.server.Constants +
The user has uninstalled the application or turned off notifications. +
ERROR_QUOTA_EXCEEDED - +Static variable in class com.google.android.gcm.server.Constants +
Too many messages sent by the sender. +
ERROR_UNAVAILABLE - +Static variable in class com.google.android.gcm.server.Constants +
Used to indicate that a particular message could not be sent because + the GCM servers were not available. +
+
+

+G

+
+
GCM_SEND_ENDPOINT - +Static variable in class com.google.android.gcm.server.Constants +
Endpoint for sending messages. +
getCanonicalIds() - +Method in class com.google.android.gcm.server.MulticastResult +
Gets the number of successful messages that also returned a canonical + registration id. +
getCanonicalRegistrationId() - +Method in class com.google.android.gcm.server.Result +
Gets the canonical registration id, if any. +
getCollapseKey() - +Method in class com.google.android.gcm.server.Message +
Gets the collapse key. +
getConnection(String) - +Method in class com.google.android.gcm.server.Sender +
Gets an HttpURLConnection given an URL. +
getData() - +Method in class com.google.android.gcm.server.Message +
Gets the payload data, which is immutable. +
getDescription() - +Method in exception com.google.android.gcm.server.InvalidRequestException +
Gets the error description. +
getErrorCodeName() - +Method in class com.google.android.gcm.server.Result +
Gets the error code, if any. +
getFailure() - +Method in class com.google.android.gcm.server.MulticastResult +
Gets the number of failed messages. +
getHttpStatusCode() - +Method in exception com.google.android.gcm.server.InvalidRequestException +
Gets the HTTP Status Code. +
getMessageId() - +Method in class com.google.android.gcm.server.Result +
Gets the message id, if any. +
getMulticastId() - +Method in class com.google.android.gcm.server.MulticastResult +
Gets the multicast id. +
getResults() - +Method in class com.google.android.gcm.server.MulticastResult +
Gets the results of each individual message, which is immutable. +
getRetryMulticastIds() - +Method in class com.google.android.gcm.server.MulticastResult +
Gets additional ids if more than one multicast message was sent. +
getString(InputStream) - +Static method in class com.google.android.gcm.server.Sender +
Convenience method to convert an InputStream to a String. +
getSuccess() - +Method in class com.google.android.gcm.server.MulticastResult +
Gets the number of successful messages. +
getTimeToLive() - +Method in class com.google.android.gcm.server.Message +
Gets the time to live (in seconds). +
getTotal() - +Method in class com.google.android.gcm.server.MulticastResult +
Gets the total number of messages sent, regardless of the status. +
+
+

+I

+
+
InvalidRequestException - Exception in com.google.android.gcm.server
Exception thrown when GCM returned an error due to an invalid request.
InvalidRequestException(int) - +Constructor for exception com.google.android.gcm.server.InvalidRequestException +
  +
InvalidRequestException(int, String) - +Constructor for exception com.google.android.gcm.server.InvalidRequestException +
  +
isDelayWhileIdle() - +Method in class com.google.android.gcm.server.Message +
Gets the delayWhileIdle flag. +
+
+

+J

+
+
JSON_CANONICAL_IDS - +Static variable in class com.google.android.gcm.server.Constants +
JSON-only field representing the number of messages with a canonical + registration id. +
JSON_ERROR - +Static variable in class com.google.android.gcm.server.Constants +
JSON-only field representing the error field of an individual request. +
JSON_FAILURE - +Static variable in class com.google.android.gcm.server.Constants +
JSON-only field representing the number of failed messages. +
JSON_MESSAGE_ID - +Static variable in class com.google.android.gcm.server.Constants +
JSON-only field sent by GCM when a message was successfully sent. +
JSON_MULTICAST_ID - +Static variable in class com.google.android.gcm.server.Constants +
JSON-only field representing the id of the multicast request. +
JSON_PAYLOAD - +Static variable in class com.google.android.gcm.server.Constants +
JSON-only field representing the payload data. +
JSON_REGISTRATION_IDS - +Static variable in class com.google.android.gcm.server.Constants +
JSON-only field representing the registration ids. +
JSON_RESULTS - +Static variable in class com.google.android.gcm.server.Constants +
JSON-only field representing the result of each individual request. +
JSON_SUCCESS - +Static variable in class com.google.android.gcm.server.Constants +
JSON-only field representing the number of successful messages. +
+
+

+L

+
+
logger - +Variable in class com.google.android.gcm.server.Sender +
  +
+
+

+M

+
+
MAX_BACKOFF_DELAY - +Static variable in class com.google.android.gcm.server.Sender +
Maximum delay before a retry. +
Message - Class in com.google.android.gcm.server
GCM message.
Message.Builder - Class in com.google.android.gcm.server
 
Message.Builder() - +Constructor for class com.google.android.gcm.server.Message.Builder +
  +
MulticastResult - Class in com.google.android.gcm.server
Result of a GCM multicast message request .
+
+

+N

+
+
newBody(String, String) - +Static method in class com.google.android.gcm.server.Sender +
Creates a StringBuilder to be used as the body of an HTTP POST. +
newKeyValues(String, String) - +Static method in class com.google.android.gcm.server.Sender +
Creates a map with just one key-value pair. +
+
+

+P

+
+
PARAM_COLLAPSE_KEY - +Static variable in class com.google.android.gcm.server.Constants +
HTTP parameter for collapse key. +
PARAM_DELAY_WHILE_IDLE - +Static variable in class com.google.android.gcm.server.Constants +
HTTP parameter for delaying the message delivery if the device is idle. +
PARAM_PAYLOAD_PREFIX - +Static variable in class com.google.android.gcm.server.Constants +
Prefix to HTTP parameter used to pass key-values in the message payload. +
PARAM_REGISTRATION_ID - +Static variable in class com.google.android.gcm.server.Constants +
HTTP parameter for registration id. +
PARAM_TIME_TO_LIVE - +Static variable in class com.google.android.gcm.server.Constants +
Prefix to HTTP parameter used to set the message time-to-live. +
post(String, String) - +Method in class com.google.android.gcm.server.Sender +
Make an HTTP post to a given URL. +
post(String, String, String) - +Method in class com.google.android.gcm.server.Sender +
  +
+
+

+R

+
+
random - +Variable in class com.google.android.gcm.server.Sender +
  +
Result - Class in com.google.android.gcm.server
Result of a GCM message request that returned HTTP status code 200.
+
+

+S

+
+
send(Message, String, int) - +Method in class com.google.android.gcm.server.Sender +
Sends a message to one device, retrying in case of unavailability. +
send(Message, List<String>, int) - +Method in class com.google.android.gcm.server.Sender +
Sends a message to many devices, retrying in case of unavailability. +
Sender - Class in com.google.android.gcm.server
Helper class to send messages to the GCM service using an API Key.
Sender(String) - +Constructor for class com.google.android.gcm.server.Sender +
Default constructor. +
sendNoRetry(Message, String) - +Method in class com.google.android.gcm.server.Sender +
Sends a message without retrying in case of service unavailability. +
sendNoRetry(Message, List<String>) - +Method in class com.google.android.gcm.server.Sender +
Sends a message without retrying in case of service unavailability. +
+
+

+T

+
+
timeToLive(int) - +Method in class com.google.android.gcm.server.Message.Builder +
Sets the time to live, in seconds. +
TOKEN_CANONICAL_REG_ID - +Static variable in class com.google.android.gcm.server.Constants +
Token returned by GCM when the requested registration id has a canonical + value. +
TOKEN_ERROR - +Static variable in class com.google.android.gcm.server.Constants +
Token returned by GCM when there was an error sending a message. +
TOKEN_MESSAGE_ID - +Static variable in class com.google.android.gcm.server.Constants +
Token returned by GCM when a message was successfully sent. +
toString() - +Method in class com.google.android.gcm.server.Message +
  +
toString() - +Method in class com.google.android.gcm.server.MulticastResult +
  +
toString() - +Method in class com.google.android.gcm.server.Result +
  +
+
+

+U

+
+
UTF8 - +Static variable in class com.google.android.gcm.server.Sender +
  +
+
+A B C D E G I J L M N P R S T U + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + 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 0000000000000..efcce9ebe50b5 --- /dev/null +++ b/docs/html/guide/google/gcm/server-javadoc/index.html @@ -0,0 +1,36 @@ + + + + + + +Generated Documentation (Untitled) + + + + + + + + +<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> + + + 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 0000000000000..034838be79d71 --- /dev/null +++ b/docs/html/guide/google/gcm/server-javadoc/overview-tree.html @@ -0,0 +1,158 @@ + + + + + + +Class Hierarchy + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Hierarchy For All Packages

+
+
+
Package Hierarchies:
com.google.android.gcm.server
+
+

+Class Hierarchy +

+ +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + 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 0000000000000..5955cc0827f5d --- /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 0000000000000000000000000000000000000000..c814867a13deb0ca7ea2156c6ca1d5a03372af7e GIT binary patch literal 57 zcmZ?wbhEHbIIT!9-C*e{wE9>Kx3D)-;0v)C; KYxQGgum%9JOA&7X literal 0 HcmV?d00001 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 0000000000000..86cd61a55fe31 --- /dev/null +++ b/docs/html/guide/google/gcm/server-javadoc/serialized-form.html @@ -0,0 +1,355 @@ + + + + + + +Serialized Form + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Serialized Form

+
+
+ + + + + +
+Package com.google.android.gcm.server
+ +

+ + + + + +
+Class com.google.android.gcm.server.InvalidRequestException extends java.io.IOException implements Serializable
+ +

+ + + + + +
+Serialized Fields
+ +

+status

+
+int status
+
+
+
+
+
+

+description

+
+java.lang.String description
+
+
+
+
+ +

+ + + + + +
+Class com.google.android.gcm.server.Message extends java.lang.Object implements Serializable
+ +

+ + + + + +
+Serialized Fields
+ +

+collapseKey

+
+java.lang.String collapseKey
+
+
+
+
+
+

+delayWhileIdle

+
+java.lang.Boolean delayWhileIdle
+
+
+
+
+
+

+timeToLive

+
+java.lang.Integer timeToLive
+
+
+
+
+
+

+data

+
+java.util.Map<K,V> data
+
+
+
+
+ +

+ + + + + +
+Class com.google.android.gcm.server.MulticastResult extends java.lang.Object implements Serializable
+ +

+ + + + + +
+Serialized Fields
+ +

+success

+
+int success
+
+
+
+
+
+

+failure

+
+int failure
+
+
+
+
+
+

+canonicalIds

+
+int canonicalIds
+
+
+
+
+
+

+multicastId

+
+long multicastId
+
+
+
+
+
+

+results

+
+java.util.List<E> results
+
+
+
+
+
+

+retryMulticastIds

+
+java.util.List<E> retryMulticastIds
+
+
+
+
+ +

+ + + + + +
+Class com.google.android.gcm.server.Result extends java.lang.Object implements Serializable
+ +

+ + + + + +
+Serialized Fields
+ +

+messageId

+
+java.lang.String messageId
+
+
+
+
+
+

+canonicalRegistrationId

+
+java.lang.String canonicalRegistrationId
+
+
+
+
+
+

+errorCode

+
+java.lang.String errorCode
+
+
+
+
+ +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + 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 0000000000000..6ea9e5161615f --- /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/guide_toc.cs b/docs/html/guide/guide_toc.cs index 44b977e327dd0..293d7d771d63c 100644 --- a/docs/html/guide/guide_toc.cs +++ b/docs/html/guide/guide_toc.cs @@ -614,6 +614,29 @@
  • APK Expansion Files
  • + + 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 0000000000000000000000000000000000000000..5dfa4349f2f7458e37b35fe787abbd15b0f59a71 GIT binary patch literal 38437 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

    d-ToS;_~apI>&Lb*;f6Z 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..986fc6320f5aa6017b0b53015f62531adb1dc00b GIT binary patch literal 17305 zcmdU1g*%<^|9^B0JHs#?hsj}jI_EGWq z{0=UT%XQB4-0^K5@@`6WIsIW7c2_y~C!HSm1_f>4~XQNd3YkDfPzZz%3+FQuT0 zQOYgw1jj{Q*Byc$5dHUs0;Ok?fnQ>IAe3aW7BGoXD6q!fdLto-7DC8KYWU3Uwt9P5 zyi5}_@RZ(Uu4|eq&vehs7`F&T{wDTU61WD!x!)KOicb5Npl2}gIadzmvMBbmMVoi~tLW?W+@W?K6FLro10 zvNJins{W|HSSp?;N)JdlBnb1ExBX5$(+dTh7QRgGK$tLz*i9q<+qzc&b3OKy0g6bJ zkOP0sAGpn3`$s;n5QXol1Nv878*v`zzGQb7{~Zz~_#GVS4bA>5qGX{?;+ zp{e?n_U>6`27R*slx@ZHU$%@2G%tO!Dqs)bNEB9FP6GK#CIQE5<^sguksloqb~ z$Cny`&A=Xkq{SsfGKbpP+5PLO3^MintKgL>CxU^Ew{ndxycu>FwVdOBTsk(lS4>Z6 zS*$I|*4x+DDpomSSMym1UGk&fV{|xKitCH44Y<3TTJ_N0v2P%m$%kC6qLIicM(nmz3jM^FqJX^FCSmgoMRrGFy4gBYI!M8*n7`|K=|arG0pX{dCkT! zJq{t^>)#kqh+L`A;q)8pY~PK9m(;T@mM2TC{`Z%C;&SGyh$Iqrox}IyH*}OZ_dR_L za0Qxpfg%H@JNY*r~vRrlM=TF{j=P;Pq=?`hb6gc8}#t6D(ZGAm`Sb9c= z@QW9Ca$Sqwi;mCJ;=|A-O>~&(mT#@5GfW(V(2tSe^p^3&ne)zulc`kgf{i}Zbs zUUZ7F?mbf5HNyFGP56dS~S>xG-$NfFY9L2vkB^>_02-si*DgW`$-e zTmC6{dkc)6EZ_7Bv>F{`i~7qWZ}uLvTk6Q=PeFKaIL2GaIyq76QA$0@RN`cGX-QPV z1fR9}`{f4C%=XusnrDj#0W*8v!JGQajrVug4Gv3gzkj^34mukqiW9GLIg&!eud(DY z3E#s8{#PICp-?!4PReP}5^(h#fee9=w2gg>WPfh4&WS=g$liC-RnC;YX7NriS>5FRXZUfV(xse-rpUchSvZ1W@{fJnXA}`qC_~4Q8_>4ec<+LG&IOu^`%CO z4xxP>5~WD=CW4P*yX}0c(xx_@0xO-TW+HDq-hQFSy(J8;O1M5=^!f9bscq@^1a@1v$PsKccu>l5B#wi zvNs>nytwHW7q9Z4*(Ws$$aS(cG&j$e%b)#f+BH?Gt&$~H7ue?&UB!-2kjR5jt661G z)lvkCNL_gS{PgI9F#6lSnT_fx<#R^4O0~v1zX!eG?kUv{Rg7=DQ0q z{*9puLqR1(3MNE_n{$&%WAFWHTeXi1-t!weJGdG0mXSM;-b2O7ynWpf*TDE4O|auw-ZLlkaP04-A(M!6H=t`v+K5WTX40uot&i)r_VdJ z@Ac<0JXOyA&|?nfTOO?BweIi-q(SRBZO4hh*Eom-%zQdVmhg3**wrN5f)1SH;t|)( z{z!QlyuRTy;iBMA!DGVyOgBWRbl7+>4DM&>6~<@6STC)ohJy}s-&Yv5^**3fniT09 zT6hS3Vz%?KxxB;LZnY9($v&c3A#X3&L}2m*xGK{SGJHu$P5k*Szd?i z7D_>?iOr|Hfyx#Q^EEX!8T#o@-m!3Sa&U6S_2%{T^we05nwh;4A&IMTeP=3|vMQr2 zrpbb#DO^+E)YR0HCqjmYiU((RWq*2{$NYh^j~kESIIrw)|D1rVs&T;YD70HN|MUHE z3HGlYCgz*V{JRudgr7GH%#FivKQ=&8*m6x%B2W9N65vAnPwxK-v@K0cxQ(@5+#Ed& zmLY7~$!-q1tI3JOi@VvLH5R>JIKd6iYi_>2+RQO-GrO8#R6O{061$yl7dAdRxMtH&J&l1>afb1u)IkP=Xt9}5 z4_Dx&Q%pIFa7hAuf^ccmx8Dz^^_@+l8CB=L+2)68#iQHS>C8AAsHi60rUzckH*b!n z?Z|t7E-2g!2z)wr@_>{h;B@?@qgMu8fy^v_fcfAPnJE&k&dzdmb(KP_=%}<;tX`Ca zyMFyj3SF|l_u`?lZYK_7dk*H!2!xKH4fBb8iS3Ho=jI?njYal@mnyCY%=uWh5Jg-c zqiQHjicldB9)V;}K1Nl6g?*4ov1Bwtj=X2@L&f9j6&V^jcMOHYRhw=r=5LMed)Q)T zmLg2hEg3=_^5~&Abo^W8o|+jH<|;^nIKvgi=k zaHJ-ig}t~W;jxVBi)4aF*z_Ohf^s;}%up9^1n@8CQIc2-l*<$0EF@8lhWoJ#G9^aPMg+H97S~vh zDJOV$B-t=Q9lY&#aZR1;*h6viT^1BEE%`TTW#`Lsu;8FD6j~GsbzP1svf`9!5>ym) z6zK3a^8*SddVul5->2OU%4p!$aUc`u>6pFXlTa+^4fi{kI~3Oa{BqRvrdT zGxL9VW-_Fm@(|_0>`(C{|1B5{1&^*9CjANu;qHc^ylUxN)Vaeo5$Yva&3JSk!SyYy zgmFlK=0kb#L$29CGe#w}yN9R{9FoHs!ITJD7pG(5l0*rSiKYz=?LI*rI}zz~M~7=D zJeEyRC{U335YY$gM3-f@35O#>JJf5X^3~|@1XCWtBMRk{)s$30BfuNtqD15R%%V^} z&HR`bLPz~WOkpS$BykXUh64%WUoK-oI$>nAc(h@J9o43|wCHp&?mRe-G`1`PPgW|F z_H$9;Je61U(XY#2VZov6LaML_4<4Mo2&AR_d$6OTsKmy~y8U zH5@f98Za^YbM*74#`~^E)_+#yzqJ>MSJ1}1U$P6hTOLYWjpyN?w&1(m^sU zeya8o+IrT;vj2z0Kj@Dq`Qby%jsv0ECI2|fWkM(f6&nFP2$h%k=6EtaILMkaR;0n| z?|7d)DkVc5|5UcI7gH+wInDm+P-`&4I zw>-F+Qj)VY8@@UHp2kw@(a$zzH9 zgdO<_k#71#XgBQ>Heb0`u_g_R*i-)dxWvjLl;A$-6-0=-B}zppP3xQnLy?GZv%!>V zob^pk)(pPvqKTyx%~Q2y*HUDrY+4-^K7Da}5qugr^KmHKj?~9=w%QVJ$il+nkg{@e z3(xQE&>qqUu_hA&aUK#PoBW${?zSdLqSmqQ|GiDCv7#1q`BdHFc9Jpz>i{)m#=FhP zP#1vDOds~_w6ra^#&<8@Sx=4Pz6<4Sxs(ziH?DH)0Zf}E@@x4}Bdi3&pxMG03M7yps7A&&-WXlc}Y*6XU5L8#H(QrHa9+=Vu*Y&@m;`CU5~ z8ylPNq*v;8X8abi1(t(OzF*S-kbi-7vlV-4e7`Ycm3S2^yl>-VdpA24biS6TVpV93 zDfQ;cee)o|yhyEJq0Q0X-JOT?(C$kwjWe$j8EzrUJu`G8slB5C<-yqpOoQa5;F3_t z?Og<8RLYmS?dA4Me<401#D{g=$WNfJV4Hb(B*6!67H%3(Hur<EbJg3Ip%fZ1Bh!#js!pNKe zXTg^8*A^bC+L^AX(cxGfb$z6GC{22kU4B-$FOGlt5(Scwpp`_o+-WS!k;dcd(1~rt zBKyiN@Pa=*JH^OIE9iV-_I%V!5~iVGY3*%oC1>R;`vg-bfAUKbt12-I67aY3G}XkF zew(%+!-~m}N1ZlE2HQw2*5nh?VF0%T(w%MU(p})uu%;!C+wK7(087Eh$19YpeIbS* z1%w?hc?b#$_8U^>NH;-Bj4KS*WL8RS^AHp{Y(>aCj4}FAFJbS*&xb{A%4m0YC=eaH zX&5}@QHlUh7)$~i?E}P!APjqr{9LhLu`@C=Q(@TbvLY4L^Ze0AuD^IiDp|@(O1FP* zjq%V!t8{idR?vuLpWwX%xyV7BJ&$?04BZ*C}M zXtHX$+tA%SImW4WQ$MZ%0I2=L9dF)h~fyw)scI=S z`1HC2871VCc#oDj1d)C8=7MN5dmaC1*ANZI7El=5h8(C zDJrz%NCc87&`=}Bx19O;Qf5p!CL;@s846RmESZE$q7YpeHmw4`x_Jl?4<508$&8+l z4~&FKgsbJgo=D7K^SMvC5t|f%0HI1^4Oc6UPe?T7Buj)BkAGQq7nX#ePekQE1n%EM zsPb&YZg$K5;#g##F1jraRjW^Uf71}UOj?CGGrfl(<}fJ!ZSGV2k5IoPB^gn?PvvXc zcaTZ+ibna}ZLD&Lvt8f88Hex>XQz$oK1!1t*NTa-xXo3A&A)+${Yzl@#93*-V?Hl6 z`9Md@C9#HV>Vcs_Fic2N#)Q2FAN_SFWI`*+txB%=%;XRStr-2YZ3pk~N~r%41-7|R z1wL8`H!Ae{RVE4qd#&ZqB%o&Y{KoD0-Zs6kT~>z&`YT$+^~gYM#BGvS348_AS5EfNRN=`3{5)$6}ZZmFrOYqCD>bFH>hiI>sSOII#h^&x=bkx2R(-K3*x%cOO& zdgGc|_Ed+PFlBr>wBAei$|&|kxqO6@(&L^11r(g;>Cq5cC_EZ-wJ6iNF_gN`HD@4% zE)0P{un(obVv5WYyNFzcBakX$S8!QXAbf-}e>13PHR0> z=k5Sa>;#pDAY9x#_NQIljzAfxCt^9AnHhH^b?-ynws@I zg7EP0_4Rccop3-RfzGN|K5bRQn3f1Zyh@~Nr2QegySsC9dSEi$bv!*i!R0z|D=8|L zR+JP1_#{!TrLCovlAO$vtN=+^T3UK~)=4@uSF#(|SSj(6XtE}gM1|90hteLOoS;CB zLXC3ys+E(Zsl+>Heyv6ip&whGvApjo#U&;^{N(&1`3k;$A%je6=74Crc8&t|6!e^I zjFy&^42}%Q(j!a1Sy)+&rt=LU9S~#k!D~Zt!)c;@p9CQ2*zF`TDr((okH2}qqNKb$ zxiYV?P%hgA3en0hFZ(h)Jk0)#l?i9UsevMM*zh)aYQ50bAdva+-aJZN6d82kn}LGt5dmTBUgv4#@UsjAgJwY_3u*}Y#? ztBc;ttpQur(Ji;<^T~FMMAiz5ir%etin$shmp|Sg4wJR=>eX zblFFYjb~`*EPZ4Hi#niV=ZN4TzVORTux_>Of08E`=2ich(l$yy_!k=fKtVx)enp;{ zvgAwI$3rDve*SIzfAjm__OO=kzvszDkv!8AOujFSx#BCo%V}Z*FcbYjL=$ zUSF*^+Me6?K5wb9I3i3Omw|=3cl&M{dSgmU5+dPBK+JzbDkmpb?N;rfw|HdUM~C9v zx~J91J8Q8{Ym~`t{!S`a&~2@MqNyOkrhE0AHtdz$WWKRqZ9`>4K>=esZ7^bykbhK5 zQ@izi&VDHMnLv8Xkxh$}?qbcDh&?ZPdGYl2_ICOcz9SohVy$;?S8g%`>g38_vu-4f z6qgsT>pT%S1XDJ*FfC6Y0O>KFQ z{kGvHkLtOj{^=H$Qp(%;{o zgGA9(GFNE8p-vA4amfr5(hp{+0uo;5ruPVw&_MwU+oTr{U7d%|5%)AEiu*Pf{D2N z?nvl*X@N;aPJOI&`Fw(hghMAOD@~M(>+s)B<$LLs@F)@jeEhwo*5>?ja~qfb%@faB z@7HjE1aLxWX-#Wp3rC?YZoIC3?qVM6VUOm;>M$i$4N2AS`wiX~=jTAXQZIO2SJ%K% zuAgp(&}}x|J0j|PNd3Y_sp|afEG?R;W*{>owN$J0A*GipLe3 zj>3BN)y+XD3qwMGd(gdc@L8#`VSA8aeAxGu?>f9GY1u;0#r~XJ0S(Wb!Q8jem%Z;_ zfLK~-uUwzm_{Zg)nJ>I<(%5uHf09`lA(OEs(Y{!knz^!;ejo;1T#L~uO^(cDP!aT% zB$rkgH^=^18{hGG(Y1oe{b5yy5sDJmM-(HMrTkP9Hmf^}TbEb+nU^}w+sn(#+k4)j zK0S>uYccD{htm8N^7E7(nAWHsvm+l7Mj_e!NegRBP**9%gEI4&eb-*b(TofXT+Pk2 z70&E1s&*bUrUK=LI5{0TH#bdA@SeL@cS~2AL7FKA^5!EVDh>geI$LCvq&FW>u zem~)@#f#2wqILV z$rZxo;k2@naN2~N9MFY^nN9%W>*7lAu`n^AC5%|J*n|8Gi3Yq!D(?3}94zg9k(BHrmstO$zzEyoLTN_T}sor`V!Ayxi z^qd}|C5#H|T4`7g($`ufyy4~*JiVm}2%ayWCz;|Y{GXZaYbxA<;Vwc=|;L$TEq%wGQMN`X%LkGjFt!tnXa+7H@YAjqG z?|R9w@*$x0IG@5O;Hc-%@gM#ArQ@ia+t6g4#$`Zw1N|?+O4Kbw9*{#FG^f`sZK+0n z2q*WeBh%P;xq1kA-;FugwIP++)1!J;@Kao#v_$YdtreH^7%Gtf+8` z48COueXf_TZ#9yAmR}U)aeO)eT96NXv}%FoZuQ}q*!^yWfcK-1E-}q5PMl%!>pC;v z*cf;i$YTe~$9ZqN1+oR*k6)RaGe9OLCK9Dn{AErbv6XZjwZeYXvCTNmx()RzQE+#^ zMSIIJqfg8#>uP)C9CSkAyCyQ$P+uRks=xf9H}4MTeqAv&|CPro2SsyJ^RCzR(EU}l zLs^=5a2p)qE9A>D!r|!XXg^*4oop;ifRwJgdUu^Iwf$(%*`P6?pt9lMFrn*W!9VW1 z4Xv%)Oz7cj5D)lY7GS5@DERj5Y1>hE+wFCdLV^8oGBUFh$DoNploEH@cQfnl+qaJy zAEN}*s`^<10b(iCw{)grbaW8N8|qyI7UbSB8Hpnmt~2jBgcDpoJAZY)id>HmLku7e zTFzoetlWQ50TI>XdO;xFsee}=Afm)X^XD1p%D;W7X}`J*bhhoc@mP-qtRGco3VSOP z_iPkypsO1-xolPVAI#MU>N6Am5!{#Ci2>Mlufb`?hR?4xd-LjL`|)3i<&OOZui!f` zg%nf&CjYf|3`v(pgX1|-uU#EEIZWtx<7Rdjwjy%vPE0fhDU1LE_nB1{HO=t>}rM)XE?=8Nc5kjXvD%tw108+jOd(d3iZ zu(#iT|NZ+#p+K!9$+6rKCl`Z`I7SW&6BB~E-gb?eS_ASB9Na#%uBXw!Oo<1ue-oqU zi`I(bVip*-PfK>$aG4K#oBO7+Bt&ZliW^_WI)u0mbh+}vnE9wq11 z?GwK*cyiJv^juSoeb3nu2`nkZvvDuP#GJUue6sIP#ikw-m4D(RS7N@jRgoxHe!z8U zQJSkDIXeqWvA&+QQdP;%lJRj>)yogLz$yi` zaOL$!(~sgsi-RSDH=#ExE2dZ9b#Q1(znefX`MjiU`IsKF9IKv5UdQJdg|RP-W*irr z>b`#ZT35%H>$Dtvf15>>RmWqOTCQVNr|aowXzXn4=~%}wvO@08Xre2mo0APlN^x;9 z_?v6L>%yRqX<1jP{9@Molo?YS9xudE)OqsdieLY`y&H?CYr9=*u#J4i%-laVcHtv( zbh&9#50}o3AKTIYX0vj4d)@q^*(UuRtZ+`9=lOHs39`QhJ05IszpSN$lcBQs)QtBi zDKk~$7G)JB%5??luL@1Ln4M#cza2aP*&XwIb71SJx+bU<<6%e(2?=HJJ0k<{8xH@h`|vl$*Ch*!l|G8hf+C*y12;jGx#0n8l0CW3KZXGfdBkg(T%Mu)VaRCcI4MLbM-WYb%Q; zgNpDd(q}rgw3GzS04EeRzo(7Bq6y+6!=C1-BofSRE~P-rOi9tw)B3kR>%Cfa*`&1N zLB6=#Sc73i%i=bkCu>wGK!(TvQ{a**08lo9_vU;5>fn;k^jf~um3uB_`j&2Mhv%F@8}VFK||)t;+EpWoSb$HqOb`2j9&3Wu>3f7*jcTt9z*?MmHNklBdQ zo1B_reEMeuti7JW$9Bnn8^dXaS%v_z-WHy{D6eSCZ7XfI2U!+FQNtshfQ_;=*&bO1 zJr)GvP?h(xdxKU{-CWt8c#hbKYjT{Nl1NloS+-yB{(d9Ph@&Z;F-=9-^c2@$t2`wt{+~sHjNg_0rbTc0Q(l zZ@vMH?FnJK*?MG4i%2Lf35VX=k&o2(AAuLksX!8`(%BfzVRJt*J{YHym-4C`Q2g;l zz^FCgY$46vuXSnvD-oRA{d~CXPE5Zo+}RUbcR|FhZ`dvSV7 z8@5)EmYlqP<|C8>M4377za4MTW-5)1Yi$zx_MVVa+BrJzZSUf~?9_f{eDqBeREN@` z_2a7mminaG8taT#Oev-+RN}I#8oVT}9$RY0!OJa;CtMwvt)@OMm;K)v{9468D9FK~ z3}Bsqbvud4&0GZNs8u?z_#20Ky_Xh1bwGoj88*Uk&Gv@pD#h+Jg*Ir3anpvGo-8cR zQpNRgW;TCPD+aMEm$lysf&S-@ACp>cS}fy*lzb8M`2E^l(S2`Nujc#0?5wW7enxh} z($}Vy!5+5j^L@Zesj{eEWIbbK>{)Sv>m%c+Mg0KMj6IJPBytXD;HJcNUTpKUv0;Yc z5rYQ_G0ECvyz__DB0jH|O0h$KftX7!+WXOLp&fEh1hV#8yyH3E7I@z^kP5({w(C??yf>9?z-L0^0I{CDd(m-_xd$44R&8&@A~cP z--LWc5>Ak}aJ08y)lp8lCwm7b5DEeHOs^D>d<8|7=FKI4z@;jTnqO>TX|t`rR8}WG z`yu^M^jsy5L-!jx@-?wcBRUfVAwHN3LK3d7RRcDx{hVY}2_iglEDY>B6!GF|NJpitY#d^=6}vh7}cYbLPbpp z;N@{sDD1@q)!yEoQ=EUl5IWr}Ma7yz9mPn+P$J2LZx?Gvi9je+D0t4pb^@vu9HEex zl#wyNIJ*b*HZgIOh+;#y*(NUT1B(k=kWmFwii0?^S>W4_>@lkjK4Tbt9T|rHlj0OJ zk&b~OzxMNKXX68OI2_?dAZ%Xsaeg(WM>oavkzCqrS_OCN*v`rIEdv9Co5@e>m2uy( zFt&Cfuiamh;=wOwkpZWNszRHdCG7-&fn^?oyuxK$>ot9Xyj0q{u2H#`c^Cyb`3=f_ z@aL z2o|U{2E;L;5@B|IHlF(=P>VG$&Y`}PN#(;6Wq|zrXj5L&^}BP>ZAMa3Qrz&f_vpj& zV_&|Mn2;3~G%}LJpg_QH-5kvVDo-oXQjcep^=S6&>t(J-nI>d%xf<;H^}Fl$0cqA( zfKfciJUmw93_gpfY`Yzu_seQ)Y}7@OEiD3p|61WG%S1i!%4=Ucsz~G{;I=%u5k_Y@CC7pGqxGa z-jU(KOd)e7S#_B7)k@fq)-!v1r}<{@gH_{TgP?aa8dxS~!ahK}G7h{cRRV@a@?)pe z>;43WhvGL}<#}`=qOGFkBjwr^hQQArQoKJy2GrpenBCvqdM^g1jyS2?YB=u&*n{V8 zq{Om@&2CCwmV18YGm95XfnZWB*;2r>RH@v{Z*w-hvYZCBT*93G)6u$|_cKF)LBEmz zWa=obC#P4!aJDYqdNb}Iqq?}a*vm;K;IzbiY$j>?oo7tsWGi};j0=xPgqJ;%UdqPI ztaB%AL2B5_U4$exeA-7ujQ<5mjGU$TXXeO!hWvHSbwZ@P1PKXAgPyT38T6JUAYOmXX9)ojFGFUu9@JO$fy)}>M)~SVZ_49z74vB zty8W|{s@mGbppf~!{oTLAqXX0w6kvC!H=8``bHUZCs&y*vF>7>N zSAY{fc|ry3gH-s|-lFr%{Bh7VNgqGP$0MjUa6bCi@?`4?+FLYfH0e;<=;&y;hIX{8 zzCA_x=UGAj-To?h-sd8`3)9mZUxj_%vH@RUst-+t#KYjZBb4wj4MKJX5-D!X_#jc`DlDRHX zzJ)6cAO?)$F4ph;bla9T3aw%{Cn#+N^qhSbjb?SpW8@fB0bB@bH-?3cCyWE1Yxh?b z=n2sGlQGeIfhrYs;)0o-oPP~PzzGsVIX@lC9_{b{VZ+zM*rO6~64AX0*6O_TVuf0< zSm}{X-Q3e`pS&+$|MJ+D2YKEC#vv9cy!B+u*#E|!KSQZ>>X~ufO|0<2$8+sKOzNz- zto`9r|NYjYn%0vML+7B*gQ%#;hTUJC)n&{d07UT587B)$QF#w&ZHDvg!mnR~g1ndB zd~Y)ZoJZOEyU1QLj4$8cUC?a#eJpJM$YPsbKkLBWhl%#R{k=<*?LTql&kE&Do_*zj z+HIw60rikh7FdvhPOo%THLGln@_-%=xD}8r$YV;Tw)6hbN4tnnKV_L%afwIQ)zec@ zP1^N*H74Ijb|PY|qwz5_bNAvJ5n4M}1_2MtA;nZY{y;=&@-%geCy%*Ab9+2N^~yPa z{9C}f8zd1ZeM=#{`~jW*BJijUs2Oh_vzD?M`|t6+Axh!U_d4z#cwDLl;nnIny80fy z5yf(v^?1O*Wj@M1TPp@$Q=4dfaW=5^>R(*&@oL@9G%93gJ^f;Wl40}_^!<2!h$XV5 zxJ=0J@^4y=HB5@JhY=W>Fe!6nRa40e7&aar-a_EaB02*8^r^}v(~{`56Pz$Dd)oG& zhA?BFt8>e_oRyYUSNgjtdo4Ci1^<%Pub;R`A{q^yAPHI+nRg5tgo%YY#5TD2tf6lw zmsz1e3pjd5l)>kxx&=}LT(6A1mvf%{;s+Osc!dM~7OW_0?z7+rjIyDjsG+=WuUudm z99m#-c%DYc-7Z#H*^-y}xxeDPqCV$$YeA)QB#uF z>XkQp?Y)ne1HWz15uahErC}I^ycN?p{{eYgcl+7M8biFbZM7 zJ~bAnnSS&UdDfhv^Um_m@UMOy>z7ZV-^0Z`e)(dILhE{ybs^#%4{rMVvAeihIzWY5 zU0t1I8UwEO|32HtkMJQEK}sO5m~cs;4vxPMreYz+ZA_t*gyop#eHyS(P*!G=|1%lA z=MEPl$=bYn*zL4^=7*iDR{YuaAE%o@Jlqy!OC?{S?+$$Lr_tsik+R{>5I1-)ovQ)V z4wZeqTn%Q;L6wwlUh){d@(ql;8eC6W1oCFuyA2$YIX(tyNROD?GgT8PCz`4({H zCPXx1RVVZ^GdL*2?`@Ff?I5TF-Gi0J>T!?GeFJGmbnJTS9p{^xo5VYUg&KvDr;;nU zXPzEf%2~Mcuu-|j254oApi1dzsCir-uBaC&9LU46IEVsLdb zQLWafPy}*#;Gv|%!N!IL>6HIx=gF{($*QkEUROVng`kTi?}Ohzem8oLf%ofA*p|z$ zDrL#h*-{Pa!XmWF?cTJb9YmorBAGdP5V8fzV@ zspLC~3vAT)il_Ld+%U8uNRsgJG&IyuTXXgOcYS@(wD~N1Ga+na zIP0WH{HD09*5PV!os`oM*xe);RYgVCz0psuAMPGF93%xtaRc;DbQkd;hBOj43J6cl z%}ocb2TL6?9VT2B8y5A;Hp^{+*ZsdfXcd*~YYB*muy4+YUYA;H+D+X)ToB)<&MD5A zou2l(`eU)B(b)3qcgOGF9kdWFhp40GZHWzB&rrYhBCGYkh-p1zjVnKS#Hc>kK@X{s z$FKj4nr4@~(Bb_v{4-(i{b+QC|4MD{_gwDHk3DuQEF8Wo%f|5;%T0l$lnb0sUsoEn z{sZyxvEe~>)@O6=&cT7wfhD5Jo4&E@^rAqH@@FT*RetsA+v5I2%LE|d(Jrz|JrtEK zuFGf_N|#R|bX>jMaXSDy@)DRKS{5M|@(5*gCSKN&SSsP5a7?X#Wf`+qa-fNjT#-(CLr5#M8m zs41#q7j|B187xt#?9oAG zb2z573^W3^*Fe%-+0x2l1FX$cOpJ0t-`&p!#=p0dOIrh5-8V;XLoVstfjEJz5n0Dm zZeMN($54>;_?TTkI(~$okOGDM`uZO@ydnaGRU|!#vc&kUwuxT<*Kr01Pcd5;MxF0( z8-Vm89uWCFL{%)LuN`(8a9d0qHZ!i|B*JnuemHm-*BEri^yUdd@$r zEvz&&v8Io4tb=5ty8h{7cA)K zXvrQ;Cf?_V;ZoKrIf2(B4JarR&nG}_D`S}k2@s)Ks>|gWxP@eOz6> zL;^sCfq{XPLqhMf;E2J#XHbXGE-)oYm*>u=TQ8RN4fGro>z+ivtDbni8P6m52#%<( zY#!V5!eTry@VMhd|)u?HI|gK~oHa<8m&e7#0@ zg;WA=aiY0;b&Q;`8B~cuz0EbTv9RbqIN`xdOirAdU!=ed5B>g0t{hPh2TnT@iQKRs zA(j-qJ)LZDXj)f{3jlsirikZrQHI;x_cRkWe6KPep}(=z33)1NL}o6uv$tU@tD5@E zfR*K0F0&mViG8uuiQ)}9>=ywm*_`*2sqQuI$##}j%2v+K&b;JQPpF=_$EA%}g^l+g zVh>e=Diq4Rw!Z!duBv7LwDOD!evlt|lJbOx#(BrVoQ&zwSXO$<+~j1}$<1N^SMlEs z!n=0mFNB4gY1@C_%%0G5dewUO^UN+zav+f4h~^Vp>IQ2MkDr?-+<1u@8KoMmK)V!r zN3ly0hHfFqR7Dib-`Bt#;TB=kXj78u$@eJp2gRwIieHu(C9XO;-z;|~()uz;A=+W7 z#rI_#r6oAX72R?=p$JDr=6%e_$k3@2h!QXfK_PheHe4vY`YY@C)KAN}b8Zdvp4!pMUb1I3%wwbQnx zHsjkr+U_KyR}<#Ob7ynUbh+|u^-8CD^SG1MlE3xJ3nFtwS@v8hN#nXJ4O_id{$TjR zzwdm{uE_2gB3<@hZf(EbI|%ycEWX%ezVoN4hoOt%_)I~bp5=KiyGm;~Oe*XL(BieG zD`hB=i3bn_ET&Vx7LcX+m+E}~pjQx>&RE!CuPdkADX~zJa&SM*{KW~ye&2~={Chps zxR6=UiX;eSNqEi z;^Le%Qe;uxwd8wiHKPA@$x*t^(#keKDd0+0e}mo~MWXuzvx2a`7pYghS9;fG&i zv}cy9&q%JWUPKs-jmD1VP0*KX?Oa@eXi`#gVx8+rFNl3=I7^aAGiAMZ1CC7BxxlXHTe|h)thzo z;)8Q}5c(+h=EP&g)JlW4)pM%a(6);ue^8}x-5)%XdH|&3S|3#-WonWtW@V<%CQ&E* z5>FudH#oEbIlO$tsfA*3DInRtVAfaxHnSeEDk|&{8B-B^M`}I2Z22i-nGJ-ee&+uVgR+ zR0)Y>)m12k6Oywqa4v67#)d3E-Ui)YUVeik_FWqc_-*L9==xwN5L|V_)&nzZMQSx% zU^zg&K7>*@U^v@q#{LY5L%;)#-~n+kUC;O!Y>_eG5_GQ~0o4$I$GQa@A-Btom=(cM zr-l>M`%Y)$53-yO^f0U%y`Y zoq$e`F8M)*-rU?AI~U+P64J-__j`+?3JfS@m?m7h;WjK4EX3dC955<#1z;+H61o+qDUQnXgLOcN^61^*SRvEjvBaF1#F$P`=A%XMfhx){=cMtTM?P znRoH#!N~oXDr>TqmUewZz3g}Is;b7Sn&uO#cgf)YQ2c*olhFSI^vTZ9 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..90dd65d40cb53b57a2750a6e1759059793916601 GIT binary patch literal 39481 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..6ef5cd23a75f7d4eeb788395aef566d5bac2928b GIT binary patch literal 27490 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�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 MUPG=<#w_Ch0nEjwi2wiq literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..799d6d56a52fbb1cb16df17017514fb0a154bc67 GIT binary patch literal 17736 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..5f9748728d7a0a73ae537c3f1867fd20be398248 GIT binary patch literal 18356 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..643f12016e56c0696f5dd741b360b6f293662e19 GIT binary patch literal 19975 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%0Dv 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

    K}a3^G-*>d6d%Qvpx^@&Y!zQwmWA4j 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 HNBqA4%-esN literal 0 HcmV?d00001 diff --git a/docs/html/images/gcm/gcm-logo.png b/docs/html/images/gcm/gcm-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..14b92ada34f63a3407e56a90a83011aea23ff00b GIT binary patch literal 44085 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 XEvXoFLkU!9!0}d5U7_N&S?K=&bBm1l literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..6d19b0b273cce7cfa02d07be7c52eb6341c96c2e GIT binary patch literal 26134 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 BZngjb literal 0 HcmV?d00001