From a61f53caf571e7de138cf3bd8ad13c01c753ed7c Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Sat, 14 Nov 2015 19:02:20 +0100 Subject: [PATCH] correctly display dailies as due --- Habitica/Habitica.iml | 10 ++-- Habitica/res/layout/daily_item_card.xml | 9 ++- .../android/habitica/MainActivity.java | 17 ++++-- .../adapter/HabitItemRecyclerViewAdapter.java | 2 + .../fragments/TaskRecyclerViewFragment.java | 2 +- .../lib/models/tasks/Days.java | 13 +++++ .../lib/models/tasks/Task.java | 55 +++++++++++++++++-- 7 files changed, 90 insertions(+), 18 deletions(-) diff --git a/Habitica/Habitica.iml b/Habitica/Habitica.iml index 63d46089c..c4032a292 100644 --- a/Habitica/Habitica.iml +++ b/Habitica/Habitica.iml @@ -112,8 +112,8 @@ - + @@ -134,8 +134,8 @@ - + @@ -147,15 +147,15 @@ - - + + - + diff --git a/Habitica/res/layout/daily_item_card.xml b/Habitica/res/layout/daily_item_card.xml index fdef8f868..63f3cc084 100644 --- a/Habitica/res/layout/daily_item_card.xml +++ b/Habitica/res/layout/daily_item_card.xml @@ -11,6 +11,9 @@ + + app:backgroundColor="@{daily.isDisplayedActive(offset) ? daily.getLightTaskColor : @color/task_gray}"> private ObservableArrayList observableContent; FlowContentObserver observer; Context context; + public int dailyResetOffset; static final int TYPE_HEADER = 0; static final int TYPE_CELL = 1; @@ -418,6 +419,7 @@ public class HabitItemRecyclerViewAdapter binding = DataBindingUtil.bind(itemView); checkbox.setOnCheckedChangeListener(this); + binding.setOffset(dailyResetOffset); } diff --git a/Habitica/src/com/habitrpg/android/habitica/ui/fragments/TaskRecyclerViewFragment.java b/Habitica/src/com/habitrpg/android/habitica/ui/fragments/TaskRecyclerViewFragment.java index ff1d125a9..3e1c68742 100644 --- a/Habitica/src/com/habitrpg/android/habitica/ui/fragments/TaskRecyclerViewFragment.java +++ b/Habitica/src/com/habitrpg/android/habitica/ui/fragments/TaskRecyclerViewFragment.java @@ -23,7 +23,7 @@ import de.greenrobot.event.EventBus; */ public class TaskRecyclerViewFragment extends Fragment implements View.OnClickListener { public RecyclerView mRecyclerView; - private RecyclerView.Adapter mAdapter; + public RecyclerView.Adapter mAdapter; private String classType; // TODO needs a bit of cleanup diff --git a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/tasks/Days.java b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/tasks/Days.java index 81e5f001f..1d82e27ba 100644 --- a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/tasks/Days.java +++ b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/tasks/Days.java @@ -83,4 +83,17 @@ public class Days extends BaseModel { public void setM(boolean m) { this.m = m; } + + public boolean getForDay(int day) { + switch (day) { + case 2: return this.getM(); + case 3: return this.getT(); + case 4: return this.getW(); + case 5: return this.getTh(); + case 6: return this.getF(); + case 7: return this.getS(); + case 1: return this.getSu(); + } + return false; + } } diff --git a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/tasks/Task.java b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/tasks/Task.java index c31ba0370..593261deb 100644 --- a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/tasks/Task.java +++ b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/tasks/Task.java @@ -14,8 +14,11 @@ import com.raizlabs.android.dbflow.sql.language.Select; import com.raizlabs.android.dbflow.structure.BaseModel; import java.util.ArrayList; +import java.util.Calendar; import java.util.Date; +import java.util.GregorianCalendar; import java.util.List; +import java.util.concurrent.TimeUnit; /** * Created by viirus on 10/08/15. @@ -27,6 +30,9 @@ public class Task extends BaseModel { public static String TYPE_TODO = "todo"; public static String TYPE_DAILY = "daily"; public static String TYPE_REWARD = "reward"; + public static String FREQUENCY_WEEKLY = "weekly"; + public static String FREQUENCY_DAILY = "daily"; + @Column @PrimaryKey @@ -64,6 +70,9 @@ public class Task extends BaseModel { @Column public Integer everyX, streak; + @Column + Date startDate; + @Column @ForeignKey(references = {@ForeignKeyReference(columnName = "days_id", columnType = Long.class, @@ -273,6 +282,9 @@ public class Task extends BaseModel { public Integer getEveryX() { return everyX; } public void setEveryX(Integer everyX) { this.everyX = everyX; } + public Date getStartDate() { return startDate; } + public void setStartDate(Date startDate) {this.startDate = startDate; } + /** * @return the repeat array.
* This array contains 7 values, one for each days, starting from monday. @@ -405,12 +417,45 @@ public class Task extends BaseModel { return R.color.best_10; } - public Boolean isDue() { - //TODO: check if daily is due - return !this.getCompleted(); + public Boolean isDue(int offset) { + if (this.getCompleted()) { + return true; + } + + Calendar today = new GregorianCalendar(); + today.add(Calendar.HOUR, -offset); + + if (this.getStartDate() != null) { + Calendar startDate = new GregorianCalendar(); + startDate.setTime(this.getStartDate()); + Calendar startDateAtMidnight = new GregorianCalendar(startDate.get(Calendar.YEAR), + startDate.get(Calendar.MONTH), + startDate.get(Calendar.DAY_OF_MONTH)); + + if ( startDateAtMidnight.after(today) ) { + return false; + } + } + + if (this.getFrequency().equals(FREQUENCY_DAILY)) { + Calendar startDate = new GregorianCalendar(); + if (this.getStartDate() != null) { + startDate.setTime(this.getStartDate()); + } + TimeUnit timeUnit = TimeUnit.DAYS; + long diffInMillies = startDate.getTimeInMillis() - today.getTimeInMillis(); + long daySinceStart = timeUnit.convert(diffInMillies, TimeUnit.MILLISECONDS); + return (daySinceStart % this.getEveryX() == 0); + } else { + return this.getRepeat().getForDay(today.get(Calendar.DAY_OF_WEEK)); + } } - public Boolean isDisplayedActive() { - return this.isDue() && !this.completed; + public Boolean isDisplayedActive(int offset) { + return this.isDue(offset) && !this.completed; + } + + public Boolean isChecklistDisplayActive(int offset) { + return this.isDisplayedActive(offset) || (this.checklist.size() != this.getCompletedChecklistCount()); } }