From 40e606d37730e0e365099b5be86f69d6bbc5d84d Mon Sep 17 00:00:00 2001 From: Negue Date: Mon, 28 Sep 2015 22:37:43 +0200 Subject: [PATCH] - add dateCreated to task - refactored some code - fixed #4 #5 --- .../habitrpg/android/habitica/APIHelper.java | 2 + .../android/habitica/MainActivity.java | 44 +++++------------- .../android/habitica/TaskFormActivity.java | 2 + .../callbacks/TaskCreationCallback.java | 18 ++------ .../callbacks/TaskUpdateCallback.java | 15 +++---- .../habitica/events/AddTaskTappedEvent.java | 8 ---- .../habitica/events/TaskCreatedEvent.java | 14 ++++++ .../habitica/events/TaskUpdatedEvent.java | 14 ++++++ .../events/commands/AddNewTaskCommand.java | 8 ++++ .../adapter/HabitItemRecyclerViewAdapter.java | 45 ++++++++++++------- .../fragments/TaskRecyclerViewFragment.java | 12 ++--- .../lib/models/tasks/Task.java | 8 ++++ 12 files changed, 103 insertions(+), 87 deletions(-) delete mode 100644 Habitica/src/com/habitrpg/android/habitica/events/AddTaskTappedEvent.java create mode 100644 Habitica/src/com/habitrpg/android/habitica/events/TaskCreatedEvent.java create mode 100644 Habitica/src/com/habitrpg/android/habitica/events/TaskUpdatedEvent.java create mode 100644 Habitica/src/com/habitrpg/android/habitica/events/commands/AddNewTaskCommand.java diff --git a/Habitica/src/com/habitrpg/android/habitica/APIHelper.java b/Habitica/src/com/habitrpg/android/habitica/APIHelper.java index d65d17f4b..7239f4eaf 100644 --- a/Habitica/src/com/habitrpg/android/habitica/APIHelper.java +++ b/Habitica/src/com/habitrpg/android/habitica/APIHelper.java @@ -31,6 +31,7 @@ import com.raizlabs.android.dbflow.structure.ModelAdapter; import java.io.IOException; import java.lang.reflect.Type; +import java.text.DateFormat; import java.util.List; import retrofit.Callback; @@ -82,6 +83,7 @@ public class APIHelper implements ErrorHandler, Profiler { .registerTypeAdapter(taskTagClassListType, new TagsAdapter()) .registerTypeAdapter(Boolean.class, booleanAsIntAdapter) .registerTypeAdapter(boolean.class, booleanAsIntAdapter) + .setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'") .create(); Server server = new Server(cfg.getAddress()); diff --git a/Habitica/src/com/habitrpg/android/habitica/MainActivity.java b/Habitica/src/com/habitrpg/android/habitica/MainActivity.java index 9e0b09b37..de1a9cda0 100644 --- a/Habitica/src/com/habitrpg/android/habitica/MainActivity.java +++ b/Habitica/src/com/habitrpg/android/habitica/MainActivity.java @@ -16,7 +16,8 @@ import com.habitrpg.android.habitica.callbacks.HabitRPGUserCallback; import com.habitrpg.android.habitica.callbacks.TaskCreationCallback; import com.habitrpg.android.habitica.callbacks.TaskScoringCallback; import com.habitrpg.android.habitica.callbacks.TaskUpdateCallback; -import com.habitrpg.android.habitica.events.AddTaskTappedEvent; +import com.habitrpg.android.habitica.events.TaskCreatedEvent; +import com.habitrpg.android.habitica.events.commands.AddNewTaskCommand; import com.habitrpg.android.habitica.events.BuyRewardTappedEvent; import com.habitrpg.android.habitica.events.HabitScoreEvent; import com.habitrpg.android.habitica.events.TaskCheckedEvent; @@ -62,7 +63,6 @@ import retrofit.client.Response; public class MainActivity extends AvatarActivityBase implements HabitRPGUserCallback.OnUserReceived, TaskScoringCallback.OnTaskScored, FlowContentObserver.OnSpecificModelStateChangedListener, - TaskCreationCallback.OnHabitCreated, TaskUpdateCallback.OnHabitUpdated, Callback>, OnCheckedChangeListener { static final int TASK_CREATED_RESULT = 1; @@ -199,12 +199,14 @@ public class MainActivity extends AvatarActivityBase implements HabitRPGUserCall mAPIHelper.updateTaskDirection(event.Habit.getId(), event.Up ? TaskDirection.up : TaskDirection.down, new TaskScoringCallback(this, event.Habit.getId())); } - public void onEvent(AddTaskTappedEvent event) { + public void onEvent(AddNewTaskCommand event) { Bundle bundle = new Bundle(); - bundle.putString("type", event.ClassType.getSimpleName().toLowerCase()); + bundle.putString("type", event.ClassType.toLowerCase()); Intent intent = new Intent(this, TaskFormActivity.class); intent.putExtras(bundle); + intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); + startActivityForResult(intent, TASK_CREATED_RESULT); } @@ -261,9 +263,9 @@ public class MainActivity extends AvatarActivityBase implements HabitRPGUserCall public void onEvent(final TaskSaveEvent event) { Task task = (Task) event.task; if (event.created) { - this.mAPIHelper.createNewTask(task, new TaskCreationCallback(this)); + this.mAPIHelper.createNewTask(task, new TaskCreationCallback()); } else { - this.mAPIHelper.updateTask(task, new TaskUpdateCallback(this)); + this.mAPIHelper.updateTask(task, new TaskUpdateCallback()); } } @@ -330,20 +332,20 @@ public class MainActivity extends AvatarActivityBase implements HabitRPGUserCall switch (position) { case 0: layoutOfType = R.layout.habit_item_card; - fragment = TaskRecyclerViewFragment.newInstance(new HabitItemRecyclerViewAdapter("habit", Task.class, layoutOfType, HabitItemRecyclerViewAdapter.HabitViewHolder.class, MainActivity.this), Task.class); + fragment = TaskRecyclerViewFragment.newInstance(new HabitItemRecyclerViewAdapter(Task.TYPE_HABIT, layoutOfType, HabitItemRecyclerViewAdapter.HabitViewHolder.class, MainActivity.this), Task.TYPE_HABIT); break; case 1: layoutOfType = R.layout.daily_item_card; - fragment = TaskRecyclerViewFragment.newInstance(new HabitItemRecyclerViewAdapter("daily", Task.class, layoutOfType, HabitItemRecyclerViewAdapter.DailyViewHolder.class, MainActivity.this), Task.class); + fragment = TaskRecyclerViewFragment.newInstance(new HabitItemRecyclerViewAdapter(Task.TYPE_DAILY, layoutOfType, HabitItemRecyclerViewAdapter.DailyViewHolder.class, MainActivity.this), Task.TYPE_DAILY); break; case 3: layoutOfType = R.layout.reward_item_card; - fragment = TaskRecyclerViewFragment.newInstance(new HabitItemRecyclerViewAdapter("reward", Task.class, layoutOfType, HabitItemRecyclerViewAdapter.RewardViewHolder.class, MainActivity.this), Task.class); + fragment = TaskRecyclerViewFragment.newInstance(new HabitItemRecyclerViewAdapter(Task.TYPE_REWARD, layoutOfType, HabitItemRecyclerViewAdapter.RewardViewHolder.class, MainActivity.this), Task.TYPE_REWARD); break; default: layoutOfType = R.layout.todo_item_card; - fragment = TaskRecyclerViewFragment.newInstance(new HabitItemRecyclerViewAdapter("todo", Task.class, layoutOfType, HabitItemRecyclerViewAdapter.TodoViewHolder.class, MainActivity.this), Task.class); + fragment = TaskRecyclerViewFragment.newInstance(new HabitItemRecyclerViewAdapter(Task.TYPE_TODO, layoutOfType, HabitItemRecyclerViewAdapter.TodoViewHolder.class, MainActivity.this), Task.TYPE_TODO); } ViewFragmentsDictionary.put(position, fragment); @@ -512,28 +514,6 @@ public class MainActivity extends AvatarActivityBase implements HabitRPGUserCall } } - // TaskCreationCallback - @Override - public void onTaskCreated(Task habit) { - habit.save(); - } - - @Override - public void onTaskCreationFail() { - - } - - // TaskUpdateCallback - @Override - public void onTaskUpdated(Task habit) { - habit.save(); - } - - @Override - public void onTaskUpdateFail() { - - } - // Filter Tags public void FillTagFilterDrawer(List tagList) { diff --git a/Habitica/src/com/habitrpg/android/habitica/TaskFormActivity.java b/Habitica/src/com/habitrpg/android/habitica/TaskFormActivity.java index 36f966510..2029f2034 100644 --- a/Habitica/src/com/habitrpg/android/habitica/TaskFormActivity.java +++ b/Habitica/src/com/habitrpg/android/habitica/TaskFormActivity.java @@ -265,12 +265,14 @@ public class TaskFormActivity extends AppCompatActivity implements AdapterView.O @Override public boolean onSupportNavigateUp() { this.prepareSave(); + finish(); return super.onSupportNavigateUp(); } @Override public void onBackPressed() { this.prepareSave(); + finish(); 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 8a6bfb995..dcb45bf62 100644 --- a/Habitica/src/com/habitrpg/android/habitica/callbacks/TaskCreationCallback.java +++ b/Habitica/src/com/habitrpg/android/habitica/callbacks/TaskCreationCallback.java @@ -3,8 +3,10 @@ package com.habitrpg.android.habitica.callbacks; import android.util.Log; import com.crashlytics.android.Crashlytics; +import com.habitrpg.android.habitica.events.TaskCreatedEvent; import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task; +import de.greenrobot.event.EventBus; import retrofit.Callback; import retrofit.RetrofitError; import retrofit.client.Response; @@ -13,30 +15,16 @@ import retrofit.client.Response; * Created by magicmicky on 02/04/15. */ public class TaskCreationCallback implements Callback { - private OnHabitCreated callback; - - public TaskCreationCallback(OnHabitCreated cb) { - callback = cb; - } - - - @Override public void success(Task task, Response response) { task.save(); - callback.onTaskCreated(task); + EventBus.getDefault().post(new TaskCreatedEvent(task)); } @Override public void failure(RetrofitError error) { Crashlytics.logException(error); - callback.onTaskCreationFail(); Log.w("HabitCreation", "Error " + error.getMessage()); } - - public interface OnHabitCreated { - public void onTaskCreated(Task habit); - public void onTaskCreationFail(); - } } diff --git a/Habitica/src/com/habitrpg/android/habitica/callbacks/TaskUpdateCallback.java b/Habitica/src/com/habitrpg/android/habitica/callbacks/TaskUpdateCallback.java index e60b90f38..f40f51939 100644 --- a/Habitica/src/com/habitrpg/android/habitica/callbacks/TaskUpdateCallback.java +++ b/Habitica/src/com/habitrpg/android/habitica/callbacks/TaskUpdateCallback.java @@ -3,8 +3,10 @@ package com.habitrpg.android.habitica.callbacks; import android.util.Log; import com.crashlytics.android.Crashlytics; +import com.habitrpg.android.habitica.events.TaskCreatedEvent; import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task; +import de.greenrobot.event.EventBus; import retrofit.Callback; import retrofit.RetrofitError; import retrofit.client.Response; @@ -13,26 +15,19 @@ import retrofit.client.Response; * Created by magicmicky on 02/04/15. */ public class TaskUpdateCallback implements Callback { - private OnHabitUpdated callback; - public TaskUpdateCallback(OnHabitUpdated cb) { - callback = cb; - } @Override public void success(Task task, Response response) { task.save(); - callback.onTaskUpdated(task); + + EventBus.getDefault().post(new TaskCreatedEvent(task)); } @Override public void failure(RetrofitError error) { Crashlytics.logException(error); - callback.onTaskUpdateFail(); Log.w("HabitUpdate", "Error " + error.getMessage()); } - public interface OnHabitUpdated { - void onTaskUpdated(Task habit); - void onTaskUpdateFail(); - } + } diff --git a/Habitica/src/com/habitrpg/android/habitica/events/AddTaskTappedEvent.java b/Habitica/src/com/habitrpg/android/habitica/events/AddTaskTappedEvent.java deleted file mode 100644 index 2366ca70b..000000000 --- a/Habitica/src/com/habitrpg/android/habitica/events/AddTaskTappedEvent.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.habitrpg.android.habitica.events; - -/** - * Created by Negue on 11.07.2015. - */ -public class AddTaskTappedEvent { - public Class ClassType ; -} diff --git a/Habitica/src/com/habitrpg/android/habitica/events/TaskCreatedEvent.java b/Habitica/src/com/habitrpg/android/habitica/events/TaskCreatedEvent.java new file mode 100644 index 000000000..c24e76f69 --- /dev/null +++ b/Habitica/src/com/habitrpg/android/habitica/events/TaskCreatedEvent.java @@ -0,0 +1,14 @@ +package com.habitrpg.android.habitica.events; + +import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task; + +/** + * Created by Negue on 28.09.2015. + */ +public class TaskCreatedEvent { + public Task task; + + public TaskCreatedEvent(Task t){ + task = t; + } +} diff --git a/Habitica/src/com/habitrpg/android/habitica/events/TaskUpdatedEvent.java b/Habitica/src/com/habitrpg/android/habitica/events/TaskUpdatedEvent.java new file mode 100644 index 000000000..33814caa6 --- /dev/null +++ b/Habitica/src/com/habitrpg/android/habitica/events/TaskUpdatedEvent.java @@ -0,0 +1,14 @@ +package com.habitrpg.android.habitica.events; + +import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task; + +/** + * Created by Negue on 28.09.2015. + */ +public class TaskUpdatedEvent { + public Task task; + + public TaskUpdatedEvent(Task t){ + task = t; + } +} diff --git a/Habitica/src/com/habitrpg/android/habitica/events/commands/AddNewTaskCommand.java b/Habitica/src/com/habitrpg/android/habitica/events/commands/AddNewTaskCommand.java new file mode 100644 index 000000000..b4dd12d9a --- /dev/null +++ b/Habitica/src/com/habitrpg/android/habitica/events/commands/AddNewTaskCommand.java @@ -0,0 +1,8 @@ +package com.habitrpg.android.habitica.events.commands; + +/** + * Created by Negue on 11.07.2015. + */ +public class AddNewTaskCommand { + public String ClassType ; +} diff --git a/Habitica/src/com/habitrpg/android/habitica/ui/adapter/HabitItemRecyclerViewAdapter.java b/Habitica/src/com/habitrpg/android/habitica/ui/adapter/HabitItemRecyclerViewAdapter.java index c49b21c14..55f406d7b 100644 --- a/Habitica/src/com/habitrpg/android/habitica/ui/adapter/HabitItemRecyclerViewAdapter.java +++ b/Habitica/src/com/habitrpg/android/habitica/ui/adapter/HabitItemRecyclerViewAdapter.java @@ -1,7 +1,6 @@ package com.habitrpg.android.habitica.ui.adapter; import android.app.Activity; -import android.app.Application; import android.content.Context; import android.databinding.DataBindingUtil; import android.databinding.ObservableArrayList; @@ -27,19 +26,22 @@ import com.habitrpg.android.habitica.databinding.TodoItemCardBinding; import com.habitrpg.android.habitica.events.BuyRewardTappedEvent; import com.habitrpg.android.habitica.events.HabitScoreEvent; import com.habitrpg.android.habitica.events.TaskCheckedEvent; +import com.habitrpg.android.habitica.events.TaskCreatedEvent; import com.habitrpg.android.habitica.events.TaskLongPressedEvent; import com.habitrpg.android.habitica.events.TaskSaveEvent; import com.habitrpg.android.habitica.events.TaskTappedEvent; +import com.habitrpg.android.habitica.events.TaskUpdatedEvent; import com.habitrpg.android.habitica.events.commands.FilterTasksByTagsCommand; import com.magicmicky.habitrpgwrapper.lib.models.tasks.ChecklistItem; import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task; import com.raizlabs.android.dbflow.runtime.FlowContentObserver; import com.raizlabs.android.dbflow.sql.builder.Condition; +import com.raizlabs.android.dbflow.sql.language.OrderBy; import com.raizlabs.android.dbflow.sql.language.Select; import com.raizlabs.android.dbflow.structure.BaseModel; import com.raizlabs.android.dbflow.structure.Model; -import java.util.List; +import java.util.Objects; import butterknife.ButterKnife; import butterknife.InjectView; @@ -50,12 +52,11 @@ public class HabitItemRecyclerViewAdapter implements FlowContentObserver.OnModelStateChangedListener { int layoutResource; - private Class> viewHolderClass; - Class taskClass; + private Class> viewHolderClass; Integer displayedChecklist = null; String taskType; - private ObservableArrayList filteredObservableContent; - private ObservableArrayList observableContent; + private ObservableArrayList filteredObservableContent; + private ObservableArrayList observableContent; FlowContentObserver observer; Context context; @@ -64,22 +65,21 @@ public class HabitItemRecyclerViewAdapter private RecyclerView.Adapter parentAdapter; - public HabitItemRecyclerViewAdapter(String taskType, Class newTaskClass, int layoutResource, Class> viewHolderClass, Context newContext) { - this(taskType, newTaskClass, layoutResource, viewHolderClass, newContext, null); + public HabitItemRecyclerViewAdapter(String taskType, int layoutResource, Class> viewHolderClass, Context newContext) { + this(taskType, layoutResource, viewHolderClass, newContext, null); } - public HabitItemRecyclerViewAdapter(String taskType, Class newTaskClass, int layoutResource, Class> viewHolderClass, - Context newContext, final ObservableArrayList content) { + public HabitItemRecyclerViewAdapter(String taskType, int layoutResource, Class> viewHolderClass, + Context newContext, final ObservableArrayList content) { this.taskType = taskType; this.context = newContext; - this.taskClass = newTaskClass; observableContent = content; if (content == null) { this.loadContent(); observer = new FlowContentObserver(); - observer.registerForContentChanges(this.context, this.taskClass); + observer.registerForContentChanges(this.context, Task.class); observer.addModelChangeListener(this); } else { content.addOnListChangedCallback(new ObservableList.OnListChangedCallback() { @@ -121,16 +121,16 @@ public class HabitItemRecyclerViewAdapter this.viewHolderClass = viewHolderClass; EventBus.getDefault().register(this); - onEvent(null); + onEvent((FilterTasksByTagsCommand)null); } public void onEvent(FilterTasksByTagsCommand cmd) { if (cmd == null || cmd.tagList.size() == 0) { filteredObservableContent = observableContent; } else { - filteredObservableContent = new ObservableArrayList(); + filteredObservableContent = new ObservableArrayList(); - for (THabitItem e : observableContent) { + for (Task e : observableContent) { if (e.containsAllTagIds(cmd.tagList)) { filteredObservableContent.add(e); } @@ -150,6 +150,18 @@ public class HabitItemRecyclerViewAdapter } + public void onEvent(TaskUpdatedEvent evnt){ + // TODO Update Entry + } + + public void onEvent(TaskCreatedEvent evnt){ + if(!taskType.equals(evnt.task.getType())) + return; + + observableContent.add(0, evnt.task); + notifyDataSetChanged(); + } + public void setParentAdapter(RecyclerView.Adapter parentAdapter) { this.parentAdapter = parentAdapter; } @@ -502,8 +514,9 @@ public class HabitItemRecyclerViewAdapter this.observableContent = new ObservableArrayList<>(); - this.observableContent.addAll(new Select().from(this.taskClass) + this.observableContent.addAll(new Select().from(Task.class) .where(Condition.column("type").eq(this.taskType)) + .orderBy(OrderBy.columns("dateCreated").descending()) .queryList()); } 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 69b8ec14b..d33af2aa4 100644 --- a/Habitica/src/com/habitrpg/android/habitica/ui/fragments/TaskRecyclerViewFragment.java +++ b/Habitica/src/com/habitrpg/android/habitica/ui/fragments/TaskRecyclerViewFragment.java @@ -12,7 +12,7 @@ import android.view.View; import android.view.ViewGroup; import com.habitrpg.android.habitica.R; -import com.habitrpg.android.habitica.events.AddTaskTappedEvent; +import com.habitrpg.android.habitica.events.commands.AddNewTaskCommand; import com.habitrpg.android.habitica.ui.adapter.HabitItemRecyclerViewAdapter; import com.mikepenz.iconics.IconicsDrawable; import com.mikepenz.iconics.typeface.FontAwesome; @@ -28,11 +28,11 @@ import de.greenrobot.event.EventBus; public class TaskRecyclerViewFragment extends Fragment implements View.OnClickListener { public RecyclerView mRecyclerView; private RecyclerView.Adapter mAdapter; - private Class classType; + private String classType; private boolean showFloatingButton; // TODO needs a bit of cleanup - public void SetInnerAdapter(HabitItemRecyclerViewAdapter adapter, Class classType, boolean showFloatingButton) { + public void SetInnerAdapter(HabitItemRecyclerViewAdapter adapter, String classType, boolean showFloatingButton) { this.classType = classType; this.showFloatingButton = showFloatingButton; mAdapter = adapter; @@ -89,11 +89,11 @@ public class TaskRecyclerViewFragment extends Fragment implements View.OnClickLi alreadyCreated = true; } - public static TaskRecyclerViewFragment newInstance(HabitItemRecyclerViewAdapter adapter, Class classType) { + public static TaskRecyclerViewFragment newInstance(HabitItemRecyclerViewAdapter adapter, String classType) { return newInstance(adapter, classType, true); } - public static TaskRecyclerViewFragment newInstance(HabitItemRecyclerViewAdapter adapter, Class classType, boolean showFloatingButton) { + public static TaskRecyclerViewFragment newInstance(HabitItemRecyclerViewAdapter adapter, String classType, boolean showFloatingButton) { TaskRecyclerViewFragment fragment = new TaskRecyclerViewFragment(); fragment.SetInnerAdapter(adapter, classType,showFloatingButton); @@ -103,7 +103,7 @@ public class TaskRecyclerViewFragment extends Fragment implements View.OnClickLi @Override public void onClick(View v) { - AddTaskTappedEvent event = new AddTaskTappedEvent(); + AddNewTaskCommand event = new AddNewTaskCommand(); event.ClassType = this.classType; EventBus.getDefault().post(event); 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 17c90819a..1f1a49538 100644 --- a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/tasks/Task.java +++ b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/tasks/Task.java @@ -14,6 +14,7 @@ import com.raizlabs.android.dbflow.sql.language.Select; import com.raizlabs.android.dbflow.structure.BaseModel; import java.util.ArrayList; +import java.util.Date; import java.util.List; /** @@ -22,6 +23,10 @@ import java.util.List; @ModelContainer @Table(databaseName = HabitDatabase.NAME) public class Task extends BaseModel { + public static String TYPE_HABIT = "habit"; + public static String TYPE_TODO = "todo"; + public static String TYPE_DAILY = "daily"; + public static String TYPE_REWARD = "reward"; @Column @PrimaryKey @@ -37,6 +42,9 @@ public class Task extends BaseModel { public List tags; + @Column + public Date dateCreated; + //Habits @Column public Boolean up, down;