Java tutorial
/* * Copyright (C) 2013 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.pinplanet.pintact; import com.google.android.gms.gcm.GoogleCloudMessaging; import com.pinplanet.pintact.R; import com.pinplanet.pintact.chat.ChatActivity; import com.pinplanet.pintact.chat.ChatDataWrapper; import com.pinplanet.pintact.data.ChatTopicDTO; import com.pinplanet.pintact.data.GroupDTO; import com.pinplanet.pintact.group.GroupContactsActivity; import com.pinplanet.pintact.notification.PushNotificationActivity; import com.pinplanet.pintact.utility.HttpConnection; import com.pinplanet.pintact.utility.SingletonLoginData; import com.pinplanet.pintact.utility.SingletonNetworkStatus; import android.app.IntentService; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.support.v4.app.NotificationCompat; import android.util.Log; import org.json.JSONException; import org.json.JSONObject; import java.util.regex.Pattern; /** * This {@code IntentService} does the actual handling of the GCM message. * {@code GcmBroadcastReceiver} (a {@code WakefulBroadcastReceiver}) holds a * partial wake lock for this service while the service does its work. When the * service is finished, it calls {@code completeWakefulIntent()} to release the * wake lock. */ public class GcmIntentService extends IntentService { public static final int NOTIFICATION_ID = 1; private NotificationManager mNotificationManager; NotificationCompat.Builder builder; public GcmIntentService() { super("GcmIntentService"); } public static final String TAG = "GCM Demo"; @Override protected void onHandleIntent(Intent intent) { System.out.println("==== Push Notification: GcmIntentService::onHandleIntent"); Bundle extras = intent.getExtras(); GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this); // The getMessageType() intent parameter must be the intent you received // in your BroadcastReceiver. String messageType = gcm.getMessageType(intent); if (!extras.isEmpty()) { // has effect of unparcelling Bundle /* * Filter messages based on message type. Since it is likely that GCM will be * extended in the future with new message types, just ignore any message types you're * not interested in, or that you don't recognize. */ if (GoogleCloudMessaging.MESSAGE_TYPE_SEND_ERROR.equals(messageType)) { sendNotification("Send error: " + extras.toString(), extras.getString("customData")); } else if (GoogleCloudMessaging.MESSAGE_TYPE_DELETED.equals(messageType)) { sendNotification("Deleted messages on server: " + extras.toString(), extras.getString("customData")); // If it's a regular GCM message, do some work. } else if (GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE.equals(messageType)) { // This loop represents the service doing some work. /* for (int i = 0; i < 5; i++) { Log.i(TAG, "Working... " + (i + 1) + "/5 @ " + SystemClock.elapsedRealtime()); try { Thread.sleep(5000); } catch (InterruptedException e) { } } Log.i(TAG, "Completed work @ " + SystemClock.elapsedRealtime()); */ // Post notification of received message. Log.d(TAG, "Notification Received"); Log.d(TAG, "text: " + extras.getString("text")); Log.d(TAG, "customData: " + extras.getString("customData")); sendNotification(extras.getString("text"), extras.getString("customData")); //Log.i(TAG, "Received: " + extras.toString()); } } // Release the wake lock provided by the WakefulBroadcastReceiver. GcmBroadcastReceiver.completeWakefulIntent(intent); } // Put the message into a notification and post it. // This is just one simple example of what you might choose to do with // a GCM message. private void sendNotification(String msg, String customData) { mNotificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE); String type = null; if (customData != null) { customData = customData.replace("\"{", "{"); customData = customData.replaceFirst(Pattern.quote("}\""), "}"); Log.d(TAG, "CustomData2: " + customData); } try { JSONObject jsonObject = new JSONObject(customData); Log.d(TAG, "jsonObject: " + jsonObject.toString()); type = jsonObject.getString("type"); switch (type) { case "NEW_CHAT_MESSAGE": if (customData != null) { sendChatNotification(customData); } break; default: sendDefaultNotification(); break; } } catch (JSONException e) { Log.d(TAG, "JSONException in GcmIntentService: " + e.toString()); e.printStackTrace(); } // Intent it = new Intent(this, GroupContactsActivity.class); // //it.putExtra(LeftDeckActivity.SELECTED_OPTIONS, LeftDeckActivity.OPTION_NOTIFY); // // add the following line would show Pintact to the preview page. // // it.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); // PendingIntent contentIntent = PendingIntent.getActivity(this, 0, it, PendingIntent.FLAG_CANCEL_CURRENT); // // NotificationCompat.Builder mBuilder = // new NotificationCompat.Builder(this) // .setSmallIcon(R.drawable.ic_launcher) // .setContentTitle("Pintact Update") // .setStyle(new NotificationCompat.BigTextStyle() // .bigText(msg)) // .setVibrate(new long[]{1000, 1000, 1000, 1000, 1000}) // .setContentText(msg); // // mBuilder.setContentIntent(contentIntent); // mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build()); // SingletonLoginData.getInstance().mNotificationManager = mNotificationManager; } private void sendChatNotification(String customData) { mNotificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE); JSONObject jsonObject = null; JSONObject chatObject = null; GroupDTO groupDTO = new GroupDTO(); String chatMessage = "New Chat Message"; String groupId = ""; try { jsonObject = new JSONObject(customData); Log.d(TAG, "groupId: " + jsonObject.getString("groupId")); groupId = jsonObject.getString("groupId"); groupDTO.setId(jsonObject.getString("groupId")); SingletonLoginData.getInstance().setCurGroup(groupDTO); Log.d(TAG, "message: " + jsonObject.getString("message")); chatObject = jsonObject.getJSONObject("message"); chatMessage = chatObject.getString("content"); } catch (JSONException e) { Log.d(TAG, "sendChatNotification error: " + e.toString()); e.printStackTrace(); } //Intent it = new Intent(this, PushNotificationActivity.class); Intent it = new Intent(this, GroupContactsActivity.class); it.putExtra("groupId", groupId); it.putExtra("OpenThreads", true); //it.putExtra(LeftDeckActivity.SELECTED_OPTIONS, LeftDeckActivity.OPTION_NOTIFY); // add the following line would show Pintact to the preview page. // it.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); PendingIntent contentIntent = PendingIntent.getActivity(this, 0, it, PendingIntent.FLAG_CANCEL_CURRENT); NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this) .setSmallIcon(R.drawable.ic_launcher).setContentTitle("New Message") .setStyle(new NotificationCompat.BigTextStyle().bigText(chatMessage)) .setVibrate(new long[] { 1000, 1000, 1000, 1000, 1000 }).setAutoCancel(true) .setContentText(chatMessage); mBuilder.setContentIntent(contentIntent); mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build()); SingletonLoginData.getInstance().mNotificationManager = mNotificationManager; } private void sendDefaultNotification() { Intent it = new Intent(this, LeftDeckActivity.class); it.putExtra(LeftDeckActivity.SELECTED_OPTIONS, LeftDeckActivity.OPTION_NOTIFY); // add the following line would show Pintact to the preview page. // it.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); PendingIntent contentIntent = PendingIntent.getActivity(this, 0, it, PendingIntent.FLAG_CANCEL_CURRENT); NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this) .setSmallIcon(R.drawable.ic_launcher).setContentTitle("Pintact Notification") .setStyle(new NotificationCompat.BigTextStyle().bigText("New notification from Pintact")) .setVibrate(new long[] { 1000, 1000, 1000, 1000, 1000 }) .setContentText("New notification from Pintact"); mBuilder.setContentIntent(contentIntent); mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build()); SingletonLoginData.getInstance().mNotificationManager = mNotificationManager; } }