* All broadcast messages are received and processed by this class.
*/
-public class HabitBroadcastReceiver extends BroadcastReceiver
+public class ReminderReceiver extends BroadcastReceiver
{
- public static final String ACTION_CHECK = "org.isoron.uhabits.ACTION_CHECK";
-
- public static final String ACTION_DISMISS =
- "org.isoron.uhabits.ACTION_DISMISS";
+ public static final String ACTION_DISMISS_REMINDER =
+ "org.isoron.uhabits.ACTION_DISMISS_REMINDER";
public static final String ACTION_SHOW_REMINDER =
"org.isoron.uhabits.ACTION_SHOW_REMINDER";
- public static final String ACTION_SNOOZE =
- "org.isoron.uhabits.ACTION_SNOOZE";
+ public static final String ACTION_SNOOZE_REMINDER =
+ "org.isoron.uhabits.ACTION_SNOOZE_REMINDER";
- public static final String ACTION_TOGGLE =
- "org.isoron.uhabits.ACTION_TOGGLE";
+ private static final String TAG = "ReminderReceiver";
@Inject
HabitList habits;
- @Inject
- CommandRunner commandRunner;
-
- public HabitBroadcastReceiver()
+ public ReminderReceiver()
{
super();
HabitsApplication.getComponent().inject(this);
@@ -72,79 +67,44 @@ public class HabitBroadcastReceiver extends BroadcastReceiver
@Override
public void onReceive(final Context context, Intent intent)
{
- switch (intent.getAction())
- {
- case ACTION_SHOW_REMINDER:
- createNotification(context, intent);
- createReminderAlarmsDelayed(context);
- break;
-
- case ACTION_DISMISS:
- // NOP
- break;
-
- case ACTION_CHECK:
- addRepetition(context, intent);
- break;
-
- case ACTION_TOGGLE:
- toggleRepetition(context, intent);
- break;
-
- case ACTION_SNOOZE:
- snoozeHabit(context, intent);
- break;
-
- case Intent.ACTION_BOOT_COMPLETED:
- ReminderUtils.createReminderAlarms(context, habits);
- break;
- }
- }
-
- private void addOrRemoveRepetition(Context context,
- Intent intent,
- boolean abortIfExists)
- {
- Uri data = intent.getData();
- long today = DateUtils.getStartOfToday();
- Long timestamp = intent.getLongExtra("timestamp", today);
+ Log.i(TAG, String.format("Received intent: %s", intent.toString()));
- long habitId = ContentUris.parseId(data);
- Habit habit = habits.getById(habitId);
try
{
- if (habit == null) return;
+ switch (intent.getAction())
+ {
+ case ACTION_SHOW_REMINDER:
+ onActionShowReminder(context, intent);
+ break;
- Repetition rep = habit.getRepetitions().getByTimestamp(timestamp);
- if (abortIfExists && rep != null) return;
+ case ACTION_DISMISS_REMINDER:
+ // NOP
+ break;
- commandRunner.execute(new ToggleRepetitionCommand(habit, timestamp),
- habitId);
+ case ACTION_SNOOZE_REMINDER:
+ onActionSnoozeReminder(context, intent);
+ break;
+
+ case Intent.ACTION_BOOT_COMPLETED:
+ onActionBootCompleted(context);
+ break;
+ }
}
- finally
+ catch (RuntimeException e)
{
- dismissNotification(context, habitId);
+ Log.e(TAG, "could not process intent", e);
}
}
- private void addRepetition(Context context, Intent intent)
+ protected void onActionBootCompleted(Context context)
{
- addOrRemoveRepetition(context, intent, true);
+ ReminderUtils.createReminderAlarms(context, habits);
}
- private boolean checkWeekday(Intent intent, Habit habit)
+ protected void onActionShowReminder(Context context, Intent intent)
{
- if (!habit.hasReminder()) return false;
- Reminder reminder = habit.getReminder();
-
- Long timestamp =
- intent.getLongExtra("timestamp", DateUtils.getStartOfToday());
-
- boolean reminderDays[] =
- DateUtils.unpackWeekdayList(reminder.getDays());
- int weekday = DateUtils.getWeekday(timestamp);
-
- return reminderDays[weekday];
+ createNotification(context, intent);
+ createReminderAlarmsDelayed(context);
}
private void createNotification(final Context context, final Intent intent)
@@ -172,7 +132,7 @@ public class HabitBroadcastReceiver extends BroadcastReceiver
protected void onPostExecute(Void aVoid)
{
if (todayValue != Checkmark.UNCHECKED) return;
- if (!checkWeekday(intent, habit)) return;
+ if (!shouldShowReminderToday(intent, habit)) return;
if (!habit.hasReminder()) return;
Intent contentIntent = new Intent(context, MainActivity.class);
@@ -185,8 +145,7 @@ public class HabitBroadcastReceiver extends BroadcastReceiver
dismissPendingIntent =
HabitPendingIntents.dismissNotification(context);
PendingIntent checkIntentPending =
- HabitPendingIntents.addCheckmark(context, habit,
- timestamp);
+ HabitPendingIntents.addCheckmark(context, habit, timestamp);
PendingIntent snoozeIntentPending =
HabitPendingIntents.snoozeNotification(context, habit);
@@ -246,7 +205,7 @@ public class HabitBroadcastReceiver extends BroadcastReceiver
notificationManager.cancel(notificationId);
}
- private void snoozeHabit(Context context, Intent intent)
+ private void onActionSnoozeReminder(Context context, Intent intent)
{
Uri data = intent.getData();
SharedPreferences prefs =
@@ -261,8 +220,18 @@ public class HabitBroadcastReceiver extends BroadcastReceiver
dismissNotification(context, habitId);
}
- private void toggleRepetition(Context context, Intent intent)
+ private boolean shouldShowReminderToday(Intent intent, Habit habit)
{
- addOrRemoveRepetition(context, intent, false);
+ if (!habit.hasReminder()) return false;
+ Reminder reminder = habit.getReminder();
+
+ Long timestamp =
+ intent.getLongExtra("timestamp", DateUtils.getStartOfToday());
+
+ boolean reminderDays[] =
+ DateUtils.unpackWeekdayList(reminder.getDays());
+ int weekday = DateUtils.getWeekday(timestamp);
+
+ return reminderDays[weekday];
}
}
diff --git a/app/src/main/java/org/isoron/uhabits/receivers/WidgetReceiver.java b/app/src/main/java/org/isoron/uhabits/receivers/WidgetReceiver.java
new file mode 100644
index 000000000..32adbe88f
--- /dev/null
+++ b/app/src/main/java/org/isoron/uhabits/receivers/WidgetReceiver.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright (C) 2016 Álinson Santos Xavier
+ * All broadcast messages are received and processed by this class.
+ */
+public class WidgetReceiver extends BroadcastReceiver
+{
+ public static final String ACTION_ADD_REPETITION =
+ "org.isoron.uhabits.ACTION_ADD_REPETITION";
+
+ public static final String ACTION_DISMISS_REMINDER =
+ "org.isoron.uhabits.ACTION_DISMISS_REMINDER";
+
+ public static final String ACTION_REMOVE_REPETITION =
+ "org.isoron.uhabits.ACTION_REMOVE_REPETITION";
+
+ public static final String ACTION_TOGGLE_REPETITION =
+ "org.isoron.uhabits.ACTION_TOGGLE_REPETITION";
+
+ @Inject
+ HabitList habits;
+
+ @NonNull
+ private final IntentParser parser;
+
+ @NonNull
+ private final ReceiverActions actions;
+
+ public WidgetReceiver()
+ {
+ super();
+ HabitsApplication.getComponent().inject(this);
+ parser = new IntentParser(habits);
+ actions = new ReceiverActions();
+ }
+
+ @Override
+ public void onReceive(final Context context, Intent intent)
+ {
+ Log.d("WidgetReceiver",
+ String.format("Received intent: %s", intent.toString()));
+ try
+ {
+ switch (intent.getAction())
+ {
+ case ACTION_ADD_REPETITION:
+ onActionAddRepetition(intent);
+ break;
+
+ case ACTION_TOGGLE_REPETITION:
+ onActionToggleRepetition(intent);
+ break;
+
+ case ACTION_REMOVE_REPETITION:
+ onActionRemoveRepetition(intent);
+ break;
+ }
+ }
+ catch (RuntimeException e)
+ {
+ Log.e("WidgetReceiver", "could not process intent", e);
+ }
+ }
+
+ private void onActionAddRepetition(Intent intent)
+ {
+ IntentParser.CheckmarkIntentData data;
+ data = parser.parseCheckmarkIntent(intent);
+ actions.add_repetition(data.habit, data.timestamp);
+ }
+
+ private void onActionRemoveRepetition(Intent intent)
+ {
+ IntentParser.CheckmarkIntentData data;
+ data = parser.parseCheckmarkIntent(intent);
+ actions.remove_repetition(data.habit, data.timestamp);
+ }
+
+ private void onActionToggleRepetition(Intent intent)
+ {
+ IntentParser.CheckmarkIntentData data;
+ data = parser.parseCheckmarkIntent(intent);
+ actions.toggle_repetition(data.habit, data.timestamp);
+ }
+}
diff --git a/app/src/main/java/org/isoron/uhabits/utils/ReminderUtils.java b/app/src/main/java/org/isoron/uhabits/utils/ReminderUtils.java
index 4ecb3fe4d..633b1c553 100644
--- a/app/src/main/java/org/isoron/uhabits/utils/ReminderUtils.java
+++ b/app/src/main/java/org/isoron/uhabits/utils/ReminderUtils.java
@@ -32,6 +32,7 @@ import android.util.*;
import org.isoron.uhabits.*;
import org.isoron.uhabits.models.*;
+import org.isoron.uhabits.receivers.*;
import java.text.*;
import java.util.*;
@@ -64,8 +65,8 @@ public abstract class ReminderUtils
Uri uri = habit.getUri();
- Intent alarmIntent = new Intent(context, HabitBroadcastReceiver.class);
- alarmIntent.setAction(HabitBroadcastReceiver.ACTION_SHOW_REMINDER);
+ Intent alarmIntent = new Intent(context, ReminderReceiver.class);
+ alarmIntent.setAction(ReminderReceiver.ACTION_SHOW_REMINDER);
alarmIntent.setData(uri);
alarmIntent.putExtra("timestamp", timestamp);
alarmIntent.putExtra("reminderTime", reminderTime);