mirror of
https://github.com/sudoxnym/habitica-android.git
synced 2026-05-22 05:38:55 +00:00
parent
1588f856a5
commit
40e606d377
12 changed files with 103 additions and 87 deletions
|
|
@ -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());
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,8 +0,0 @@
|
|||
package com.habitrpg.android.habitica.events;
|
||||
|
||||
/**
|
||||
* Created by Negue on 11.07.2015.
|
||||
*/
|
||||
public class AddTaskTappedEvent {
|
||||
public Class<?> ClassType ;
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
package com.habitrpg.android.habitica.events.commands;
|
||||
|
||||
/**
|
||||
* Created by Negue on 11.07.2015.
|
||||
*/
|
||||
public class AddNewTaskCommand {
|
||||
public String ClassType ;
|
||||
}
|
||||
|
|
@ -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());
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in a new issue