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; } } }