package org.wordpress.android;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v4.app.NotificationCompat;
import android.support.v4.content.IntentCompat;
import android.util.Log;
import com.google.android.gcm.GCMBaseIntentService;
import com.justsystems.hpb.pad.R;
import org.xmlrpc.android.WPComXMLRPCApi;
import org.wordpress.android.ui.notifications.NotificationsActivity;
import org.wordpress.android.ui.posts.AbsListActivity;
import org.wordpress.android.util.ImageHelper;
import org.wordpress.android.util.StringUtils;
public class GCMIntentService extends GCMBaseIntentService {
public static Map<String, Bundle> activeNotificationsMap = new HashMap<String, Bundle>();
private int notificationId = 1337;
@Override
protected String[] getSenderIds(Context context) {
String[] senderIds = new String[1];
senderIds[0] = Config.GCM_ID;
return senderIds;
}
@Override
protected void onError(Context context, String errorId) {
Log.v("WORDPRESS", "GCM Error: " + errorId);
}
@Override
protected void onMessage(Context context, Intent intent) {
Log.v("WORDPRESS", "Received Message");
Bundle extras = intent.getExtras();
if (extras == null) {
Log.v("WORDPRESS",
"Hrm. No notification message content received. Aborting.");
return;
}
String title = extras.getString("title");
if (title == null)
title = "WordPress";
String message = StringUtils.unescapeHTML(extras.getString("msg"));
String note_id = extras.getString("note_id");
if (note_id == null)
note_id = StringUtils.getMd5Hash(message);
if (note_id != null) {
if (!activeNotificationsMap.containsKey(note_id))
activeNotificationsMap.put(note_id, extras);
}
String iconURL = extras.getString("icon");
Bitmap largeIconBitmap = null;
if (iconURL != null) {
try {
iconURL = URLDecoder.decode(iconURL, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
float screenDensity = getResources().getDisplayMetrics().densityDpi;
int size = Math.round(64 * (screenDensity / 160));
String resizedURL = iconURL.replaceAll("(?<=[?&;])s=[0-9]*", "s="
+ size);
largeIconBitmap = ImageHelper.downloadBitmap(resizedURL);
}
SharedPreferences prefs = PreferenceManager
.getDefaultSharedPreferences(context);
boolean sound, vibrate, light;
sound = prefs.getBoolean("wp_pref_notification_sound", false);
vibrate = prefs.getBoolean("wp_pref_notification_vibrate", false);
light = prefs.getBoolean("wp_pref_notification_light", false);
NotificationCompat.Builder mBuilder;
Intent resultIntent = new Intent(this, AbsListActivity.class);
resultIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
| Intent.FLAG_ACTIVITY_NEW_TASK
| IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
resultIntent.setAction("android.intent.action.MAIN");
resultIntent.addCategory("android.intent.category.LAUNCHER");
resultIntent.putExtra(NotificationsActivity.FROM_NOTIFICATION_EXTRA,
true);
if (activeNotificationsMap.size() <= 1) {
mBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.notification_icon)
.setContentTitle(title)
.setContentText(message)
.setTicker(message)
.setAutoCancel(true)
.setStyle(
new NotificationCompat.BigTextStyle()
.bigText(message));
if (note_id != null)
resultIntent.putExtra(NotificationsActivity.NOTE_ID_EXTRA,
note_id);
// Add some actions if this is a comment notification
String noteType = extras.getString("type");
if (noteType != null && noteType.equals("c")) {
Intent commentReplyIntent = new Intent(this,
AbsListActivity.class);
commentReplyIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
| Intent.FLAG_ACTIVITY_NEW_TASK
| IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
commentReplyIntent.setAction("android.intent.action.MAIN");
commentReplyIntent
.addCategory("android.intent.category.LAUNCHER");
commentReplyIntent.addCategory("comment-reply");
commentReplyIntent.putExtra(
NotificationsActivity.FROM_NOTIFICATION_EXTRA, true);
commentReplyIntent.putExtra(
NotificationsActivity.NOTE_INSTANT_REPLY_EXTRA, true);
if (note_id != null)
commentReplyIntent.putExtra(
NotificationsActivity.NOTE_ID_EXTRA, note_id);
PendingIntent commentReplyPendingIntent = PendingIntent
.getActivity(context, 0, commentReplyIntent,
PendingIntent.FLAG_CANCEL_CURRENT);
mBuilder.addAction(R.drawable.ab_icon_reply, getResources()
.getText(R.string.reply), commentReplyPendingIntent);
}
if (largeIconBitmap != null) {
mBuilder.setLargeIcon(largeIconBitmap);
}
} else {
NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle();
int noteCtr = 1;
for (Bundle wpNotification : activeNotificationsMap.values()) {
// InboxStyle notification is limited to 5 lines
if (noteCtr > 5)
break;
if (wpNotification.getString("msg") != null) {
if (wpNotification.getString("type").equals("c"))
inboxStyle.addLine(wpNotification.getString("title")
+ ": " + wpNotification.getString("msg"));
else
inboxStyle.addLine(wpNotification.getString("msg"));
noteCtr++;
}
}
if (activeNotificationsMap.size() > 5)
inboxStyle.setSummaryText(String.format(
getString(R.string.more_notifications),
activeNotificationsMap.size() - 5));
String subject = String.format(
getString(R.string.new_notifications),
activeNotificationsMap.size());
mBuilder = new NotificationCompat.Builder(this)
.setLargeIcon(
BitmapFactory.decodeResource(getResources(),
R.drawable.notification_multi))
.setSmallIcon(R.drawable.notification_icon)
.setContentTitle("WordPress").setContentText(subject)
.setTicker(message).setAutoCancel(true)
.setStyle(inboxStyle);
}
if (sound)
mBuilder.setSound(Uri.parse("android.resource://"
+ getPackageName() + "/" + R.raw.notification));
if (vibrate)
mBuilder.setVibrate(new long[] { 500, 500, 500 });
if (light)
mBuilder.setLights(0xff0000ff, 1000, 5000);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
resultIntent, PendingIntent.FLAG_CANCEL_CURRENT);
mBuilder.setContentIntent(pendingIntent);
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(notificationId, mBuilder.build());
}
@Override
protected void onRegistered(Context context, String regId) {
SharedPreferences settings = PreferenceManager
.getDefaultSharedPreferences(context);
if (regId != null && regId.length() > 0) {
// Get or create UUID for WP.com notes api
String uuid = settings
.getString("wp_pref_notifications_uuid", null);
if (uuid == null) {
uuid = UUID.randomUUID().toString();
SharedPreferences.Editor editor = settings.edit();
editor.putString("wp_pref_notifications_uuid", uuid);
editor.commit();
}
new WPComXMLRPCApi().registerWPComToken(context, regId);
}
}
@Override
protected void onUnregistered(Context context, String regId) {
Log.v("WORDPRESS", "GCM Unregistered ID: " + regId);
}
}