package pro.dbro.ble.ui;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.TaskStackBuilder;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.NotificationCompat;
import android.view.View;
import java.util.ArrayList;
import im.delight.android.identicons.SymmetricIdenticon;
import pro.dbro.ble.R;
import pro.dbro.ble.data.model.DataUtil;
import pro.dbro.ble.data.model.Message;
import pro.dbro.ble.data.model.Peer;
import pro.dbro.ble.ui.activities.MainActivity;
/**
* Created by davidbrodsky on 11/14/14.
*/
public class Notification {
/** Notification Ids */
private static final int MESSAGE_NOTIFICATION_ID = 1;
private static final int PEER_AVAILABLE_NOTIFICATION_ID = 2;
private static final int MAX_MESSAGES_TO_SHOW = 6;
private static final ArrayList<String> sNotificationInboxItems = new ArrayList<>(MAX_MESSAGES_TO_SHOW + 1);
// <editor-fold desc="Public API">
/**
* Display a notification representing peer being available, or remove any indicating such
* if isAvailable is false.
*
* Does not call peer.close()
*/
public static void displayPeerAvailableNotification(@NonNull Context context, @NonNull Peer peer, boolean isAvailable) {
NotificationManager mNotificationManager =
(NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
if (!isAvailable) {
mNotificationManager.cancel(DataUtil.bytesToHex(peer.getPublicKey()), PEER_AVAILABLE_NOTIFICATION_ID);
return;
}
if (peer.getAlias() == null) return; // TODO : Notify of peers without alias?
String title = String.format("%s is nearby", peer.getAlias());
Intent resultIntent = new Intent(context, MainActivity.class);
NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
builder.setSmallIcon(R.mipmap.ic_launcher);
builder.setContentTitle(title);
builder.setContentIntent(makePendingIntent(context, resultIntent));
builder.setContentText(context.getString(R.string.notification_touch_to_chat));
mNotificationManager.notify(DataUtil.bytesToHex(peer.getPublicKey()), PEER_AVAILABLE_NOTIFICATION_ID, builder.build());
}
/**
* Display a notification representing a new received message. Multiple calls to this method are displayed as a single
* notification, showing a preview of the last MAX_MESSAGES_TO_SHOW messages.
*
* Does not call message.close() or sender.close()
*/
public static void displayMessageNotification(@NonNull Context context, @NonNull Message message, @Nullable Peer sender) {
StringBuilder nBuilder = new StringBuilder();
if (sender != null && sender.getAlias() != null) {
nBuilder.append(sender.getAlias());
nBuilder.append(": ");
}
nBuilder.append(message.getBody().length() > 80 ?
message.getBody().substring(0, 80) + "..." :
message.getBody());
sNotificationInboxItems.add(nBuilder.toString());
if (sNotificationInboxItems.size() > MAX_MESSAGES_TO_SHOW) sNotificationInboxItems.remove(sNotificationInboxItems.size()-1);
Intent resultIntent = new Intent(context, MainActivity.class);
NotificationCompat.InboxStyle inboxStyle =
new NotificationCompat.InboxStyle();
inboxStyle.setBigContentTitle(context.getString(R.string.notification_new_messages));
for (String inboxItem : sNotificationInboxItems) {
inboxStyle.addLine(inboxItem);
}
SymmetricIdenticon identicon = new SymmetricIdenticon(context);
identicon.show(new String(sender.getPublicKey()));
NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
builder.setContentTitle(context.getString(R.string.notification_new_messages));
builder.setLargeIcon(loadBitmapFromView(identicon, 640, 480));
builder.setSmallIcon(R.mipmap.ic_launcher);
builder.setContentIntent(makePendingIntent(context, resultIntent));
builder.setStyle(inboxStyle);
builder.setContentText(sNotificationInboxItems.get(0));
builder.setAutoCancel(true);
builder.setCategory(NotificationCompat.CATEGORY_MESSAGE);
builder.setVibrate(new long[] { 500, 500, 500, 500});
NotificationManager mNotificationManager =
(NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(MESSAGE_NOTIFICATION_ID, builder.build());
}
// </editor-fold desc="Public API">
// <editor-fold desc="Private API">
private static PendingIntent makePendingIntent(@NonNull Context context, @NonNull Intent resultIntent) {
TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
// Adds the back stack
stackBuilder.addParentStack(MainActivity.class);
// Adds the Intent to the top of the stack
stackBuilder.addNextIntent(resultIntent);
// Gets a PendingIntent containing the entire back stack
return stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
}
public static Bitmap loadBitmapFromView(View v, int width, int height) {
int measuredWidth = View.MeasureSpec.makeMeasureSpec(width,
View.MeasureSpec.EXACTLY);
int measuredHeight = View.MeasureSpec.makeMeasureSpec(height,
View.MeasureSpec.EXACTLY);
v.measure(measuredWidth, measuredHeight);
v.layout(0, 0, v.getMeasuredWidth(),v.getMeasuredHeight());
Bitmap b = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(b);
v.draw(c);
return b;
}
// </editor-fold desc="Private API">
}