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