diff --git a/Habitica/res/layout/activity_task_form.xml b/Habitica/res/layout/activity_task_form.xml
index 849142d7b..cefe26349 100644
--- a/Habitica/res/layout/activity_task_form.xml
+++ b/Habitica/res/layout/activity_task_form.xml
@@ -139,30 +139,29 @@
-
-
-
-
+ android:orientation="horizontal"
+ android:layout_width="match_parent"
+ android:layout_height="72dp">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Habitica/res/layout/row_checklist.xml b/Habitica/res/layout/row_checklist.xml
new file mode 100644
index 000000000..fd2f5cc1e
--- /dev/null
+++ b/Habitica/res/layout/row_checklist.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Habitica/res/layout/row_number_picker.xml b/Habitica/res/layout/row_number_picker.xml
new file mode 100644
index 000000000..63c60ab06
--- /dev/null
+++ b/Habitica/res/layout/row_number_picker.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml
index fd9a15488..e67cf4404 100644
--- a/Habitica/res/values/strings.xml
+++ b/Habitica/res/values/strings.xml
@@ -124,6 +124,10 @@
Notes
Text
Difficulty
+ Trivial
+ Easy
+ Medium
+ Hard
Start Date
Positive ( + )
Negative ( - )
@@ -131,4 +135,16 @@
Actions
Task
+ Frequency
+ On Certain Days of the Week
+ Every X Days
+
+ Monday
+ Tuesday
+ Wednesday
+ Thursday
+ Friday
+ Saturday
+ Sunday
+
\ No newline at end of file
diff --git a/Habitica/res/values/task_difficulties.xml b/Habitica/res/values/task_difficulties.xml
deleted file mode 100644
index e7daf52a0..000000000
--- a/Habitica/res/values/task_difficulties.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
- - Trivial
- - Easy
- - Medium
- - Hard
-
-
\ No newline at end of file
diff --git a/Habitica/res/values/values.xml b/Habitica/res/values/values.xml
index 477c417e3..bab281936 100644
--- a/Habitica/res/values/values.xml
+++ b/Habitica/res/values/values.xml
@@ -7,4 +7,26 @@
- https://habitrpg.com/
+
+
+ - @string/trivial
+ - @string/easy
+ - @string/medium
+ - @string/hard
+
+
+
+ - @string/frequency_weekly
+ - @string/frequency_daily
+
+
+
+ - @string/monday
+ - @string/tuesday
+ - @string/wednesday
+ - @string/thursday
+ - @string/friday
+ - @string/saturday
+ - @string/sunday
+
diff --git a/Habitica/src/com/habitrpg/android/habitica/APIHelper.java b/Habitica/src/com/habitrpg/android/habitica/APIHelper.java
index 2103fdd1d..f86f6a0b7 100644
--- a/Habitica/src/com/habitrpg/android/habitica/APIHelper.java
+++ b/Habitica/src/com/habitrpg/android/habitica/APIHelper.java
@@ -123,7 +123,7 @@ public class APIHelper implements ErrorHandler, Profiler {
};
- public void createUndefNewTask(HabitItem item, Callback cb) {
+ public void createNewTask(HabitItem item, Callback cb) {
if(item instanceof Habit) {
createNewTask((Habit) item, cb);
} else if(item instanceof Daily) {
@@ -175,6 +175,19 @@ public class APIHelper implements ErrorHandler, Profiler {
public void deleteTask(HabitItem item, TaskDeletionCallback cb) {
this.apiService.deleteTask(item.getId(), cb);
}
+
+ public void updateTask(HabitItem item, Callback cb) {
+ if(item instanceof Habit) {
+ updateTask((Habit) item, cb);
+ } else if(item instanceof Daily) {
+ updateTask((Daily) item, cb);
+ } else if(item instanceof ToDo) {
+ updateTask((ToDo) item, cb);
+ } else if(item instanceof Reward) {
+ updateTask((Reward) item, cb);
+ }
+ }
+
public void updateTask(Daily item, Callback cb) {
this.apiService.updateTask(item.getId(), item, cb);
}
diff --git a/Habitica/src/com/habitrpg/android/habitica/MainActivity.java b/Habitica/src/com/habitrpg/android/habitica/MainActivity.java
index 81c2b014e..865621579 100644
--- a/Habitica/src/com/habitrpg/android/habitica/MainActivity.java
+++ b/Habitica/src/com/habitrpg/android/habitica/MainActivity.java
@@ -75,6 +75,8 @@ public class MainActivity extends InstabugAppCompatActivity implements HabitRPGU
Callback> {
static final int SETTINGS = 11;
static final int ABOUT = 12;
+ static final int TASK_CREATED_RESULT = 1;
+ static final int TASK_UPDATED_RESULT = 2;
//region View Elements
@InjectView(R.id.materialViewPager)
@@ -289,7 +291,7 @@ public class MainActivity extends InstabugAppCompatActivity implements HabitRPGU
Intent intent = new Intent(this, TaskFormActivity.class);
intent.putExtras(bundle);
- startActivity(intent);
+ startActivityForResult(intent, TASK_UPDATED_RESULT);
}
public void onEvent(TaskLongPressedEvent event) {
@@ -310,7 +312,7 @@ public class MainActivity extends InstabugAppCompatActivity implements HabitRPGU
Intent intent = new Intent(this, TaskFormActivity.class);
intent.putExtras(bundle);
- startActivity(intent);
+ startActivityForResult(intent, TASK_CREATED_RESULT);
}
public void onEvent(final BuyRewardTappedEvent event) {
@@ -361,6 +363,15 @@ public class MainActivity extends InstabugAppCompatActivity implements HabitRPGU
}
}
+ public void onEvent(final TaskSaveEvent event) {
+ HabitItem task = (HabitItem) event.task;
+ if (event.created) {
+ this.mAPIHelper.createNewTask(task, new TaskCreationCallback(this));
+ } else {
+ this.mAPIHelper.updateTask(task, new TaskUpdateCallback(this));
+ }
+ }
+
private void notifyUser(double xp, double hp, double gold,
double lvl, double delta) {
StringBuilder message = new StringBuilder();
@@ -690,7 +701,7 @@ public class MainActivity extends InstabugAppCompatActivity implements HabitRPGU
@Override
public void onTaskCreation(HabitItem task, boolean editMode) {
if (!editMode) {
- this.mAPIHelper.createUndefNewTask(task, new TaskCreationCallback(this));
+ this.mAPIHelper.createNewTask(task, new TaskCreationCallback(this));
} else {
this.mAPIHelper.uprateUndefinedTask(task, new TaskUpdateCallback(this));
}
diff --git a/Habitica/src/com/habitrpg/android/habitica/TaskFormActivity.java b/Habitica/src/com/habitrpg/android/habitica/TaskFormActivity.java
index 5ba51eb24..483e68ad9 100644
--- a/Habitica/src/com/habitrpg/android/habitica/TaskFormActivity.java
+++ b/Habitica/src/com/habitrpg/android/habitica/TaskFormActivity.java
@@ -1,39 +1,55 @@
package com.habitrpg.android.habitica;
+import android.app.Activity;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
+import android.view.View;
+import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.LinearLayout;
+import android.widget.NumberPicker;
import android.widget.Spinner;
+import android.widget.TextView;
-import com.habitrpg.android.habitica.R;
+import com.habitrpg.android.habitica.events.TaskSaveEvent;
import com.magicmicky.habitrpgwrapper.lib.models.tasks.Daily;
+import com.magicmicky.habitrpgwrapper.lib.models.tasks.Days;
import com.magicmicky.habitrpgwrapper.lib.models.tasks.Habit;
import com.magicmicky.habitrpgwrapper.lib.models.tasks.HabitItem;
import com.magicmicky.habitrpgwrapper.lib.models.tasks.HabitType;
-import com.magicmicky.habitrpgwrapper.lib.models.tasks.Reward;
import com.magicmicky.habitrpgwrapper.lib.models.tasks.ToDo;
import com.raizlabs.android.dbflow.sql.language.Select;
+import java.util.ArrayList;
+import java.util.List;
+
+import de.greenrobot.event.EventBus;
+import io.fabric.sdk.android.services.concurrency.Task;
+
import static com.magicmicky.habitrpgwrapper.lib.models.tasks.HabitType.daily;
import static com.magicmicky.habitrpgwrapper.lib.models.tasks.HabitType.habit;
import static com.magicmicky.habitrpgwrapper.lib.models.tasks.HabitType.reward;
import static com.magicmicky.habitrpgwrapper.lib.models.tasks.HabitType.todo;
-public class TaskFormActivity extends AppCompatActivity {
+public class TaskFormActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener {
private HabitType taskType;
private String taskId;
+ private HabitItem task;
private EditText taskText, taskNotes;
- private Spinner taskDifficulty;
+ private Spinner taskDifficultySpinner, dailyFrequencySpinner;
private CheckBox positiveCheckBox, negativeCheckBox;
+ private List weekdayCheckboxes = new ArrayList();
+ private NumberPicker frequencyPicker;
+ private LinearLayout frequencyContainer;
+
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -54,12 +70,12 @@ public class TaskFormActivity extends AppCompatActivity {
LinearLayout mainWrapper = (LinearLayout) findViewById(R.id.task_main_wrapper);
taskText = (EditText) findViewById(R.id.task_text_edittext);
taskNotes = (EditText) findViewById(R.id.task_notes_edittext);
- taskDifficulty = (Spinner) findViewById(R.id.task_difficulty_spinner);
+ taskDifficultySpinner = (Spinner) findViewById(R.id.task_difficulty_spinner);
ArrayAdapter adapter = ArrayAdapter.createFromResource(this,
R.array.task_difficulties, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
- taskDifficulty.setAdapter(adapter);
+ taskDifficultySpinner.setAdapter(adapter);
if (taskType == habit) {
LinearLayout startDateLayout = (LinearLayout) findViewById(R.id.task_startdate_layout);
@@ -78,24 +94,82 @@ public class TaskFormActivity extends AppCompatActivity {
mainWrapper.removeView(actionsLayout);
}
+ LinearLayout weekdayWrapper = (LinearLayout)findViewById(R.id.task_weekdays_wrapper);
+ if (taskType == daily) {
+ this.dailyFrequencySpinner = (Spinner) weekdayWrapper.findViewById(R.id.task_frequency_spinner);
+
+ ArrayAdapter frequencyAdapter = ArrayAdapter.createFromResource(this,
+ R.array.daily_frequencies, android.R.layout.simple_spinner_item);
+ frequencyAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
+ this.dailyFrequencySpinner.setAdapter(frequencyAdapter);
+ this.dailyFrequencySpinner.setOnItemSelectedListener(this);
+
+ this.frequencyContainer = (LinearLayout) weekdayWrapper.findViewById(R.id.task_frequency_container);
+ } else {
+ mainWrapper.removeView(weekdayWrapper);
+ }
+
if (taskId != null) {
switch (taskType) {
case todo:
ToDo todo = new Select().from(ToDo.class).byIds(taskId).querySingle();
+ this.task = todo;
this.populate(todo);
break;
case daily:
Daily daily = new Select().from(Daily.class).byIds(taskId).querySingle();
+ this.task = daily;
this.populate(daily);
break;
case habit:
Habit habit = new Select().from(Habit.class).byIds(taskId).querySingle();
+ this.task = habit;
this.populate(habit);
break;
}
}
}
+ private void setDailyFrequencyViews() {
+ this.frequencyContainer.removeAllViews();
+ if (this.dailyFrequencySpinner.getSelectedItemPosition() == 0) {
+ String[] weekdays = getResources().getStringArray(R.array.weekdays);
+ for (int i = 0; i < 7; i++) {
+ View weekdayRow = getLayoutInflater().inflate(R.layout.row_checklist, null);
+ TextView tv = (TextView) weekdayRow.findViewById(R.id.label);
+ CheckBox checkbox = (CheckBox) weekdayRow.findViewById(R.id.checkbox);
+ this.weekdayCheckboxes.add(checkbox);
+ tv.setText(weekdays[i]);
+ this.frequencyContainer.addView(weekdayRow);
+ }
+ } else {
+ View dayRow = getLayoutInflater().inflate(R.layout.row_number_picker, null);
+ this.frequencyPicker = (NumberPicker) dayRow.findViewById(R.id.numberPicker);
+ this.frequencyPicker.setMinValue(1);
+ this.frequencyPicker.setMaxValue(366);
+ TextView tv = (TextView) dayRow.findViewById(R.id.label);
+ tv.setText(getResources().getString(R.string.frequency_daily));
+ this.frequencyContainer.addView(dayRow);
+ }
+
+ if (this.task != null) {
+ Daily daily = (Daily) this.task;
+
+ if (this.dailyFrequencySpinner.getSelectedItemPosition() == 0) {
+ this.weekdayCheckboxes.get(0).setChecked(daily.getRepeat().getM());
+ this.weekdayCheckboxes.get(1).setChecked(daily.getRepeat().getT());
+ this.weekdayCheckboxes.get(2).setChecked(daily.getRepeat().getW());
+ this.weekdayCheckboxes.get(3).setChecked(daily.getRepeat().getTh());
+ this.weekdayCheckboxes.get(4).setChecked(daily.getRepeat().getF());
+ this.weekdayCheckboxes.get(5).setChecked(daily.getRepeat().getS());
+ this.weekdayCheckboxes.get(6).setChecked(daily.getRepeat().getSu());
+ } else {
+ this.frequencyPicker.setValue(daily.getEveryX());
+ }
+ }
+
+ }
+
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
@@ -122,6 +196,16 @@ public class TaskFormActivity extends AppCompatActivity {
private void populate(HabitItem task) {
taskText.setText(task.text);
taskNotes.setText(task.notes);
+ float priority = task.getPriority();
+ if (priority == 0.1) {
+ this.taskDifficultySpinner.setSelection(0);
+ } else if (priority == 1.0) {
+ this.taskDifficultySpinner.setSelection(1);
+ } else if (priority == 1.5) {
+ this.taskDifficultySpinner.setSelection(2);
+ } else if (priority == 2.0) {
+ this.taskDifficultySpinner.setSelection(3);
+ }
}
private void populate(Habit task) {
@@ -132,9 +216,113 @@ public class TaskFormActivity extends AppCompatActivity {
private void populate(Daily task) {
populate((HabitItem) task);
+
+ if (task.getFrequency().equals("weekly")) {
+ this.dailyFrequencySpinner.setSelection(0);
+ if (weekdayCheckboxes.size() == 7) {
+ this.weekdayCheckboxes.get(0).setChecked(task.getRepeat().getM());
+ this.weekdayCheckboxes.get(1).setChecked(task.getRepeat().getT());
+ this.weekdayCheckboxes.get(2).setChecked(task.getRepeat().getW());
+ this.weekdayCheckboxes.get(3).setChecked(task.getRepeat().getTh());
+ this.weekdayCheckboxes.get(4).setChecked(task.getRepeat().getF());
+ this.weekdayCheckboxes.get(5).setChecked(task.getRepeat().getS());
+ this.weekdayCheckboxes.get(6).setChecked(task.getRepeat().getSu());
+ }
+ } else {
+ this.dailyFrequencySpinner.setSelection(1);
+ if (this.frequencyPicker != null) {
+ this.frequencyPicker.setValue(task.getEveryX());
+ }
+ }
}
private void populate(ToDo task) {
populate((HabitItem) task);
}
+
+ private void saveTask(HabitItem task) {
+ task.text = taskText.getText().toString();
+ task.notes = taskNotes.getText().toString();
+
+ if (this.taskDifficultySpinner.getSelectedItemPosition() == 0) {
+ task.setPriority((float) 0.1);
+ } else if (this.taskDifficultySpinner.getSelectedItemPosition() == 1) {
+ task.setPriority((float) 1.0);
+ } else if (this.taskDifficultySpinner.getSelectedItemPosition() == 2) {
+ task.setPriority((float) 1.5);
+ } else if (this.taskDifficultySpinner.getSelectedItemPosition() == 3) {
+ task.setPriority((float) 2.0);
+ }
+ }
+
+ private void saveTask(Habit task) {
+ task.setUp(positiveCheckBox.isChecked());
+ task.setDown(negativeCheckBox.isChecked());
+ this.saveTask((HabitItem) task);
+ }
+
+ private void saveTask(Daily task) {
+ if (this.dailyFrequencySpinner.getSelectedItemPosition() == 0) {
+ task.setFrequency("weekly");
+ task.getRepeat().setM(this.weekdayCheckboxes.get(0).isChecked());
+ task.getRepeat().setT(this.weekdayCheckboxes.get(1).isChecked());
+ task.getRepeat().setW(this.weekdayCheckboxes.get(2).isChecked());
+ task.getRepeat().setTh(this.weekdayCheckboxes.get(3).isChecked());
+ task.getRepeat().setF(this.weekdayCheckboxes.get(4).isChecked());
+ task.getRepeat().setS(this.weekdayCheckboxes.get(5).isChecked());
+ task.getRepeat().setSu(this.weekdayCheckboxes.get(6).isChecked());
+ } else {
+ task.setFrequency("daily");
+ task.setEveryX(this.frequencyPicker.getValue());
+ }
+ this.saveTask((HabitItem) task);
+ }
+
+ private void saveTask(ToDo task) {
+ this.saveTask((HabitItem) task);
+ }
+
+ public void onItemSelected(AdapterView> parent, View view,
+ int pos, long id) {
+ this.setDailyFrequencyViews();
+ }
+
+ public void onNothingSelected(AdapterView> parent) {
+ this.setDailyFrequencyViews();
+ }
+
+ private void prepareSave() {
+ TaskSaveEvent event = new TaskSaveEvent();
+ if (this.task == null) {
+ event.created = true;
+ switch (taskType) {
+ case todo:
+ this.task = new ToDo();
+ break;
+ case daily:
+ this.task = new Daily();
+ break;
+ case habit:
+ this.task = new Habit();
+ break;
+ }
+ }
+ this.saveTask(this.task);
+
+ event.task = this.task;
+ EventBus.getDefault().post(event);
+
+ }
+
+ @Override
+ public boolean onSupportNavigateUp() {
+ this.prepareSave();
+ return super.onSupportNavigateUp();
+ }
+
+ @Override
+ public void onBackPressed() {
+ this.prepareSave();
+ super.onBackPressed();
+ }
}
diff --git a/Habitica/src/com/habitrpg/android/habitica/callbacks/TaskCreationCallback.java b/Habitica/src/com/habitrpg/android/habitica/callbacks/TaskCreationCallback.java
index 4b5ba6ea5..7f0183206 100644
--- a/Habitica/src/com/habitrpg/android/habitica/callbacks/TaskCreationCallback.java
+++ b/Habitica/src/com/habitrpg/android/habitica/callbacks/TaskCreationCallback.java
@@ -18,6 +18,9 @@ public class TaskCreationCallback implements Callback {
public TaskCreationCallback(OnHabitCreated cb) {
callback = cb;
}
+
+
+
@Override
public void success(HabitItem habit, Response response) {
callback.onTaskCreated(habit);
diff --git a/Habitica/src/com/habitrpg/android/habitica/events/TaskSaveEvent.java b/Habitica/src/com/habitrpg/android/habitica/events/TaskSaveEvent.java
new file mode 100644
index 000000000..04490ae44
--- /dev/null
+++ b/Habitica/src/com/habitrpg/android/habitica/events/TaskSaveEvent.java
@@ -0,0 +1,12 @@
+package com.habitrpg.android.habitica.events;
+
+import com.magicmicky.habitrpgwrapper.lib.models.tasks.HabitItem;
+
+/**
+ * Created by viirus on 03/08/15.
+ */
+public class TaskSaveEvent {
+ public HabitItem task;
+ public boolean created;
+
+}
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 562ed3638..f5a516924 100644
--- a/Habitica/src/com/habitrpg/android/habitica/ui/fragments/TaskRecyclerViewFragment.java
+++ b/Habitica/src/com/habitrpg/android/habitica/ui/fragments/TaskRecyclerViewFragment.java
@@ -112,7 +112,7 @@ public class TaskRecyclerViewFragment extends Fragment implements View.OnClickLi
@Override
public void onClick(View v) {
AddTaskTappedEvent event = new AddTaskTappedEvent();
- event.ClassType = classType;
+ event.ClassType = this.classType;
EventBus.getDefault().post(event);
}
diff --git a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/tasks/Daily.java b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/tasks/Daily.java
index 418605802..0e60081aa 100644
--- a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/tasks/Daily.java
+++ b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/tasks/Daily.java
@@ -12,6 +12,7 @@ import com.raizlabs.android.dbflow.sql.builder.Condition;
import com.raizlabs.android.dbflow.sql.language.Select;
import com.raizlabs.android.dbflow.structure.BaseModel;
+import java.util.Date;
import java.util.List;
/**
@@ -25,6 +26,12 @@ public class Daily extends Checklist{
@Column
private Boolean completed;
+ @Column
+ private String frequency;
+
+ @Column
+ private Integer everyX;
+
@Column
@ForeignKey(references = {@ForeignKeyReference(columnName = "days_id",
columnType = Long.class,
@@ -58,11 +65,11 @@ public class Daily extends Checklist{
}
public Daily(String id, String notes, Float priority, String text,
Double value, Boolean completed, Days repeat) {
- this(id, notes, priority, text, value,completed,repeat,null,null);
+ this(id, notes, priority, text, value, completed, repeat, null, null);
}
public Daily() {
- this(null,null,null,null,null,null,null);
+ this(null, null, null, null, null, null, null);
}
/**
@@ -78,6 +85,13 @@ public class Daily extends Checklist{
public void setCompleted(Boolean completed) {
this.completed = completed;
}
+
+ public String getFrequency() { return frequency; }
+ public void setFrequency(String frequency) { this.frequency = frequency; }
+
+ public Integer getEveryX() { return everyX; }
+ public void setEveryX(Integer everyX) { this.everyX = everyX; }
+
/**
* @return the repeat array.
* This array contains 7 values, one for each days, starting from monday.
diff --git a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/tasks/HabitItem.java b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/tasks/HabitItem.java
index 3ca15c0f0..d2e5657e6 100644
--- a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/tasks/HabitItem.java
+++ b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/tasks/HabitItem.java
@@ -8,6 +8,8 @@ import com.raizlabs.android.dbflow.structure.BaseModel;
import org.json.JSONObject;
+import java.io.Serializable;
+import java.util.Date;
import java.util.List;
/**
@@ -15,7 +17,7 @@ import java.util.List;
* @author MagicMicky
*
*/
-public abstract class HabitItem extends BaseModel {
+public abstract class HabitItem extends BaseModel implements Serializable {
private String _id;
@Column
@@ -124,7 +126,7 @@ public abstract class HabitItem extends BaseModel {
public void setValue(double value) {
this.setValue(Double.valueOf(value));
}
-
+
/**
* @return the tags
*/