/*
* Copyright (c) 2012, Codename One and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Codename One designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Codename One through http://www.codenameone.com/ if you
* need additional information or have any questions.
*/
package com.codename1.impl.android;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.support.v4.app.NotificationCompat;
import android.util.Log;
import com.codename1.background.BackgroundFetch;
import com.codename1.notifications.LocalNotification;
import com.codename1.ui.Display;
import java.io.IOException;
import java.io.InputStream;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author Chen
*/
public class LocalNotificationPublisher extends BroadcastReceiver {
public static String NOTIFICATION = "notification";
public static String NOTIFICATION_INTENT = "notification-intent";
public static String BACKGROUND_FETCH_INTENT = "background-fetch-intent";
public void onReceive(Context context, Intent intent) {
//Fire the notification to the display
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
Bundle extras=intent.getExtras();
PendingIntent content = extras.getParcelable(NOTIFICATION_INTENT);
Bundle b = extras.getParcelable(NOTIFICATION);
LocalNotification notif = AndroidImplementation.createNotificationFromBundle(b);
if (AndroidImplementation.BACKGROUND_FETCH_NOTIFICATION_ID.equals(notif.getId())) {
PendingIntent backgroundFetchIntent = extras.getParcelable(BACKGROUND_FETCH_INTENT);
if (backgroundFetchIntent != null) {
try {
backgroundFetchIntent.send();
} catch (Exception ex) {
Log.e("Codename One", "Failed to send BackgroundFetchHandler intent", ex);
}
} else {
Log.d("Codename One", "BackgroundFetch intent was null");
}
} else {
Notification notification = createAndroidNotification(context, notif, content);
notification.when = System.currentTimeMillis();
try{
int notifId = Integer.parseInt(notif.getId());
notificationManager.notify("CN1", notifId, notification);
}catch(Exception e){
//that was a mistake, the first param is the tag not the id
notificationManager.notify(notif.getId(), 0, notification);
}
}
}
private Notification createAndroidNotification(Context context, LocalNotification localNotif, PendingIntent content) {
Context ctx = context;
int smallIcon = ctx.getResources().getIdentifier("ic_stat_notify", "drawable", ctx.getApplicationInfo().packageName);
int icon = ctx.getResources().getIdentifier("icon", "drawable", ctx.getApplicationInfo().packageName);
if (smallIcon == 0) {
smallIcon = icon;
} else {
icon = smallIcon;
}
NotificationCompat.Builder builder = new NotificationCompat.Builder(ctx);
builder.setContentTitle(localNotif.getAlertTitle());
builder.setContentText(localNotif.getAlertBody());
builder.setAutoCancel(true);
if (localNotif.getBadgeNumber() > 0) {
builder.setNumber(localNotif.getBadgeNumber());
}
String image = localNotif.getAlertImage();
if (image != null && image.length() > 0) {
if (image.startsWith("/")) {
image = image.substring(1);
}
InputStream in;
try {
in = context.getAssets().open(image);
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inPreferredConfig = Bitmap.Config.ARGB_8888;
Bitmap im = BitmapFactory.decodeStream(in, null, opts);
builder.setStyle(new NotificationCompat.BigPictureStyle().bigPicture(im));
} catch (IOException ex) {
Logger.getLogger(LocalNotificationPublisher.class.getName()).log(Level.SEVERE, null, ex);
}
}
builder.setSmallIcon(smallIcon);
builder.setContentIntent(content);
String sound = localNotif.getAlertSound();
if (sound != null && sound.length() > 0) {
sound = sound.toLowerCase();
builder.setSound(android.net.Uri.parse("android.resource://"+ctx.getApplicationInfo().packageName+"/raw"+sound.substring(0, sound.indexOf("."))));
}
Notification n = builder.build();
n.icon = icon;
n.defaults |= Notification.DEFAULT_SOUND;
return n;
}
}