package org.openhab.habclient.notification;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.AsyncTask;
import android.support.v4.app.NotificationCompat;
import android.support.v4.app.NotificationManagerCompat;
import android.util.Log;
import org.openhab.domain.INotificationSender;
import org.openhab.domain.SenderType;
import org.openhab.domain.model.OpenHABWidget;
import org.openhab.domain.user.User;
import org.openhab.habclient.IOpenHABSetting;
import org.openhab.habclient.auto.IAutoUnreadConversationManager;
import org.openhab.habclient.wear.IWearNotificationActions;
import org.openhab.habclient.wear.WearNotificationReplyHandler;
import org.openhab.habdroid.R;
import org.openhab.habdroid.util.MyWebImage;
import java.util.concurrent.ExecutionException;
import javax.inject.Inject;
/**
* Created by Tony Alpskog in 2015.
*/
public class NotificationSender implements INotificationSender {
private final Context mContext;
private final IAutoUnreadConversationManager mAutoUnreadConversationManager;
private final IWearNotificationActions mWearNotificationActions;
private final IOpenHABSetting mOpenHABSetting;
private final String TAG = "NotificationSender";
@Inject
public NotificationSender(Context context,
IAutoUnreadConversationManager autoUnreadConversationManager,
IWearNotificationActions wearNotificationActions,
IOpenHABSetting openHABSetting) {
mContext = context;
mAutoUnreadConversationManager = autoUnreadConversationManager;
mWearNotificationActions = wearNotificationActions;
mOpenHABSetting = openHABSetting;
}
@Override
public void startSession(SenderType senderType, String title, String message) {
showNotification(senderType, title, null, message, new long[]{});
}
@Override
public void startSession(String title, OpenHABWidget openHABWidget, String message) {
showNotification(SenderType.System, title, getOpenHABImageUrlString(openHABWidget), message, WearNotificationReplyHandler.MEDIUM_PRIORITY_VIBRATE_PATTERN);
}
@Override
public void startSession(String title, User user, String message) {
showNotification(SenderType.User, title, user.getImageUrl(), message, WearNotificationReplyHandler.MEDIUM_PRIORITY_VIBRATE_PATTERN);
}
private String getOpenHABImageUrlString(OpenHABWidget openHABWidget) {
if(openHABWidget == null)
return null;
return mOpenHABSetting.getBaseUrl() + "images/" + Uri.encode(openHABWidget.getIcon() + ".png");
}
@Override
public void showNotification(SenderType senderType, String title, String titleIconUrl, String message, long[] vibratePattern/*, NotificationCompat.Builder preBuiltPrio, ...*/) {//TODO - More injection
//Android Auto
int conversationId = mAutoUnreadConversationManager.getConservationId(senderType, title);
Log.d("Notification", String.format("showNotification(): Before adding %s - \"%s\" as Conservation ID %d", title, message, conversationId));
mAutoUnreadConversationManager.addMessageToUnreadConversations(conversationId, title, message);
//Wear
NotificationCompat.WearableExtender wearableExtender = new NotificationCompat.WearableExtender();
NotificationCompat.Action[] actions = mWearNotificationActions.getNotificationActions(conversationId);
for(NotificationCompat.Action action : actions) {
wearableExtender.addAction(action);
}
Bitmap wearBackgroundBitmap = getBitmapFromUrl(titleIconUrl);
if(wearBackgroundBitmap == null) {
wearBackgroundBitmap = BitmapFactory.decodeResource(mContext.getResources(),
senderType.equals(SenderType.System)? R.drawable.openhab_320x320 : R.drawable.default_user);
}
wearableExtender.setBackground(wearBackgroundBitmap);
//Mobile & Auto
Bitmap senderBitmap = getBitmapFromUrl(titleIconUrl);
if(senderBitmap == null) {
senderBitmap = BitmapFactory.decodeResource(mContext.getResources(),
senderType.equals(SenderType.System)? R.drawable.openhabicon_light : R.drawable.default_user);
}
// Build the notification (for all device types)
NotificationCompat.Builder builder = new NotificationCompat.Builder(mContext)
.setContentTitle(title)
.setContentText(message)
.setSmallIcon(R.drawable.openhabicon)//App icon
.setLargeIcon(senderBitmap)//Auto and Mobile
// .setContentIntent(mAutoUnreadConversationManager.getMessageReadPendingIntent(conversationId))
.setWhen(System.currentTimeMillis())
.setVibrate(vibratePattern)
.extend(wearableExtender);//Wear
Log.d("Notification", String.format("showNotification(): Before adding unread messages. Conservation ID = %d", conversationId));
addUnreadConversations(builder, mAutoUnreadConversationManager.getUnreadConversations());
try {
Log.d("Notification", String.format("showNotification(): Before sending %s - \"%s\" as Conservation ID %d", title, message, conversationId));
NotificationManagerCompat.from(mContext).notify(conversationId, builder.build());
} catch (Exception e) {
Log.e(TAG, "Could not send a notification.", e);
}
}
//Auto
private void addUnreadConversations(NotificationCompat.Builder builder, NotificationCompat.CarExtender.UnreadConversation[] conversationArray) {
for(NotificationCompat.CarExtender.UnreadConversation conversation : conversationArray) {
builder.extend(new NotificationCompat.CarExtender().setUnreadConversation(conversation));
}
}
private Bitmap getBitmapFromUrl(String url) {
try {
return new AsyncTask<String, Void, Bitmap>() {
@Override
protected Bitmap doInBackground(String... params) {
String url = params[0];
MyWebImage webImage = new MyWebImage(url, false, mOpenHABSetting.getUsername(), mOpenHABSetting.getPassword());
return webImage.getBitmap(mContext);
}
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, url).get();
} catch (InterruptedException e) {
Log.e(TAG, e.getMessage());
return null;
} catch (ExecutionException e) {
Log.e(TAG, e.getMessage());
return null;
}
}
}