diff --git a/Habitica/AndroidManifest.xml b/Habitica/AndroidManifest.xml
index 0f0b9910b..48965b7b1 100644
--- a/Habitica/AndroidManifest.xml
+++ b/Habitica/AndroidManifest.xml
@@ -121,7 +121,7 @@
android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
-
+
diff --git a/Habitica/assets/migrations/Habitica/22.sql b/Habitica/assets/migrations/Habitica/22.sql
deleted file mode 100644
index a7267bd27..000000000
--- a/Habitica/assets/migrations/Habitica/22.sql
+++ /dev/null
@@ -1 +0,0 @@
-ALTER TABLE RemindersItem ADD COLUMN 'alarmId' integer;
\ No newline at end of file
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/HabitDatabase.java b/Habitica/src/main/java/com/habitrpg/android/habitica/HabitDatabase.java
index ac803aff5..5a688bde6 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/HabitDatabase.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/HabitDatabase.java
@@ -7,5 +7,5 @@ public class HabitDatabase {
public static final String NAME = "Habitica";
- public static final int VERSION = 22;
+ public static final int VERSION = 21;
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/TodoReceiver.java b/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/TaskReceiver.java
similarity index 88%
rename from Habitica/src/main/java/com/habitrpg/android/habitica/receivers/TodoReceiver.java
rename to Habitica/src/main/java/com/habitrpg/android/habitica/receivers/TaskReceiver.java
index ba67d97e7..b51154f59 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/TodoReceiver.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/TaskReceiver.java
@@ -7,6 +7,7 @@ import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
+import android.util.Log;
import com.habitrpg.android.habitica.R;
import com.habitrpg.android.habitica.ui.activities.MainActivity;
@@ -15,7 +16,7 @@ import com.habitrpg.android.habitica.ui.helpers.TaskAlarmManager;
/**
* Created by keithholliday on 5/29/16.
*/
-public class TodoReceiver extends BroadcastReceiver {
+public class TaskReceiver extends BroadcastReceiver {
private Context context;
@@ -29,12 +30,14 @@ public class TodoReceiver extends BroadcastReceiver {
taskAlarmManager = TaskAlarmManager.getInstance(context);
Bundle extras = arg1.getExtras();
+
if (extras != null) {
taskTitle = extras.getString(TaskAlarmManager.TASK_NAME_INTENT_KEY);
taskId = extras.getString(TaskAlarmManager.TASK_ID_INTENT_KEY);
+ //This will set up the next reminders for dailies
+ taskAlarmManager.addAlarmForTaskId(taskId);
+ createNotification();
}
-
- createNotification();
}
public void createNotification() {
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskFormActivity.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskFormActivity.java
index ffb68f158..32cdbc2e6 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskFormActivity.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskFormActivity.java
@@ -6,7 +6,6 @@ import com.habitrpg.android.habitica.R;
import com.habitrpg.android.habitica.components.AppComponent;
import com.habitrpg.android.habitica.events.TaskSaveEvent;
import com.habitrpg.android.habitica.events.commands.DeleteTaskCommand;
-import com.habitrpg.android.habitica.receivers.TodoReceiver;
import com.habitrpg.android.habitica.ui.WrapContentRecyclerViewLayoutManager;
import com.habitrpg.android.habitica.ui.adapter.tasks.CheckListAdapter;
import com.habitrpg.android.habitica.ui.adapter.tasks.RemindersAdapter;
@@ -597,6 +596,7 @@ public class TaskFormActivity extends BaseActivity implements AdapterView.OnItem
String[] reminderTimeSplit = reminderTimeString.split(":");
time.setHours(Integer.parseInt(reminderTimeSplit[0]));
time.setMinutes(Integer.parseInt(reminderTimeSplit[1]));
+ time.setSeconds(0);
RemindersItem item = new RemindersItem();
UUID randomUUID = UUID.randomUUID();
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/TaskAlarmManager.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/TaskAlarmManager.java
index 98eefd001..fbc08091b 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/TaskAlarmManager.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/TaskAlarmManager.java
@@ -4,14 +4,10 @@ import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
-import android.content.SharedPreferences;
import android.util.Log;
-import com.google.gson.Gson;
-import com.habitrpg.android.habitica.events.TaskCreatedEvent;
import com.habitrpg.android.habitica.events.TaskSaveEvent;
-import com.habitrpg.android.habitica.events.TaskUpdatedEvent;
-import com.habitrpg.android.habitica.receivers.TodoReceiver;
+import com.habitrpg.android.habitica.receivers.TaskReceiver;
import com.magicmicky.habitrpgwrapper.lib.models.tasks.RemindersItem;
import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task;
import com.raizlabs.android.dbflow.sql.builder.Condition;
@@ -20,15 +16,11 @@ import com.raizlabs.android.dbflow.sql.language.Select;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
-import org.json.JSONObject;
-import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
-import java.util.HashMap;
-import java.util.Iterator;
+import java.util.GregorianCalendar;
import java.util.List;
-import java.util.Map;
/**
* Created by keithholliday on 5/29/16.
@@ -59,36 +51,36 @@ public class TaskAlarmManager {
Task task = (Task) evnt.task;
List reminders = task.getReminders();
for (RemindersItem reminder : reminders) {
- this.addAlarmForTaskReminder(task, reminder);
+ if (task.getType().equals(Task.TYPE_DAILY)) {
+ //Ensure that we set to the next available time
+ reminder = this.setTimeForDailyReminder(reminder, task);
+ }
+ this.setAlarmForRemindersItem(reminder);
+ reminder.async().save();
}
}
- public void addAlarmForTaskReminder(Task task, RemindersItem reminder) {
- if (task.getType().equals("todo")) {
- this.addAlarmForTodo(task, reminder);
- }
- }
+ //This function is used from the TaskReceiver since we do not have access to the task
+ //We currently only use this function to schedule the next reminder for dailies
+ //We may be able to use repeating alarms instead of this in the future
+ public void addAlarmForTaskId(String taskId) {
+ List tasks = new Select()
+ .from(Task.class)
+ .where(Condition.column("id").eq(taskId))
+ .queryList();
- private void addAlarmForTodo(Task task, RemindersItem reminder) {
- Calendar cal = Calendar.getInstance();
- cal.setTime(reminder.getStartDate());
-
- Intent intent = new Intent(context, TodoReceiver.class);
- intent.putExtra(TASK_NAME_INTENT_KEY, task.getText());
- intent.putExtra(TASK_ID_INTENT_KEY, task.getId());
-
- Integer alarmId = reminder.getAlarmId();
- if (alarmId == null) {
- alarmId = (int) System.currentTimeMillis();
- reminder.setAlarmId(alarmId);
+ Task task = tasks.get(0);
+ if (!task.getType().equals(Task.TYPE_DAILY)) {
+ return;
}
- PendingIntent sender = PendingIntent.getBroadcast(context, alarmId, intent, PendingIntent.FLAG_UPDATE_CURRENT);
-
- AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
- am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), sender);
-
- reminder.async().save();
+ List reminders = task.getReminders();
+ for (RemindersItem remindersItem : reminders) {
+ //Ensure that we set to the next available time
+ remindersItem = this.setTimeForDailyReminder(remindersItem, task);
+ this.setAlarmForRemindersItem(remindersItem);
+ remindersItem.async().save();
+ }
}
public void scheduleAllSavedAlarms() {
@@ -99,21 +91,45 @@ public class TaskAlarmManager {
.queryList();
for (RemindersItem remindersItem : reminders) {
- Task reminderItemTask = remindersItem.getTask();
- Integer alarmId = remindersItem.getAlarmId();
-
- Calendar cal = Calendar.getInstance();
- cal.setTime(remindersItem.getStartDate());
-
- Intent intent = new Intent(context, TodoReceiver.class);
- intent.putExtra(TASK_NAME_INTENT_KEY, reminderItemTask.getText());
- intent.putExtra(TASK_ID_INTENT_KEY, reminderItemTask.getId());
-
- PendingIntent sender = PendingIntent.getBroadcast(context, alarmId, intent, PendingIntent.FLAG_UPDATE_CURRENT);
-
- AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
- am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), sender);
+ this.setAlarmForRemindersItem(remindersItem);
}
}
+ private RemindersItem setTimeForDailyReminder (RemindersItem remindersItem, Task task) {
+ Date oldTime = remindersItem.getTime();
+ Date newTime = task.getNextActiveDateAfter(oldTime);
+ newTime.setHours(oldTime.getHours());
+ newTime.setMinutes(oldTime.getMinutes());
+ newTime.setSeconds(0);
+ remindersItem.setTime(newTime);
+ return remindersItem;
+ }
+
+ private void setAlarmForRemindersItem(RemindersItem remindersItem) {
+ Task reminderItemTask = remindersItem.getTask();
+ Integer alarmId = remindersItem.getAlarmId();
+
+ if (alarmId == null) {
+ alarmId = (int) System.currentTimeMillis();
+ remindersItem.setAlarmId(alarmId);
+ }
+
+ Date now = new Date();
+
+ if (remindersItem.getTime().before(now)) {
+ return;
+ }
+
+ Calendar cal = Calendar.getInstance();
+ cal.setTime(remindersItem.getTime());
+
+ Intent intent = new Intent(context, TaskReceiver.class);
+ intent.putExtra(TASK_NAME_INTENT_KEY, reminderItemTask.getText());
+ intent.putExtra(TASK_ID_INTENT_KEY, reminderItemTask.getId());
+
+ PendingIntent sender = PendingIntent.getBroadcast(context, alarmId, intent, PendingIntent.FLAG_UPDATE_CURRENT);
+
+ AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
+ am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), sender);
+ }
}
diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/tasks/Task.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/tasks/Task.java
index f372690a5..850e2c7d9 100644
--- a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/tasks/Task.java
+++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/tasks/Task.java
@@ -577,4 +577,28 @@ public class Task extends BaseModel {
public Boolean isChecklistDisplayActive(int offset) {
return this.isDisplayedActive(offset) && (this.checklist.size() != this.getCompletedChecklistCount());
}
+
+ public Date getNextActiveDateAfter(Date oldTime) {
+ Calendar today = new GregorianCalendar();
+ today.set(Calendar.MILLISECOND, 0);
+ today.set(Calendar.SECOND, 0);
+
+ Calendar newTime = new GregorianCalendar();
+ newTime.setTime(oldTime);
+
+ if (this.getFrequency().equals(FREQUENCY_DAILY)) {
+ TimeUnit timeUnit = TimeUnit.DAYS;
+ long diffInMillies = newTime.getTimeInMillis() - today.getTimeInMillis();
+ long daySinceStart = timeUnit.convert(diffInMillies, TimeUnit.MILLISECONDS);
+ Log.v("Test", String.valueOf(daySinceStart % this.getEveryX()));
+ } else {
+ int nextActiveDayOfTheWeek = today.get(Calendar.DAY_OF_WEEK);
+ while (!this.getRepeat().getForDay(nextActiveDayOfTheWeek) || newTime.before(today)) {
+ if (nextActiveDayOfTheWeek == 6) nextActiveDayOfTheWeek = 0;
+ nextActiveDayOfTheWeek += 1;
+ newTime.add(Calendar.DATE, 1);
+ }
+ }
+ return newTime.getTime();
+ }
}
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 22d6f6602..73e9ac19c 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -4,3 +4,4 @@ distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.13-all.zip
+org.gradle.jvmargs=-Xmx3072M