From 92ef8c6e44bf7ed5a23b8874109d1eb20f3f8eb0 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Mon, 17 Aug 2015 17:37:43 +0200 Subject: [PATCH 1/7] Refactor models for checklists and tags --- Habitica/Habitica.iml | 63 +++--- Habitica/build.gradle | 5 +- Habitica/res/layout/daily_item_card.xml | 35 ++- Habitica/res/layout/reward_item_card.xml | 4 +- .../habitrpg/android/habitica/APIHelper.java | 17 +- .../android/habitica/MainActivity.java | 17 +- .../habitica/events/BuyRewardTappedEvent.java | 4 +- .../adapter/HabitItemRecyclerViewAdapter.java | 62 +----- .../lib/HabitRPGInteractor.java | 202 ------------------ .../habitrpgwrapper/lib/api/ApiService.java | 9 +- .../lib/models/HabitRPGUser.java | 9 +- .../habitrpgwrapper/lib/models/Tag.java | 3 + .../lib/models/tasks/ChecklistItem.java | 14 +- .../lib/models/tasks/Reward.java | 31 --- .../lib/models/tasks/RewardItem.java | 8 - .../lib/models/tasks/Task.java | 92 ++++++-- .../lib/models/tasks/TaskTag.java | 8 +- 17 files changed, 182 insertions(+), 401 deletions(-) delete mode 100644 Habitica/src/com/magicmicky/habitrpgwrapper/lib/HabitRPGInteractor.java delete mode 100644 Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/tasks/Reward.java delete mode 100644 Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/tasks/RewardItem.java diff --git a/Habitica/Habitica.iml b/Habitica/Habitica.iml index 91349e54a..241ab18b9 100644 --- a/Habitica/Habitica.iml +++ b/Habitica/Habitica.iml @@ -68,18 +68,18 @@ - - - - - - - + + + + + + + - + @@ -109,58 +109,63 @@ + + - - - + + - + + - + - + + + + + + - - - + - - - + - - + + + - + - - + + + + - + - + + - - \ No newline at end of file diff --git a/Habitica/build.gradle b/Habitica/build.gradle index 9cb6179bc..0d88e6aed 100644 --- a/Habitica/build.gradle +++ b/Habitica/build.gradle @@ -34,7 +34,10 @@ repositories { dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) - compile 'com.squareup.retrofit:retrofit:1.6.0' + compile 'io.reactivex:rxjava:1.0.10' + compile 'com.squareup.okhttp:okhttp-urlconnection:2.4.0' + compile 'com.squareup.okhttp:okhttp:2.4.0' + compile 'com.squareup.retrofit:retrofit:1.9.0' compile('com.crashlytics.sdk.android:crashlytics:2.3.0@aar') { transitive = true; diff --git a/Habitica/res/layout/daily_item_card.xml b/Habitica/res/layout/daily_item_card.xml index 9b54d9a01..feb814abd 100644 --- a/Habitica/res/layout/daily_item_card.xml +++ b/Habitica/res/layout/daily_item_card.xml @@ -11,22 +11,8 @@ - - - + android:layout_height="wrap_content" + android:background="@color/white"> - + + - - \ No newline at end of file diff --git a/Habitica/res/layout/reward_item_card.xml b/Habitica/res/layout/reward_item_card.xml index 5be1554ed..a7169808a 100644 --- a/Habitica/res/layout/reward_item_card.xml +++ b/Habitica/res/layout/reward_item_card.xml @@ -3,11 +3,11 @@ - + + type="Task" /> >() {}.getType(); + + + //Exclusion stratety needed for DBFlow https://github.com/Raizlabs/DBFlow/issues/121 Gson gson = new GsonBuilder() .setExclusionStrategies(new ExclusionStrategy() { @Override @@ -72,7 +79,7 @@ public class APIHelper implements ErrorHandler, Profiler { return false; } }) - .registerTypeAdapter(TagsAdapter.class, new TagsAdapter().nullSafe()) + .registerTypeAdapter(taskTagClassListType, new TagsAdapter()) .registerTypeAdapter(Boolean.class, booleanAsIntAdapter) .registerTypeAdapter(boolean.class, booleanAsIntAdapter) .create(); @@ -152,11 +159,7 @@ public class APIHelper implements ErrorHandler, Profiler { } public void updateTask(Task item, Callback cb) { - if(item instanceof Task) { this.apiService.updateTask(item.getId(), item, cb); - } else if(item instanceof Reward) { - this.apiService.updateTask(item.getId(), item, cb); - } } //public void buyItem(Reward.SpecialReward itemBought, View btn) { diff --git a/Habitica/src/com/habitrpg/android/habitica/MainActivity.java b/Habitica/src/com/habitrpg/android/habitica/MainActivity.java index a0f9968bb..d4945ee31 100644 --- a/Habitica/src/com/habitrpg/android/habitica/MainActivity.java +++ b/Habitica/src/com/habitrpg/android/habitica/MainActivity.java @@ -37,8 +37,6 @@ import com.magicmicky.habitrpgwrapper.lib.models.TaskDirection; import com.magicmicky.habitrpgwrapper.lib.models.TaskDirectionData; import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task; import com.magicmicky.habitrpgwrapper.lib.models.tasks.ItemData; -import com.magicmicky.habitrpgwrapper.lib.models.tasks.Reward; -import com.magicmicky.habitrpgwrapper.lib.models.tasks.RewardItem; import com.mikepenz.materialdrawer.Drawer; import com.mikepenz.materialdrawer.DrawerBuilder; import com.mikepenz.materialdrawer.model.DividerDrawerItem; @@ -279,7 +277,7 @@ public class MainActivity extends InstabugAppCompatActivity implements HabitRPGU } public void onEvent(TaskTappedEvent event) { - if(event.Task instanceof RewardItem) + if(event.Task.type.equals("reward")) return; Bundle bundle = new Bundle(); @@ -320,6 +318,9 @@ public class MainActivity extends InstabugAppCompatActivity implements HabitRPGU return; } + mAPIHelper.updateTaskDirection(rewardKey, TaskDirection.down, new TaskScoringCallback(this)); + + /* if (event.Reward instanceof RewardItem) { if (rewardKey.equals("potion")) { int currentHp = User.getStats().getHp().intValue(); @@ -356,8 +357,7 @@ public class MainActivity extends InstabugAppCompatActivity implements HabitRPGU }); } else { // User created Rewards - mAPIHelper.updateTaskDirection(rewardKey, TaskDirection.down, new TaskScoringCallback(this)); - } + }*/ } public void onEvent(final TaskSaveEvent event) { @@ -411,8 +411,6 @@ public class MainActivity extends InstabugAppCompatActivity implements HabitRPGU } - private ObservableArrayList GearRewards = new ObservableArrayList<>(); - public void loadTaskLists() { android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager(); @@ -440,7 +438,7 @@ public class MainActivity extends InstabugAppCompatActivity implements HabitRPGU break; case 3: layoutOfType = R.layout.reward_item_card; - fragment = TaskRecyclerViewFragment.newInstance(new HabitItemRecyclerViewAdapter("reward", Reward.class, layoutOfType, HabitItemRecyclerViewAdapter.RewardViewHolder.class, context), Reward.class); + fragment = TaskRecyclerViewFragment.newInstance(new HabitItemRecyclerViewAdapter("reward", Task.class, layoutOfType, HabitItemRecyclerViewAdapter.RewardViewHolder.class, context), Task.class); break; default: layoutOfType = R.layout.todo_item_card; @@ -577,7 +575,7 @@ public class MainActivity extends InstabugAppCompatActivity implements HabitRPGU keyCondition = keyCondition.and(item.key); } - +/* ConditionQueryBuilder queryBuilder = new ConditionQueryBuilder(ItemData.class, keyCondition); @@ -597,6 +595,7 @@ public class MainActivity extends InstabugAppCompatActivity implements HabitRPGU GearRewards.clear(); GearRewards.addAll(rewardList); + */ } @Override diff --git a/Habitica/src/com/habitrpg/android/habitica/events/BuyRewardTappedEvent.java b/Habitica/src/com/habitrpg/android/habitica/events/BuyRewardTappedEvent.java index 61f3d4630..0d1086552 100644 --- a/Habitica/src/com/habitrpg/android/habitica/events/BuyRewardTappedEvent.java +++ b/Habitica/src/com/habitrpg/android/habitica/events/BuyRewardTappedEvent.java @@ -1,10 +1,10 @@ package com.habitrpg.android.habitica.events; -import com.magicmicky.habitrpgwrapper.lib.models.tasks.Reward; +import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task; /** * Created by Negue on 11.07.2015. */ public class BuyRewardTappedEvent { - public Reward Reward; + public Task Reward; } 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 99a46064c..efcc8deeb 100644 --- a/Habitica/src/com/habitrpg/android/habitica/ui/adapter/HabitItemRecyclerViewAdapter.java +++ b/Habitica/src/com/habitrpg/android/habitica/ui/adapter/HabitItemRecyclerViewAdapter.java @@ -5,8 +5,6 @@ import android.databinding.BindingAdapter; import android.databinding.DataBindingUtil; import android.databinding.ObservableArrayList; import android.databinding.ObservableList; -import android.graphics.Bitmap; -import android.graphics.drawable.Drawable; import android.os.Handler; import android.support.v7.widget.CardView; import android.support.v7.widget.RecyclerView; @@ -32,15 +30,12 @@ import com.habitrpg.android.habitica.events.TaskTappedEvent; import com.habitrpg.android.habitica.events.TodoCheckedEvent; import com.habitrpg.android.habitica.ui.helpers.ViewHelper; import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task; -import com.magicmicky.habitrpgwrapper.lib.models.tasks.Reward; -import com.magicmicky.habitrpgwrapper.lib.models.tasks.RewardItem; import com.raizlabs.android.dbflow.runtime.FlowContentObserver; import com.raizlabs.android.dbflow.sql.builder.Condition; import com.raizlabs.android.dbflow.sql.language.Select; import com.raizlabs.android.dbflow.structure.BaseModel; import com.raizlabs.android.dbflow.structure.Model; import com.squareup.picasso.Picasso; -import com.squareup.picasso.Target; import java.util.List; @@ -174,8 +169,6 @@ public class HabitItemRecyclerViewAdapter return new HabitItemRecyclerViewAdapter.TodoViewHolder(view); case "RewardViewHolder": return new HabitItemRecyclerViewAdapter.RewardViewHolder(view); - case "RewardItemViewHolder": - return new HabitItemRecyclerViewAdapter.RewardItemViewHolder(view); } } } @@ -226,9 +219,6 @@ public class HabitItemRecyclerViewAdapter public abstract class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener { - @InjectView(R.id.card_view) - protected CardView cardView; - @InjectView(R.id.checkedTextView) protected CheckedTextView checkedTextView; @@ -376,7 +366,7 @@ public class HabitItemRecyclerViewAdapter } } - public class RewardViewHolder extends ViewHolder { + public class RewardViewHolder extends ViewHolder { RewardItemCardBinding binding; public RewardViewHolder(View itemView) { @@ -401,58 +391,14 @@ public class HabitItemRecyclerViewAdapter } @Override - public void bindHolder(Reward habitItem, int position) { - super.bindHolder(habitItem, position); + public void bindHolder(Task reward, int position) { + super.bindHolder(reward, position); - binding.setReward(habitItem); + binding.setReward(reward); } } - public class RewardItemViewHolder extends ViewHolder implements Target - { - RewardItemCardBinding binding; - public RewardItemViewHolder(View itemView) { - super(itemView); - - binding = DataBindingUtil.bind(itemView); - - binding.btnReward.setClickable(true); - binding.btnReward.setOnClickListener(this); - } - - @Override - public void onClick(View v) { - BuyRewardTappedEvent event = new BuyRewardTappedEvent(); - - if (v == binding.btnReward) { - event.Reward = Item; - - EventBus.getDefault().post(event); - } else super.onClick(v); - } - - @Override - public void bindHolder(RewardItem habitItem, int position) { - super.bindHolder(habitItem, position); - binding.setReward(habitItem); - } - - @Override - public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { - binding.imageView3.setImageBitmap(bitmap); - } - - @Override - public void onBitmapFailed(Drawable errorDrawable) { - - } - - @Override - public void onPrepareLoad(Drawable placeHolderDrawable) { - - } - } public void loadContent() { if(this.observableContent == null) { diff --git a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/HabitRPGInteractor.java b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/HabitRPGInteractor.java deleted file mode 100644 index f8038a981..000000000 --- a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/HabitRPGInteractor.java +++ /dev/null @@ -1,202 +0,0 @@ -package com.magicmicky.habitrpgwrapper.lib; - -import com.google.gson.ExclusionStrategy; -import com.google.gson.FieldAttributes; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.magicmicky.habitrpgwrapper.lib.api.ApiService; -import com.magicmicky.habitrpgwrapper.lib.api.Server; -import com.magicmicky.habitrpgwrapper.lib.api.TypeAdapter.TagsAdapter; -import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser; -import com.magicmicky.habitrpgwrapper.lib.models.Status; -import com.magicmicky.habitrpgwrapper.lib.models.Tag; -import com.magicmicky.habitrpgwrapper.lib.models.TaskDirection; -import com.magicmicky.habitrpgwrapper.lib.models.TaskDirectionData; -import com.magicmicky.habitrpgwrapper.lib.models.UserAuth; -import com.magicmicky.habitrpgwrapper.lib.models.UserAuthResponse; -import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task; -import com.magicmicky.habitrpgwrapper.lib.models.tasks.Reward; -import com.raizlabs.android.dbflow.structure.ModelAdapter; - -import java.util.List; - -import retrofit.Callback; -import retrofit.RequestInterceptor; -import retrofit.RestAdapter; -import retrofit.converter.GsonConverter; - -/** - * Created by MagicMicky on 13/06/2014. - */ -public class HabitRPGInteractor { - - private ApiService apiService; - public HabitRPGInteractor(final String apiKey, final String userKey, final Server server) { - RequestInterceptor requestInterceptor = new RequestInterceptor() { - @Override - public void intercept(RequestInterceptor.RequestFacade request) { - request.addHeader("x-api-key", apiKey); - request.addHeader("x-api-user",userKey); - } - }; - - //Exclusion stratety needed for DBFlow https://github.com/Raizlabs/DBFlow/issues/121 - Gson gson = new GsonBuilder() - .setExclusionStrategies(new ExclusionStrategy() { - @Override - public boolean shouldSkipField(FieldAttributes f) { - return f.getDeclaredClass().equals(ModelAdapter.class); - } - - @Override - public boolean shouldSkipClass(Class clazz) { - return false; - } - }).registerTypeAdapter(TagsAdapter.class, new TagsAdapter().nullSafe()).create(); - - RestAdapter adapter = new RestAdapter.Builder() - .setEndpoint(server.toString()) - .setRequestInterceptor(requestInterceptor) - .setConverter(new GsonConverter(gson)) - .build(); - this.apiService = adapter.create(ApiService.class); - } - public HabitRPGInteractor(final String apiKey, final String userKey) { - this(apiKey, userKey, Server.NORMAL); - } - /** - * Retrieve the Status of habitrpg - * @see com.magicmicky.habitrpgwrapper.lib.models.Status - * @param statusCallback the callback called when status is retrieved - */ - public void getStatus(Callback statusCallback) { - this.apiService.getStatus(statusCallback); - } - - /** - * Retrieve a User from HabitRPG's API. - * @see com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser - * @param callback The callback called when the user is retrieved - */ - public void getUser(Callback callback) { - this.apiService.getUser(callback); - } - - /** - * Retrieve a daily from HabitRPG's API - * @param dailyId the id of the daily to retrieve - * @param dailyCallback the callback called when the daily is retrieved - * @see Task - */ - public void getTask(String dailyId, Callback dailyCallback) { - this.apiService.getTask(dailyId, dailyCallback); - } - - - /** - * Retrieve a Reward form HabitRPG's API - * @param rewardId the id of the reward to retrieve - * @param rewardCallback the callback called when the reward is retrieved. - * @see com.magicmicky.habitrpgwrapper.lib.models.tasks.Reward - */ - public void getReward(String rewardId, Callback rewardCallback) { - this.apiService.getReward(rewardId, rewardCallback); - } - - /** - * Update the task to "up" or "down", and check or uncheck dailies/todos. - * @param taskId the id of the task to update - * @param direction the direction of the task - * @param taskDirectionCallback the callback called when the direction is set. - * @see com.magicmicky.habitrpgwrapper.lib.models.TaskDirectionData - */ - public void postTaskDirection(String taskId, TaskDirection direction, Callback taskDirectionCallback) { - this.apiService.postTaskDirection(taskId, direction.toString(), taskDirectionCallback); - } - - /** - * Create a daily on HabitRPG - * @param task the daily to create - * @param taskCallback the callback called when the daily is created - * @see Task - */ - public void createItem(Task task, Callback taskCallback) { - this.apiService.createItem(task, taskCallback); - } - - /** - * Creates a reward - * @param reward the reward to create - * @param rewardCallback the callback called once the item is created - */ - public void createItem(Reward reward, Callback rewardCallback) { - this.apiService.createItem(reward, rewardCallback); - } - - /** - * Update an habit - * @param taskId the id of the habit to update - * @param task the habit to update, with updated field - * @param taskCallback the callback called once the habit is updated - */ - public void updateItem(String taskId, Task task, Callback taskCallback) { - this.apiService.updateTask(taskId, task, taskCallback); - } - - /** - * Updates a Reward - * @param rewardId the id of the reward to update - * @param reward the reward to update, with updated field - * @param rewardCallback the callback called once the item is updated - */ - public void updateItem(String rewardId, Reward reward, Callback rewardCallback) { - this.apiService.updateTask(rewardId, reward, rewardCallback); - } - - /** - * Deletes a task. - * @param itemId the id of the task to delete - * @param voidCallback the callback (on void) called once the item is deleted - */ - public void deleteItem(String itemId, Callback voidCallback) { - this.apiService.deleteTask(itemId, voidCallback); - } - - /** - * Creates a tag - * @param tag The tag to create - * @param multiTagCallback the callback called once the tag is created - */ - public void createTag(Tag tag, Callback> multiTagCallback) { - this.apiService.createTag(tag, multiTagCallback); - } - - /** - * Updates a tag - * @param tagId The id of the tag to udpate - * @param tag The tag to update, with updated field - * @param tagCallback The callback called once the tag is updated - */ - public void updateTag(String tagId, Tag tag, Callback tagCallback) { - this.apiService.updateTag(tagId, tag, tagCallback); - } - - /** - * Deletes a tag - * @param tagId the id of the tag to delete - * @param voidCallback the callback (on void) called once the item is deleted - */ - public void deleteTag(String tagId, Callback voidCallback) { - this.apiService.deleteTag(tagId, voidCallback); - } - - /** - * Connects a user - * @param authData The username & password of the user - * @param responseCallback The callback called once the user is connected - */ - public void connectUser(UserAuth authData, Callback responseCallback) { - this.apiService.connectLocal(authData,responseCallback); - } - -} diff --git a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java index 6aa589813..92db00211 100644 --- a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java +++ b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java @@ -7,9 +7,8 @@ import com.magicmicky.habitrpgwrapper.lib.models.Tag; import com.magicmicky.habitrpgwrapper.lib.models.TaskDirectionData; import com.magicmicky.habitrpgwrapper.lib.models.UserAuth; import com.magicmicky.habitrpgwrapper.lib.models.UserAuthResponse; -import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task; import com.magicmicky.habitrpgwrapper.lib.models.tasks.ItemData; -import com.magicmicky.habitrpgwrapper.lib.models.tasks.Reward; +import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task; import java.util.List; @@ -45,8 +44,6 @@ public interface ApiService { // void revive(Callback habitRPGUserCallback); - @GET("/user/tasks/{id}") - void getReward(@Path("id") String id, Callback habitItemCallback); @GET("/user/tasks/{id}") void getTask(@Path("id") String id, Callback habitItemCallback); @@ -55,14 +52,10 @@ public interface ApiService { void postTaskDirection(@Path("id") String id, @Path("direction") String direction, Callback taskDirectionCallback); - @POST("/user/tasks") - void createItem(@Body Reward item, Callback habitItemCallback); @POST("/user/tasks") void createItem(@Body Task item, Callback habitItemCallback); - @PUT("/user/tasks/{id}") - void updateTask(@Path("id") String id, @Body Reward item, Callback habitItemCallback); @PUT("/user/tasks/{id}") void updateTask(@Path("id") String id, @Body Task item, Callback habitItemCallback); diff --git a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/HabitRPGUser.java b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/HabitRPGUser.java index 5419c6f69..09c272d50 100644 --- a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/HabitRPGUser.java +++ b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/HabitRPGUser.java @@ -2,7 +2,6 @@ package com.magicmicky.habitrpgwrapper.lib.models; import com.habitrpg.android.habitica.HabitDatabase; import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task; -import com.magicmicky.habitrpgwrapper.lib.models.tasks.Reward; import com.raizlabs.android.dbflow.annotation.Column; import com.raizlabs.android.dbflow.annotation.ForeignKey; import com.raizlabs.android.dbflow.annotation.ForeignKeyReference; @@ -29,7 +28,7 @@ public class HabitRPGUser extends BaseModel { List dailys; List todos; - List rewards; + List rewards; List habits; List tags; @@ -89,7 +88,7 @@ public class HabitRPGUser extends BaseModel { this.todos = todos; } - public void setRewards(List rewards) { + public void setRewards(List rewards) { this.rewards = rewards; } @@ -167,10 +166,10 @@ public class HabitRPGUser extends BaseModel { } @OneToMany(methods = {OneToMany.Method.SAVE, OneToMany.Method.DELETE}, variableName = "rewards") - public List getRewards() { + public List getRewards() { if(rewards == null) { rewards = new Select() - .from(Reward.class) + .from(Task.class) .queryList(); } return rewards; diff --git a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/Tag.java b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/Tag.java index bb98587e8..c34e6c8f0 100644 --- a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/Tag.java +++ b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/Tag.java @@ -3,6 +3,7 @@ package com.magicmicky.habitrpgwrapper.lib.models; import com.habitrpg.android.habitica.HabitDatabase; import com.magicmicky.habitrpgwrapper.lib.models.tasks.TaskTag; import com.raizlabs.android.dbflow.annotation.Column; +import com.raizlabs.android.dbflow.annotation.ModelContainer; import com.raizlabs.android.dbflow.annotation.OneToMany; import com.raizlabs.android.dbflow.annotation.PrimaryKey; import com.raizlabs.android.dbflow.annotation.Table; @@ -17,6 +18,7 @@ import java.util.List; * Created by MagicMicky on 16/03/14. */ +@ModelContainer @Table(databaseName = HabitDatabase.NAME) public class Tag extends BaseModel{ @@ -42,6 +44,7 @@ public class Tag extends BaseModel{ if(tasks == null) { tasks = new Select() .from(TaskTag.class) + .where(Condition.column("tag_id").eq(this.id)) .queryList(); } return tasks; diff --git a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/tasks/ChecklistItem.java b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/tasks/ChecklistItem.java index 1f1dccf77..f3762c21a 100644 --- a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/tasks/ChecklistItem.java +++ b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/tasks/ChecklistItem.java @@ -24,7 +24,7 @@ public class ChecklistItem extends BaseModel { @Column private boolean completed; -/* + @Column @ForeignKey( references = {@ForeignKeyReference(columnName = "task_id", @@ -32,7 +32,7 @@ public class ChecklistItem extends BaseModel { foreignColumnName = "id")}, saveForeignKeyModel = false) ForeignKeyContainer task; -*/ + public ChecklistItem() { this(null,null); } @@ -70,4 +70,14 @@ public class ChecklistItem extends BaseModel { public void setCompleted(boolean completed) { this.completed = completed; } + + public Task getTask() { + return task.toModel(); + } + + public void setTask(Task task) { + this.task = new ForeignKeyContainer<>(Task.class); + this.task.setModel(task); + this.task.put("id", task.id); + } } diff --git a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/tasks/Reward.java b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/tasks/Reward.java deleted file mode 100644 index 479b6e4c7..000000000 --- a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/tasks/Reward.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.magicmicky.habitrpgwrapper.lib.models.tasks; - - -import com.habitrpg.android.habitica.HabitDatabase; -import com.raizlabs.android.dbflow.annotation.Table; - -/** - * A reward. Contain a reward that you can see on the website - * @author MagicMicky - * - */ -@Table(databaseName = HabitDatabase.NAME, allFields = true) -public class Reward extends Task { - - public Reward() { - super(); - } - /** - * @return the id - */ - public String getId() { - return id; - } - /** - * @param id the id to set - */ - public void setId(String id) { - this.id = id; - } - -} diff --git a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/tasks/RewardItem.java b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/tasks/RewardItem.java deleted file mode 100644 index a3f030cf8..000000000 --- a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/tasks/RewardItem.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.magicmicky.habitrpgwrapper.lib.models.tasks; - -/** - * Created by Negue on 15.07.2015. - */ -public class RewardItem extends Reward { - -} 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 75553f21c..243914d51 100644 --- a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/tasks/Task.java +++ b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/tasks/Task.java @@ -5,9 +5,11 @@ import com.habitrpg.android.habitica.R; import com.raizlabs.android.dbflow.annotation.Column; import com.raizlabs.android.dbflow.annotation.ForeignKey; import com.raizlabs.android.dbflow.annotation.ForeignKeyReference; +import com.raizlabs.android.dbflow.annotation.ModelContainer; import com.raizlabs.android.dbflow.annotation.OneToMany; import com.raizlabs.android.dbflow.annotation.PrimaryKey; import com.raizlabs.android.dbflow.annotation.Table; +import com.raizlabs.android.dbflow.sql.builder.Condition; import com.raizlabs.android.dbflow.sql.language.Select; import com.raizlabs.android.dbflow.structure.BaseModel; @@ -16,6 +18,7 @@ import java.util.List; /** * Created by viirus on 10/08/15. */ +@ModelContainer @Table(databaseName = HabitDatabase.NAME) public class Task extends BaseModel { @@ -31,13 +34,21 @@ public class Task extends BaseModel { @Column public Double value; + public List tags; + //Habits @Column public Boolean up, down; + + //todos/dailies @Column public Boolean completed; + public List checklist; + + + //dailies @Column public String frequency; @@ -51,9 +62,12 @@ public class Task extends BaseModel { public Days repeat; //TODO: private String lastCompleted; + + //todos @Column public String date; + /** * @return the id */ @@ -132,6 +146,24 @@ public class Task extends BaseModel { public void setType(String type) {this.type = type;} + @OneToMany(methods = {OneToMany.Method.SAVE, OneToMany.Method.DELETE}, variableName = "tags") + public List getTags() { + if(tags == null) { + tags = new Select() + .from(TaskTag.class) + .where(Condition.column("task_id").eq(this.id)) + .queryList(); + } + return tags; + } + + public void setTags(List tags) { + for (TaskTag tag : tags) { + tag.setTask(this); + } + this.tags = tags; + } + /** * @return whether or not the habit can be "upped" */ @@ -171,6 +203,35 @@ public class Task extends BaseModel { this.completed = completed; } + + @OneToMany(methods = {OneToMany.Method.SAVE, OneToMany.Method.DELETE}, variableName = "checklist") + public List getChecklist() { + if(this.checklist == null) { + this.checklist = new Select() + .from(ChecklistItem.class) + .where(Condition.column("task_id").eq(this.id)) + .queryList(); + } + return this.checklist; + } + + public void setChecklist(List checklist) { + for (ChecklistItem checklistItem : checklist) { + checklistItem.setTask(this); + } + this.checklist = checklist; + } + + public Integer getCompletedChecklistCount() { + Integer count = 0; + for (ChecklistItem item : this.getChecklist()) { + if (item.getCompleted()) { + count++; + } + } + return count; + } + public String getFrequency() { return frequency; } public void setFrequency(String frequency) { this.frequency = frequency; } @@ -190,20 +251,7 @@ public class Task extends BaseModel { public void setRepeat(Days repeat) { this.repeat = repeat; } - /** - * Formated: - * SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); - * @return the lastCompleted - */ -/* public String getLastCompleted() { - return lastCompleted; - } - /** - * @param lastCompleted the lastCompleted to set - */ -/* public void setLastCompleted(String lastCompleted) { - this.lastCompleted = lastCompleted; - } + /** * @return the streak */ @@ -246,6 +294,22 @@ public class Task extends BaseModel { this.attribute = attribute; } + + @Override + public void save() { + if (this.tags != null) { + for (TaskTag tag : this.tags) { + tag.setTask(this); + } + } + if (this.checklist != null) { + for (ChecklistItem item : this.checklist) { + item.setTask(this); + } + } + super.save(); + } + public int getLightTaskColor() { if (this.value < -20) diff --git a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/tasks/TaskTag.java b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/tasks/TaskTag.java index b7b813331..055a0ec91 100644 --- a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/tasks/TaskTag.java +++ b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/tasks/TaskTag.java @@ -25,13 +25,15 @@ public class TaskTag extends BaseModel { @Column @ForeignKey(references = {@ForeignKeyReference(columnName = "tag_id", columnType = String.class, - foreignColumnName = "id")}) + foreignColumnName = "id")}, + saveForeignKeyModel = false) public ForeignKeyContainer tag; @Column @ForeignKey(references = {@ForeignKeyReference(columnName = "task_id", columnType = String.class, - foreignColumnName = "id")}) + foreignColumnName = "id")}, + saveForeignKeyModel = false) public ForeignKeyContainer task; public Tag getTag() { @@ -41,6 +43,7 @@ public class TaskTag extends BaseModel { public void setTag(Tag tag) { this.tag = new ForeignKeyContainer<>(Tag.class); this.tag.setModel(tag); + this.tag.put("id", tag.id); } public Task getTask() { @@ -50,6 +53,7 @@ public class TaskTag extends BaseModel { public void setTask(Task task) { this.task = new ForeignKeyContainer<>(Task.class); this.task.setModel(task); + this.task.put("id", task.id); } } From 0a3a693f91d389e72358255c66a99d91a2ffb8c6 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Mon, 17 Aug 2015 22:06:29 +0200 Subject: [PATCH 2/7] redesign daily list --- Habitica/res/layout/daily_item_card.xml | 102 +++++++++++++----- .../adapter/HabitItemRecyclerViewAdapter.java | 8 +- 2 files changed, 78 insertions(+), 32 deletions(-) diff --git a/Habitica/res/layout/daily_item_card.xml b/Habitica/res/layout/daily_item_card.xml index feb814abd..86639f3dc 100644 --- a/Habitica/res/layout/daily_item_card.xml +++ b/Habitica/res/layout/daily_item_card.xml @@ -3,61 +3,105 @@ + - - + + - - - + android:checked="@{daily.completed}" + app:backgroundColor="@{daily.getLightTaskColor}" + android:gravity="center" + android:layout_gravity="center_horizontal" /> + - + - + android:text="@{daily.notes}" + android:visibility="@{daily.notes != null ? View.VISIBLE : View.GONE}"/> - + app:backgroundColor="@{daily.getLightTaskColor}" + android:visibility="@{daily.checklist.size > 0 ? View.VISIBLE : View.GONE}" + android:gravity="center" + android:layout_alignParentTop="true" + android:layout_alignParentBottom="true" + android:layout_alignParentRight="true" + android:layout_alignParentEnd="true"> + + + + - - + android:gravity="center" + android:layout_alignParentTop="true" + android:layout_alignParentRight="true" + android:layout_alignParentEnd="true" /> + + + + + \ No newline at end of file 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 efcc8deeb..8732ce30b 100644 --- a/Habitica/src/com/habitrpg/android/habitica/ui/adapter/HabitItemRecyclerViewAdapter.java +++ b/Habitica/src/com/habitrpg/android/habitica/ui/adapter/HabitItemRecyclerViewAdapter.java @@ -217,10 +217,12 @@ public class HabitItemRecyclerViewAdapter ViewHelper.SetBackgroundTint(view, view.getResources().getColor(color)); } - public abstract class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener { + @BindingAdapter("app:backgroundColor") + public static void setBackgroundTintColor(View view, int color) { + view.setBackgroundColor(view.getResources().getColor(color)); + } - @InjectView(R.id.checkedTextView) - protected CheckedTextView checkedTextView; + public abstract class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener { protected android.content.res.Resources resources; From 257bbaef4fba8a6835b74e8c7128fb2ca13c3a7b Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Mon, 17 Aug 2015 22:06:36 +0200 Subject: [PATCH 3/7] add new color scheme --- Habitica/res/values/colors.xml | 38 ++++++++++------ .../lib/models/tasks/Task.java | 45 ++++++++++++++----- 2 files changed, 57 insertions(+), 26 deletions(-) diff --git a/Habitica/res/values/colors.xml b/Habitica/res/values/colors.xml index 8074824a8..6fcdc631b 100644 --- a/Habitica/res/values/colors.xml +++ b/Habitica/res/values/colors.xml @@ -12,25 +12,33 @@ #7a12f8 - #E6B8AF - #c96652 - #F4CCCC - #dc5d5d + #E6B8AF + #c96652 + #c96652 - #FCE5CD - #f4a24c + #FF6165 + #F74E52 + #F23035 - #FFF2CC - #ffcf42 + #FF944C + #FA8537 + #F47825 - #D9EAD3 - #8bbf79 + #FFBE5D + #FFB445 + #FFA624 - #D0E0E3 - #7eaab2 + #D9EAD3 + #8bbf79 + #8bbf79 - #C9DAF8 - #5288e9 + #5AE4B2 + #3FDAA2 + #23CC8F + + #50B5E9 + #46A7D9 + #2995CD #D9D9D9 #989898 @@ -75,4 +83,6 @@ #FFF #ffd8dcdd + + #c3c2c6 \ No newline at end of file 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 243914d51..7a92f3138 100644 --- a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/tasks/Task.java +++ b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/tasks/Task.java @@ -313,16 +313,37 @@ public class Task extends BaseModel { public int getLightTaskColor() { if (this.value < -20) - return R.color.worst; + return R.color.worst_100; if (this.value < -10) - return R.color.worse; + return R.color.worse_100; if (this.value < -1) - return R.color.bad; + return R.color.bad_100; if (this.value < 5) - return R.color.neutral; + return R.color.neutral_100; if (this.value < 10) - return R.color.better; - return R.color.best; + return R.color.better_100; + return R.color.best_100; + } + + /** + * Get the button color resources depending on a certain score + * + * @return the color resource id + */ + public int getMediumTaskColor() + { + if (this.value < -20) + return R.color.worst_50; + if (this.value < -10) + return R.color.worse_50; + if (this.value < -1) + return R.color.bad_50; + if (this.value < 5) + return R.color.neutral_50; + if (this.value < 10) + return R.color.better_50; + + return R.color.best_50; } /** @@ -333,16 +354,16 @@ public class Task extends BaseModel { public int getDarkTaskColor() { if (this.value < -20) - return R.color.worst_btn; + return R.color.worst_10; if (this.value < -10) - return R.color.worse_btn; + return R.color.worse_10; if (this.value < -1) - return R.color.bad_btn; + return R.color.bad_10; if (this.value < 5) - return R.color.neutral_btn; + return R.color.neutral_10; if (this.value < 10) - return R.color.better_btn; + return R.color.better_10; - return R.color.best_btn; + return R.color.best_10; } } From efadeeecb6286a8da8f5ea819f1e7e8a6ee32760 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Mon, 17 Aug 2015 22:32:21 +0200 Subject: [PATCH 4/7] redesign habit and todo list --- Habitica/res/layout/daily_item_card.xml | 10 +-- Habitica/res/layout/habit_item_card.xml | 102 +++++++++++------------- Habitica/res/layout/todo_item_card.xml | 99 +++++++++++++++-------- Habitica/res/values/dimens.xml | 6 ++ 4 files changed, 124 insertions(+), 93 deletions(-) diff --git a/Habitica/res/layout/daily_item_card.xml b/Habitica/res/layout/daily_item_card.xml index 86639f3dc..f36eb4343 100644 --- a/Habitica/res/layout/daily_item_card.xml +++ b/Habitica/res/layout/daily_item_card.xml @@ -20,7 +20,7 @@ android:layout_height="match_parent"> \ No newline at end of file diff --git a/Habitica/res/layout/habit_item_card.xml b/Habitica/res/layout/habit_item_card.xml index e06c83932..9e3b62c91 100644 --- a/Habitica/res/layout/habit_item_card.xml +++ b/Habitica/res/layout/habit_item_card.xml @@ -11,59 +11,42 @@ type="Task" /> - - - + - + android:layout_height="match_parent"> + +