From bbe80a30c44bc9c9092dc99ab8cdc7e51c8ca0cd Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Mon, 3 Aug 2015 15:51:04 +0200 Subject: [PATCH] First working task creating/update form --- Habitica/res/layout/activity_task_form.xml | 71 +++++-- Habitica/res/layout/row_checklist.xml | 22 ++ Habitica/res/layout/row_number_picker.xml | 27 +++ Habitica/res/values/strings.xml | 16 ++ Habitica/res/values/task_difficulties.xml | 9 - Habitica/res/values/values.xml | 22 ++ .../habitrpg/android/habitica/APIHelper.java | 15 +- .../android/habitica/MainActivity.java | 17 +- .../android/habitica/TaskFormActivity.java | 200 +++++++++++++++++- .../callbacks/TaskCreationCallback.java | 3 + .../habitica/events/TaskSaveEvent.java | 12 ++ .../fragments/TaskRecyclerViewFragment.java | 2 +- .../lib/models/tasks/Daily.java | 18 +- .../lib/models/tasks/HabitItem.java | 6 +- 14 files changed, 395 insertions(+), 45 deletions(-) create mode 100644 Habitica/res/layout/row_checklist.xml create mode 100644 Habitica/res/layout/row_number_picker.xml delete mode 100644 Habitica/res/values/task_difficulties.xml create mode 100644 Habitica/src/com/habitrpg/android/habitica/events/TaskSaveEvent.java 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 */