Treker/src/org/isoron/uhabits/ReminderAlarmReceiver.java
2015-03-13 05:41:04 -04:00

162 lines
5.0 KiB
Java

package org.isoron.uhabits;
import java.util.Date;
import java.util.List;
import org.isoron.uhabits.models.Habit;
import android.app.Activity;
import android.app.AlarmManager;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.ContentUris;
import android.content.Context;
import android.content.Intent;
import android.media.RingtoneManager;
import android.net.Uri;
import android.support.v4.app.NotificationCompat;
import android.util.Log;
public class ReminderAlarmReceiver extends BroadcastReceiver
{
public static String ACTION_CHECK = "org.isoron.uhabits.ACTION_CHECK";
public static String ACTION_DISMISS = "org.isoron.uhabits.ACTION_DISMISS";
public static String ACTION_REMIND = "org.isoron.uhabits.ACTION_REMIND";
public static String ACTION_REMOVE_REMINDER = "org.isoron.uhabits.ACTION_REMOVE_REMINDER";
public static String ACTION_SNOOZE = "org.isoron.uhabits.ACTION_SNOOZE";
@Override
public void onReceive(Context context, Intent intent)
{
String action = intent.getAction();
if(action.equals(ACTION_REMIND))
createNotification(context, intent.getData());
else if(action.equals(ACTION_DISMISS))
dismissAllHabits();
else if(action.equals(ACTION_CHECK))
checkHabit(context, intent.getData());
else if(action.equals(ACTION_SNOOZE))
snoozeHabit(context, intent.getData());
}
private void snoozeHabit(Context context, Uri data)
{
int delayMinutes = 15;
Habit habit = Habit.get(ContentUris.parseId(data));
MainActivity.createReminderAlarm(context, habit, new Date().getTime() + delayMinutes * 1000);
dismissNotification(context);
}
private void checkHabit(Context context, Uri data)
{
Habit habit = Habit.get(ContentUris.parseId(data));
habit.toggleRepetitionToday();
habit.save();
dismissNotification(context);
}
private void dismissAllHabits()
{
for(Habit h : Habit.getHighlightedHabits())
{
Log.d("Alarm", String.format("Removing highlight from: %s", h.name));
h.highlight = 0;
h.save();
}
}
private void dismissNotification(Context context)
{
NotificationManager notificationManager = (NotificationManager) context
.getSystemService(Activity.NOTIFICATION_SERVICE);
notificationManager.cancel(1);
}
private void createNotification(Context context, Uri data)
{
Log.d("Alarm", "Alarm received!");
Habit habit = Habit.get(ContentUris.parseId(data));
if(habit.hasImplicitRepToday())
{
Log.d("Alarm", String.format("(%s) has implicit rep today", habit.name));
return;
}
Log.d("Alarm", String.format("Applying highlight: %s", habit.name));
habit.highlight = 1;
habit.save();
// Check if reminder has been turned off after alarm was scheduled
if(habit.reminder_hour == null)
return;
Intent contentIntent = new Intent(context, MainActivity.class);
contentIntent.setData(data);
PendingIntent contentPendingIntent = PendingIntent.getActivity(context, 0, contentIntent, 0);
Intent deleteIntent = new Intent(context, ReminderAlarmReceiver.class);
deleteIntent.setAction(ACTION_DISMISS);
PendingIntent deletePendingIntent = PendingIntent.getBroadcast(context, 0, deleteIntent, 0);
Intent checkIntent = new Intent(context, ReminderAlarmReceiver.class);
checkIntent.setData(data);
checkIntent.setAction(ACTION_CHECK);
PendingIntent checkIntentPending = PendingIntent.getBroadcast(context, 0, checkIntent, 0);
Intent snoozeIntent = new Intent(context, ReminderAlarmReceiver.class);
snoozeIntent.setData(data);
snoozeIntent.setAction(ACTION_SNOOZE);
PendingIntent snoozeIntentPending = PendingIntent.getBroadcast(context, 0, snoozeIntent, 0);
Uri soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle();
inboxStyle.setBigContentTitle("Habit Reminder:");
List<Habit> pendingHabits = Habit.getHighlightedHabits();
StringBuffer contentText = new StringBuffer();
for(Habit h : pendingHabits)
{
if(h.hasImplicitRepToday())
continue;
inboxStyle.addLine(h.name);
if(contentText.length() > 0)
contentText.append(", ");
contentText.append(h.name);
Log.d("Alarm", String.format("Found highlighted: %s", h.name));
}
Notification notification =
new NotificationCompat.Builder(context)
.setSmallIcon(R.drawable.ic_notification)
.setContentTitle("Habit Reminder")
.setContentText(contentText)
.setContentIntent(contentPendingIntent)
.setDeleteIntent(deletePendingIntent)
.addAction(R.drawable.ic_action_check, "Check", checkIntentPending)
.addAction(R.drawable.ic_action_snooze, "Later", snoozeIntentPending)
.setSound(soundUri)
.setStyle(inboxStyle)
.build();
notification.flags |= Notification.FLAG_AUTO_CANCEL;
NotificationManager notificationManager = (NotificationManager) context
.getSystemService(Activity.NOTIFICATION_SERVICE);
notificationManager.notify(1, notification);
}
}