package org.smartpaws.notifications;
import android.app.AlarmManager;
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.Color;
import android.support.v4.app.NotificationCompat;
import org.json.JSONArray;
import org.json.JSONObject;
import org.smartpaws.MainActivity;
import org.smartpaws.R;
import org.smartpaws.objects.Event;
import org.smartpaws.util.TimeUtils;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class AlarmService extends BroadcastReceiver {
private static AlarmManager ALARM_MANAGER;
private static NotificationManager NOTIFICATION_MANAGER;
private static List<Reminder> REMINDERS = new ArrayList<>();
private static Context CONTEXT;
public static Context getContext() {
return CONTEXT;
}
public static void setContext(Context context) {
CONTEXT = context;
ALARM_MANAGER = (AlarmManager)CONTEXT.getSystemService(Context.ALARM_SERVICE);
NOTIFICATION_MANAGER = (NotificationManager)CONTEXT.getSystemService(Context.NOTIFICATION_SERVICE);
}
public static void setReminder(Event event, int minsBefore, String room) {
if (minsBefore <= 0) {
removeReminder(event);
return;
}
Calendar cal = Calendar.getInstance();
cal.setTime(event.getDateStart());
cal.add(Calendar.MINUTE, -minsBefore);
if (cal.before(Calendar.getInstance())) return;
Intent intent = new Intent(CONTEXT, AlarmService.class);
Reminder reminder = new Reminder(event, minsBefore, room);
intent.putExtra("reminder", reminder);
PendingIntent alarm = PendingIntent.getBroadcast(CONTEXT, event.getId(), intent, 0);
removeReminder(event); // Remove any existing alarms for the same event
ALARM_MANAGER.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), alarm);
REMINDERS.add(reminder);
ShutdownWakeReceiver.saveReminders();
}
public static void removeReminder(Event event) {
Intent intent = new Intent(CONTEXT, AlarmService.class);
for (Reminder reminder : REMINDERS) {
if (reminder.getEvent().getId() == event.getId()) {
ALARM_MANAGER.cancel(PendingIntent.getBroadcast(CONTEXT, reminder.getEvent().getId(), intent, 0));
REMINDERS.remove(reminder);
break;
}
}
ShutdownWakeReceiver.saveReminders();
}
private Notification createNotification(Event event, String room) {
Intent intent = new Intent(CONTEXT, MainActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(CONTEXT, 0, intent, 0);
String timeTill = TimeUtils.getTimeTill(event.getName(), event.getDateStart());
return new NotificationCompat.Builder(CONTEXT)
.setContentTitle(event.getName())
.setContentText(timeTill + " - " + room)
.setColor(Color.argb(255, 255, 143, 0))
.setAutoCancel(true)
.setLights(Color.argb(255, 174, 234, 0), 1000, 500)
.setDefaults(Notification.DEFAULT_VIBRATE | Notification.DEFAULT_SOUND)
.setContentIntent(pendingIntent)
.setSmallIcon(R.drawable.ic_create_black_24dp)
.extend(new NotificationCompat.WearableExtender().setContentIcon(R.drawable.ic_create_black_24dp)) // TODO: Update icon
.build();
}
public static void clearReminders() {
for (Reminder container : REMINDERS) {
removeReminder(container.event);
}
REMINDERS.clear();
}
public static Reminder[] getReminders() {
return REMINDERS.toArray(new Reminder[REMINDERS.size()]);
}
@Override
public void onReceive(Context context, Intent intent) {
setContext(context);
Reminder container = (Reminder) intent.getSerializableExtra("reminder");
// If 15 minutes have passed since this should have been called, let's ignore it
Calendar cal = Calendar.getInstance();
cal.setTime(container.event.getDateStart());
cal.add(Calendar.MINUTE, 15);
if (cal.before(Calendar.getInstance())) return;
NOTIFICATION_MANAGER.notify(container.event.getId(), createNotification(container.event, container.getRoom()));
notifyPebble(container.event, container.getRoom());
removeReminder(container.event);
}
private void notifyPebble(Event event, String room) {
final Intent i = new Intent("com.getpebble.action.SEND_NOTIFICATION");
String timeTill = TimeUtils.getTimeTill(event.getName(), event.getDateStart());
final Map<String, String> data = new HashMap<>();
data.put("title", event.getName());
data.put("body", timeTill + " - " + room);
final JSONObject jsonData = new JSONObject(data);
final String notificationData = new JSONArray().put(jsonData).toString();
i.putExtra("messageType", "PEBBLE_ALERT");
i.putExtra("sender", "SmartPaws");
i.putExtra("notificationData", notificationData);
MainActivity.INSTANCE.sendBroadcast(i);
}
public static class Reminder implements Serializable {
private final Event event;
private final int minsBefore;
private final String room;
Reminder(Event event, int minsBefore, String room) {
this.event = event;
this.minsBefore = minsBefore;
this.room = room;
}
public Event getEvent() {
return event;
}
public int getMinsBefore() {
return minsBefore;
}
public String getRoom() {
return room;
}
}
}