- add dateCreated to task

- refactored some code
- fixed #4 #5
This commit is contained in:
Negue 2015-09-28 22:37:43 +02:00
parent 1588f856a5
commit 40e606d377
12 changed files with 103 additions and 87 deletions

View file

@ -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());

View file

@ -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<List<ItemData>>, 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<Tag> tagList) {

View file

@ -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();
}
}

View file

@ -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<Task> {
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();
}
}

View file

@ -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<Task> {
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();
}
}

View file

@ -1,8 +0,0 @@
package com.habitrpg.android.habitica.events;
/**
* Created by Negue on 11.07.2015.
*/
public class AddTaskTappedEvent {
public Class<?> ClassType ;
}

View file

@ -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;
}
}

View file

@ -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;
}
}

View file

@ -0,0 +1,8 @@
package com.habitrpg.android.habitica.events.commands;
/**
* Created by Negue on 11.07.2015.
*/
public class AddNewTaskCommand {
public String ClassType ;
}

View file

@ -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<THabitItem extends Task>
implements FlowContentObserver.OnModelStateChangedListener {
int layoutResource;
private Class<ViewHolder<THabitItem>> viewHolderClass;
Class<THabitItem> taskClass;
private Class<ViewHolder<Task>> viewHolderClass;
Integer displayedChecklist = null;
String taskType;
private ObservableArrayList<THabitItem> filteredObservableContent;
private ObservableArrayList<THabitItem> observableContent;
private ObservableArrayList<Task> filteredObservableContent;
private ObservableArrayList<Task> observableContent;
FlowContentObserver observer;
Context context;
@ -64,22 +65,21 @@ public class HabitItemRecyclerViewAdapter<THabitItem extends Task>
private RecyclerView.Adapter<ViewHolder> parentAdapter;
public HabitItemRecyclerViewAdapter(String taskType, Class<THabitItem> newTaskClass, int layoutResource, Class<ViewHolder<THabitItem>> viewHolderClass, Context newContext) {
this(taskType, newTaskClass, layoutResource, viewHolderClass, newContext, null);
public HabitItemRecyclerViewAdapter(String taskType, int layoutResource, Class<ViewHolder<Task>> viewHolderClass, Context newContext) {
this(taskType, layoutResource, viewHolderClass, newContext, null);
}
public HabitItemRecyclerViewAdapter(String taskType, Class<THabitItem> newTaskClass, int layoutResource, Class<ViewHolder<THabitItem>> viewHolderClass,
Context newContext, final ObservableArrayList<THabitItem> content) {
public HabitItemRecyclerViewAdapter(String taskType, int layoutResource, Class<ViewHolder<Task>> viewHolderClass,
Context newContext, final ObservableArrayList<Task> 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<THabitItem extends Task>
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<THabitItem>();
filteredObservableContent = new ObservableArrayList<Task>();
for (THabitItem e : observableContent) {
for (Task e : observableContent) {
if (e.containsAllTagIds(cmd.tagList)) {
filteredObservableContent.add(e);
}
@ -150,6 +150,18 @@ public class HabitItemRecyclerViewAdapter<THabitItem extends Task>
}
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<HabitItemRecyclerViewAdapter.ViewHolder> parentAdapter) {
this.parentAdapter = parentAdapter;
}
@ -502,8 +514,9 @@ public class HabitItemRecyclerViewAdapter<THabitItem extends Task>
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());
}

View file

@ -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);

View file

@ -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<TaskTag> tags;
@Column
public Date dateCreated;
//Habits
@Column
public Boolean up, down;