diff --git a/Habitica/assets/migrations/Habitica/16.sql b/Habitica/assets/migrations/Habitica/16.sql
new file mode 100644
index 000000000..dba2e770a
--- /dev/null
+++ b/Habitica/assets/migrations/Habitica/16.sql
@@ -0,0 +1 @@
+ALTER TABLE QuestContent ADD COLUMN 'owned' INTEGER DEFAULT 0;
\ No newline at end of file
diff --git a/Habitica/build.gradle b/Habitica/build.gradle
index 9cb3a8f93..7dbb5ce5c 100644
--- a/Habitica/build.gradle
+++ b/Habitica/build.gradle
@@ -52,7 +52,6 @@ dependencies {
compile('com.mikepenz:materialdrawer:5.0.9@aar') {
transitive = true
}
- compile 'com.mikepenz:google-material-typeface:2.2.0.1.original@aar'
compile 'com.android.support:appcompat-v7:23.2.1'
compile 'com.android.support:design:23.2.1'
diff --git a/Habitica/res/layout/animal_overview_item.xml b/Habitica/res/layout/animal_overview_item.xml
new file mode 100644
index 000000000..47a35b166
--- /dev/null
+++ b/Habitica/res/layout/animal_overview_item.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Habitica/res/layout/fragment_group_info.xml b/Habitica/res/layout/fragment_group_info.xml
index a041aabd0..dc88f0816 100644
--- a/Habitica/res/layout/fragment_group_info.xml
+++ b/Habitica/res/layout/fragment_group_info.xml
@@ -5,7 +5,7 @@
-
+
diff --git a/Habitica/res/layout/gear_list_item.xml b/Habitica/res/layout/gear_list_item.xml
index 2cfe510e0..a39500c7c 100644
--- a/Habitica/res/layout/gear_list_item.xml
+++ b/Habitica/res/layout/gear_list_item.xml
@@ -2,7 +2,7 @@
-
+
+
+
+
+
+
+
-
\ No newline at end of file
+
+
+
+
\ No newline at end of file
diff --git a/Habitica/res/layout/menu_bottom_sheet.xml b/Habitica/res/layout/menu_bottom_sheet.xml
new file mode 100644
index 000000000..3509b8411
--- /dev/null
+++ b/Habitica/res/layout/menu_bottom_sheet.xml
@@ -0,0 +1,6 @@
+
+
+
+
\ No newline at end of file
diff --git a/Habitica/res/layout/menu_bottom_sheet_item.xml b/Habitica/res/layout/menu_bottom_sheet_item.xml
new file mode 100644
index 000000000..a751f76bb
--- /dev/null
+++ b/Habitica/res/layout/menu_bottom_sheet_item.xml
@@ -0,0 +1,10 @@
+
+
+
+
\ No newline at end of file
diff --git a/Habitica/res/values/dimens.xml b/Habitica/res/values/dimens.xml
index 398284566..c5f964bed 100644
--- a/Habitica/res/values/dimens.xml
+++ b/Habitica/res/values/dimens.xml
@@ -66,4 +66,5 @@
2dp
12sp
4dp
+ 120dp
\ No newline at end of file
diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml
index 0d324f4a6..23e1c4c9a 100644
--- a/Habitica/res/values/strings.xml
+++ b/Habitica/res/values/strings.xml
@@ -277,6 +277,8 @@ To start, which parts of your life do you want to improve?
Hatching Potions
Food
Quests
+ Pets
+ Mounts
You found a piece of rare Equipment in the Armoire: %s! Awesome!
You rummage in the Armoire and find %s %s. What\'s that doing in here?
diff --git a/Habitica/res/values/styles.xml b/Habitica/res/values/styles.xml
index dd5383d85..388fe0de6 100644
--- a/Habitica/res/values/styles.xml
+++ b/Habitica/res/values/styles.xml
@@ -85,7 +85,7 @@
- @dimen/card_margin
-
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/APIHelper.java b/Habitica/src/main/java/com/habitrpg/android/habitica/APIHelper.java
index 9c0d954d8..510697ec5 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/APIHelper.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/APIHelper.java
@@ -23,30 +23,44 @@ import com.magicmicky.habitrpgwrapper.lib.api.ApiService;
import com.magicmicky.habitrpgwrapper.lib.api.InAppPurchasesApiService;
import com.magicmicky.habitrpgwrapper.lib.api.Server;
import com.magicmicky.habitrpgwrapper.lib.api.TypeAdapter.TagsAdapter;
+import com.magicmicky.habitrpgwrapper.lib.models.ContentResult;
import com.magicmicky.habitrpgwrapper.lib.models.Customization;
import com.magicmicky.habitrpgwrapper.lib.models.FAQArticle;
import com.magicmicky.habitrpgwrapper.lib.models.Group;
import com.magicmicky.habitrpgwrapper.lib.models.PurchaseValidationRequest;
import com.magicmicky.habitrpgwrapper.lib.models.PurchaseValidationResult;
import com.magicmicky.habitrpgwrapper.lib.models.Purchases;
-import com.magicmicky.habitrpgwrapper.lib.models.SkillList;
+import com.magicmicky.habitrpgwrapper.lib.models.Skill;
import com.magicmicky.habitrpgwrapper.lib.models.TaskDirection;
import com.magicmicky.habitrpgwrapper.lib.models.TutorialStep;
import com.magicmicky.habitrpgwrapper.lib.models.UserAuth;
import com.magicmicky.habitrpgwrapper.lib.models.UserAuthResponse;
import com.magicmicky.habitrpgwrapper.lib.models.UserAuthSocial;
import com.magicmicky.habitrpgwrapper.lib.models.UserAuthSocialTokens;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.Egg;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.Food;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.HatchingPotion;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.Mount;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.Pet;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.QuestContent;
import com.magicmicky.habitrpgwrapper.lib.models.tasks.ChecklistItem;
import com.magicmicky.habitrpgwrapper.lib.models.tasks.ItemData;
import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task;
import com.magicmicky.habitrpgwrapper.lib.models.tasks.TaskTag;
import com.magicmicky.habitrpgwrapper.lib.utils.ChecklistItemSerializer;
+import com.magicmicky.habitrpgwrapper.lib.utils.ContentDeserializer;
import com.magicmicky.habitrpgwrapper.lib.utils.CustomizationDeserializer;
import com.magicmicky.habitrpgwrapper.lib.utils.DateDeserializer;
+import com.magicmicky.habitrpgwrapper.lib.utils.EggListDeserializer;
import com.magicmicky.habitrpgwrapper.lib.utils.FAQArticleListDeserilializer;
+import com.magicmicky.habitrpgwrapper.lib.utils.FoodListDeserializer;
import com.magicmicky.habitrpgwrapper.lib.utils.GroupSerialization;
+import com.magicmicky.habitrpgwrapper.lib.utils.HatchingPotionListDeserializer;
import com.magicmicky.habitrpgwrapper.lib.utils.ItemDataListDeserializer;
+import com.magicmicky.habitrpgwrapper.lib.utils.MountListDeserializer;
+import com.magicmicky.habitrpgwrapper.lib.utils.PetListDeserializer;
import com.magicmicky.habitrpgwrapper.lib.utils.PurchasedDeserializer;
+import com.magicmicky.habitrpgwrapper.lib.utils.QuestListDeserializer;
import com.magicmicky.habitrpgwrapper.lib.utils.SkillDeserializer;
import com.magicmicky.habitrpgwrapper.lib.utils.TaskListDeserializer;
import com.magicmicky.habitrpgwrapper.lib.utils.TaskSerializer;
@@ -97,11 +111,18 @@ public class APIHelper implements ErrorHandler, Profiler {
Type taskClassListType = new TypeToken>() {}.getType();
+ Type skillListType = new TypeToken>() {}.getType();
Type checklistType = new TypeToken>() {}.getType();
Type customizationListType = new TypeToken>() {}.getType();
Type tutorialStepListType = new TypeToken>() {}.getType();
Type faqArticleListType = new TypeToken>() {}.getType();
Type itemDataListType = new TypeToken>() {}.getType();
+ Type eggListType = new TypeToken>() {}.getType();
+ Type foodListType = new TypeToken>() {}.getType();
+ Type hatchingPotionListType = new TypeToken>() {}.getType();
+ Type questContentListType = new TypeToken>() {}.getType();
+ Type petListType = new TypeToken>() {}.getType();
+ Type mountListType = new TypeToken>() {}.getType();
//Exclusion stratety needed for DBFlow https://github.com/Raizlabs/DBFlow/issues/121
Gson gson = new GsonBuilder()
@@ -120,7 +141,7 @@ public class APIHelper implements ErrorHandler, Profiler {
.registerTypeAdapter(taskTagClassListType, new TagsAdapter())
.registerTypeAdapter(Boolean.class, booleanAsIntAdapter)
.registerTypeAdapter(boolean.class, booleanAsIntAdapter)
- .registerTypeAdapter(SkillList.class, new SkillDeserializer())
+ .registerTypeAdapter(skillListType, new SkillDeserializer())
.registerTypeAdapter(ChecklistItem.class, new ChecklistItemSerializer())
.registerTypeAdapter(taskClassListType, new TaskListDeserializer())
.registerTypeAdapter(Purchases.class, new PurchasedDeserializer())
@@ -130,7 +151,14 @@ public class APIHelper implements ErrorHandler, Profiler {
.registerTypeAdapter(Group.class, new GroupSerialization())
.registerTypeAdapter(Date.class, new DateDeserializer())
.registerTypeAdapter(itemDataListType, new ItemDataListDeserializer())
+ .registerTypeAdapter(eggListType, new EggListDeserializer())
+ .registerTypeAdapter(foodListType, new FoodListDeserializer())
+ .registerTypeAdapter(hatchingPotionListType, new HatchingPotionListDeserializer())
+ .registerTypeAdapter(questContentListType, new QuestListDeserializer())
+ .registerTypeAdapter(petListType, new PetListDeserializer())
+ .registerTypeAdapter(mountListType, new MountListDeserializer())
.registerTypeAdapter(Task.class, new TaskSerializer())
+ .registerTypeAdapter(ContentResult.class, new ContentDeserializer())
.setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
.create();
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ContentCache.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ContentCache.java
index f9b51f081..61c2e8a97 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ContentCache.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ContentCache.java
@@ -3,7 +3,7 @@ package com.habitrpg.android.habitica;
import com.magicmicky.habitrpgwrapper.lib.api.ApiService;
import com.magicmicky.habitrpgwrapper.lib.models.ContentResult;
import com.magicmicky.habitrpgwrapper.lib.models.QuestBoss;
-import com.magicmicky.habitrpgwrapper.lib.models.QuestContent;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.QuestContent;
import com.magicmicky.habitrpgwrapper.lib.models.tasks.ItemData;
import com.raizlabs.android.dbflow.sql.builder.Condition;
import com.raizlabs.android.dbflow.sql.language.Select;
@@ -88,10 +88,10 @@ public class ContentCache {
public void success(ContentResult contentResult, Response response) {
switch (typeOfSearch) {
case "quest": {
- Collection questList = contentResult.quests.values();
+ Collection questList = contentResult.quests;
for (QuestContent quest : questList) {
- if (quest.key == searchKey) {
+ if (quest.getKey() == searchKey) {
gotEntry.GotObject((T) quest);
}
}
@@ -170,13 +170,13 @@ public class ContentCache {
private void saveContentResultToDb(ContentResult contentResult) {
- Collection questList = contentResult.quests.values();
+ Collection questList = contentResult.quests;
for (QuestContent quest : questList) {
quest.save();
if (quest.boss != null) {
- quest.boss.key = quest.key;
+ quest.boss.key = quest.getKey();
quest.boss.async().save();
}
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/HabitDatabase.java b/Habitica/src/main/java/com/habitrpg/android/habitica/HabitDatabase.java
index 30d428913..47ae24f02 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/HabitDatabase.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/HabitDatabase.java
@@ -10,5 +10,5 @@ public class HabitDatabase {
public static final String NAME = "Habitica";
- public static final int VERSION = 15;
+ public static final int VERSION = 17;
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/MainDrawerBuilder.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/MainDrawerBuilder.java
index cefd3dee6..793d5e7f1 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/MainDrawerBuilder.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/MainDrawerBuilder.java
@@ -11,10 +11,10 @@ import com.habitrpg.android.habitica.ui.activities.MainActivity;
import com.habitrpg.android.habitica.ui.activities.PrefsActivity;
import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment;
import com.habitrpg.android.habitica.ui.fragments.GemsPurchaseFragment;
-import com.habitrpg.android.habitica.ui.fragments.ItemsFragment;
+import com.habitrpg.android.habitica.ui.fragments.inventory.items.ItemsFragment;
import com.habitrpg.android.habitica.ui.fragments.NewsFragment;
import com.habitrpg.android.habitica.ui.fragments.SkillsFragment;
-import com.habitrpg.android.habitica.ui.fragments.StableFragment;
+import com.habitrpg.android.habitica.ui.fragments.inventory.StableFragment;
import com.habitrpg.android.habitica.ui.fragments.faq.FAQOverviewFragment;
import com.habitrpg.android.habitica.ui.fragments.inventory.customization.AvatarOverviewFragment;
import com.habitrpg.android.habitica.ui.fragments.inventory.equipment.EquipmentOverviewFragment;
@@ -22,15 +22,12 @@ import com.habitrpg.android.habitica.ui.fragments.social.GuildsOverviewFragment;
import com.habitrpg.android.habitica.ui.fragments.social.TavernFragment;
import com.habitrpg.android.habitica.ui.fragments.social.party.PartyFragment;
import com.habitrpg.android.habitica.ui.fragments.tasks.TasksFragment;
-import com.mikepenz.google_material_typeface_library.GoogleMaterial;
import com.mikepenz.materialdrawer.AccountHeader;
import com.mikepenz.materialdrawer.AccountHeaderBuilder;
import com.mikepenz.materialdrawer.Drawer;
import com.mikepenz.materialdrawer.DrawerBuilder;
-import com.mikepenz.materialdrawer.model.DividerDrawerItem;
import com.mikepenz.materialdrawer.model.PrimaryDrawerItem;
import com.mikepenz.materialdrawer.model.ProfileDrawerItem;
-import com.mikepenz.materialdrawer.model.SectionDrawerItem;
import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem;
import com.mikepenz.materialdrawer.model.interfaces.IProfile;
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/ItemRecyclerAdapter.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/ItemRecyclerAdapter.java
new file mode 100644
index 000000000..41e7c4496
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/ItemRecyclerAdapter.java
@@ -0,0 +1,113 @@
+package com.habitrpg.android.habitica.ui.adapter.inventory;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.databinding.DataBindingUtil;
+import android.support.design.widget.BottomSheetDialog;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.habitrpg.android.habitica.R;
+import com.habitrpg.android.habitica.databinding.ItemImageRowBinding;
+import com.habitrpg.android.habitica.databinding.ItemItemBinding;
+import com.habitrpg.android.habitica.events.commands.UseSkillCommand;
+import com.magicmicky.habitrpgwrapper.lib.models.Group;
+import com.magicmicky.habitrpgwrapper.lib.models.Quest;
+import com.magicmicky.habitrpgwrapper.lib.models.Skill;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.Egg;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.Food;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.HatchingPotion;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.Item;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.QuestContent;
+
+import org.greenrobot.eventbus.EventBus;
+import org.w3c.dom.Text;
+
+import java.util.List;
+
+import butterknife.Bind;
+import butterknife.ButterKnife;
+
+public class ItemRecyclerAdapter extends RecyclerView.Adapter {
+
+ private List- itemList;
+
+ public Double mana;
+
+ public Context context;
+
+ public void setItemList(List
- itemList) {
+ this.itemList = itemList;
+ this.notifyDataSetChanged();
+ }
+
+ public void setMana(Double mana) {
+ this.mana = mana;
+ this.notifyDataSetChanged();
+ }
+
+
+ @Override
+ public ItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+
+ View view = LayoutInflater.from(parent.getContext())
+ .inflate(R.layout.item_item, parent, false);
+
+ return new ItemViewHolder(view);
+ }
+
+ @Override
+ public void onBindViewHolder(ItemViewHolder holder, int position) {
+ holder.bind(this.itemList.get(position));
+ }
+
+ @Override
+ public int getItemCount() {
+ return itemList == null ? 0 : itemList.size();
+ }
+
+ class ItemViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
+ Item item;
+
+ Resources resources;
+ ItemItemBinding binding;
+
+ public ItemViewHolder(View itemView) {
+ super(itemView);
+
+ resources = itemView.getResources();
+
+ binding = DataBindingUtil.bind(itemView);
+
+ itemView.setOnClickListener(this);
+ }
+
+ public void bind(Item item) {
+ binding.setTitle(item.getText());
+ if (item instanceof QuestContent) {
+ binding.setImageNamed("inventory_quest_scroll_"+item.getKey());
+ } else {
+ String type = "";
+ if (item instanceof Egg) {
+ type = "Egg";
+ } else if (item instanceof Food) {
+ type = "Food";
+ } else if (item instanceof HatchingPotion) {
+ type = "HatchingPotion";
+ }
+ binding.setImageNamed("Pet_"+type+"_"+item.getKey());
+ }
+ binding.setValue(item.getOwned().toString());
+ }
+
+ @Override
+ public void onClick(View v) {
+
+ }
+ }
+}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/MountDetailRecyclerAdapter.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/MountDetailRecyclerAdapter.java
new file mode 100644
index 000000000..7b9e95fe0
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/MountDetailRecyclerAdapter.java
@@ -0,0 +1,110 @@
+package com.habitrpg.android.habitica.ui.adapter.inventory;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.support.v7.widget.CardView;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.habitrpg.android.habitica.R;
+import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.Mount;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.Pet;
+
+import java.util.HashMap;
+import java.util.List;
+
+import butterknife.Bind;
+import butterknife.ButterKnife;
+
+public class MountDetailRecyclerAdapter extends RecyclerView.Adapter {
+
+ private List itemList;
+ private HashMap ownedMapping;
+ public String itemType;
+
+ public Context context;
+
+ public void setItemList(List itemList) {
+ this.itemList = itemList;
+ this.notifyDataSetChanged();
+ }
+
+ public void setOwnedMapping(HashMap map) {
+ this.ownedMapping = map;
+ this.notifyDataSetChanged();
+ }
+
+ @Override
+ public MountViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+
+ View view = LayoutInflater.from(parent.getContext())
+ .inflate(R.layout.animal_overview_item, parent, false);
+
+ return new MountViewHolder(view);
+ }
+
+ @Override
+ public void onBindViewHolder(MountViewHolder holder, int position) {
+ holder.bind(this.itemList.get(position));
+ }
+
+ @Override
+ public int getItemCount() {
+ return itemList == null ? 0 : itemList.size();
+ }
+
+ class MountViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
+ Mount animal;
+
+ @Bind(R.id.card_view)
+ CardView cardView;
+
+ @Bind(R.id.imageView)
+ ImageView imageView;
+
+ @Bind(R.id.titleTextView)
+ TextView titleView;
+
+ @Bind(R.id.ownedTextView)
+ TextView ownedTextView;
+
+ Resources resources;
+
+ public MountViewHolder(View itemView) {
+ super(itemView);
+ ButterKnife.bind(this, itemView);
+
+ resources = itemView.getResources();
+
+ itemView.setOnClickListener(this);
+ }
+
+ public void bind(Mount item) {
+ titleView.setText(item.getColor());
+ ownedTextView.setVisibility(View.GONE);
+ this.imageView.setAlpha(1.0f);
+ if (ownedMapping != null) {
+ if (ownedMapping.containsKey(item.getKey()) && ownedMapping.get(item.getKey())) {
+ DataBindingUtils.loadImage(this.imageView, "Mount_Icon_" + itemType + "-" + item.getColor());
+ } else {
+ ownedTextView.setText(null);
+ DataBindingUtils.loadImage(this.imageView, "PixelPaw");
+ this.imageView.setAlpha(0.4f);
+ }
+ } else {
+ DataBindingUtils.loadImage(this.imageView, "PixelPaw");
+ this.imageView.setAlpha(0.4f);
+ }
+ }
+
+ @Override
+ public void onClick(View v) {
+
+ }
+ }
+}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/PetDetailRecyclerAdapter.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/PetDetailRecyclerAdapter.java
new file mode 100644
index 000000000..18b41452e
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/PetDetailRecyclerAdapter.java
@@ -0,0 +1,113 @@
+package com.habitrpg.android.habitica.ui.adapter.inventory;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.support.v7.widget.CardView;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.habitrpg.android.habitica.R;
+import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.Animal;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.Pet;
+
+import java.util.HashMap;
+import java.util.List;
+
+import butterknife.Bind;
+import butterknife.ButterKnife;
+
+public class PetDetailRecyclerAdapter extends RecyclerView.Adapter {
+
+ private List itemList;
+ private HashMap ownedMapping;
+ public String itemType;
+
+ public Context context;
+
+ public void setItemList(List itemList) {
+ this.itemList = itemList;
+ this.notifyDataSetChanged();
+ }
+
+ public void setOwnedMapping(HashMap map) {
+ this.ownedMapping = map;
+ this.notifyDataSetChanged();
+ }
+
+ @Override
+ public PetViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+
+ View view = LayoutInflater.from(parent.getContext())
+ .inflate(R.layout.animal_overview_item, parent, false);
+
+ return new PetViewHolder(view);
+ }
+
+ @Override
+ public void onBindViewHolder(PetViewHolder holder, int position) {
+ holder.bind(this.itemList.get(position));
+ }
+
+ @Override
+ public int getItemCount() {
+ return itemList == null ? 0 : itemList.size();
+ }
+
+ class PetViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
+ Pet animal;
+
+ @Bind(R.id.card_view)
+ CardView cardView;
+
+ @Bind(R.id.imageView)
+ ImageView imageView;
+
+ @Bind(R.id.titleTextView)
+ TextView titleView;
+
+ @Bind(R.id.ownedTextView)
+ TextView ownedTextView;
+
+ Resources resources;
+
+ public PetViewHolder(View itemView) {
+ super(itemView);
+ ButterKnife.bind(this, itemView);
+
+ resources = itemView.getResources();
+
+ itemView.setOnClickListener(this);
+ }
+
+ public void bind(Pet item) {
+ titleView.setText(item.getColor());
+ ownedTextView.setVisibility(View.VISIBLE);
+ this.imageView.setAlpha(1.0f);
+ if (ownedMapping != null) {
+ if (ownedMapping.containsKey(item.getKey()) && ownedMapping.get(item.getKey()) > 0) {
+ this.ownedTextView.setText(ownedMapping.get(item.getKey()).toString());
+ DataBindingUtils.loadImage(this.imageView, "Pet-" + itemType + "-" + item.getColor());
+ } else {
+ ownedTextView.setVisibility(View.GONE);
+ ownedTextView.setText(null);
+ DataBindingUtils.loadImage(this.imageView, "PixelPaw");
+ this.imageView.setAlpha(0.4f);
+ }
+ } else {
+ ownedTextView.setVisibility(View.GONE);
+ DataBindingUtils.loadImage(this.imageView, "PixelPaw");
+ this.imageView.setAlpha(0.4f);
+ }
+ }
+
+ @Override
+ public void onClick(View v) {
+
+ }
+ }
+}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/StableRecyclerAdapter.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/StableRecyclerAdapter.java
new file mode 100644
index 000000000..aeb7f636f
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/StableRecyclerAdapter.java
@@ -0,0 +1,133 @@
+package com.habitrpg.android.habitica.ui.adapter.inventory;
+
+import android.content.res.Resources;
+import android.support.v7.widget.CardView;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.habitrpg.android.habitica.R;
+import com.habitrpg.android.habitica.ui.activities.MainActivity;
+import com.habitrpg.android.habitica.ui.fragments.inventory.MountDetailRecyclerFragment;
+import com.habitrpg.android.habitica.ui.fragments.inventory.PetDetailRecyclerFragment;
+import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.Animal;
+
+import java.util.HashMap;
+import java.util.List;
+
+import butterknife.Bind;
+import butterknife.ButterKnife;
+
+public class StableRecyclerAdapter extends RecyclerView.Adapter {
+
+ private List itemList;
+ private HashMap ownedMapping;
+ public String itemType;
+
+ public MainActivity activity;
+
+ public void setItemList(List itemList) {
+ this.itemList = itemList;
+ this.notifyDataSetChanged();
+ }
+
+ public void setOwnedMapping(HashMap map) {
+ this.ownedMapping = map;
+ this.notifyDataSetChanged();
+ }
+
+ @Override
+ public StableViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+
+ View view = LayoutInflater.from(parent.getContext())
+ .inflate(R.layout.animal_overview_item, parent, false);
+
+ return new StableViewHolder(view);
+ }
+
+ @Override
+ public void onBindViewHolder(StableViewHolder holder, int position) {
+ holder.bind(this.itemList.get(position));
+ }
+
+ @Override
+ public int getItemCount() {
+ return itemList == null ? 0 : itemList.size();
+ }
+
+ class StableViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
+ Animal animal;
+
+ @Bind(R.id.card_view)
+ CardView cardView;
+
+ @Bind(R.id.imageView)
+ ImageView imageView;
+
+ @Bind(R.id.titleTextView)
+ TextView titleView;
+
+ @Bind(R.id.ownedTextView)
+ TextView ownedTextView;
+
+ Resources resources;
+
+ public StableViewHolder(View itemView) {
+ super(itemView);
+ ButterKnife.bind(this, itemView);
+
+ resources = itemView.getResources();
+
+ itemView.setOnClickListener(this);
+ }
+
+ public void bind(Animal item) {
+ this.animal = item;
+ titleView.setText(item.getAnimal());
+ ownedTextView.setVisibility(View.VISIBLE);
+ this.imageView.setAlpha(1.0f);
+ if (ownedMapping != null) {
+ if (ownedMapping.containsKey(item.getAnimal()) && ownedMapping.get(item.getAnimal()) > 0) {
+ this.ownedTextView.setText(ownedMapping.get(item.getAnimal()).toString());
+ if (itemType.equals("pets")) {
+ DataBindingUtils.loadImage(this.imageView, "Pet-" + item.getAnimal() + "-Base");
+ } else {
+ DataBindingUtils.loadImage(this.imageView, "Mount_Icon_" + item.getAnimal() + "-Base");
+ }
+ } else {
+ ownedTextView.setVisibility(View.GONE);
+ ownedTextView.setText(null);
+ DataBindingUtils.loadImage(this.imageView, "PixelPaw");
+ this.imageView.setAlpha(0.4f);
+ }
+ } else {
+ ownedTextView.setVisibility(View.GONE);
+ DataBindingUtils.loadImage(this.imageView, "PixelPaw");
+ this.imageView.setAlpha(0.4f);
+ }
+ }
+
+ @Override
+ public void onClick(View v) {
+ if (animal != null) {
+ if (ownedMapping != null) {
+ if (ownedMapping.containsKey(animal.getAnimal()) && ownedMapping.get(animal.getAnimal()) > 0) {
+ if (itemType.equals("pets")) {
+ PetDetailRecyclerFragment fragment = new PetDetailRecyclerFragment();
+ fragment.animalType = animal.getAnimal();
+ activity.displayFragment(fragment);
+ } else {
+ MountDetailRecyclerFragment fragment = new MountDetailRecyclerFragment();
+ fragment.animalType = animal.getAnimal();
+ activity.displayFragment(fragment);
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/QuestCollectRecyclerViewAdapter.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/QuestCollectRecyclerViewAdapter.java
index b15c57975..69091f21a 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/QuestCollectRecyclerViewAdapter.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/QuestCollectRecyclerViewAdapter.java
@@ -8,8 +8,8 @@ import android.widget.ImageView;
import android.widget.TextView;
import com.habitrpg.android.habitica.R;
-import com.magicmicky.habitrpgwrapper.lib.models.QuestContent;
import com.magicmicky.habitrpgwrapper.lib.models.QuestProgress;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.QuestContent;
import com.squareup.picasso.Picasso;
import java.util.ArrayList;
@@ -74,7 +74,7 @@ public class QuestCollectRecyclerViewAdapter extends RecyclerView.Adapter animals;
+ private static final String ANIMAL_TYPE_KEY = "ANIMAL_TYPE_KEY";
+ GridLayoutManager layoutManager = null;
+
+ private View view;
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+ this.usesTabLayout = false;
+ super.onCreateView(inflater, container, savedInstanceState);
+ if (view == null) {
+ view = inflater.inflate(R.layout.fragment_recyclerview, container, false);
+
+ recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
+
+ android.support.v4.app.FragmentActivity context = getActivity();
+
+ layoutManager = new GridLayoutManager(getActivity(), 2);
+ recyclerView.setLayoutManager(layoutManager);
+ recyclerView.addItemDecoration(new MarginDecoration(getActivity()));
+
+ adapter = (MountDetailRecyclerAdapter)recyclerView.getAdapter();
+ if (adapter == null) {
+ adapter = new MountDetailRecyclerAdapter();
+ adapter.context = this.getActivity();
+ adapter.itemType = this.animalType;
+ recyclerView.setAdapter(adapter);
+ this.loadItems();
+
+ }
+ }
+
+ if (savedInstanceState != null){
+ this.animalType = savedInstanceState.getString(ANIMAL_TYPE_KEY, "");
+ }
+
+ return view;
+ }
+
+ @Override
+ public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+ final View finalView = view;
+ finalView.post(new Runnable() {
+ @Override
+ public void run() {
+ setGridSpanCount(finalView.getWidth());
+ }
+ });
+ }
+
+ @Override
+ public void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+ outState.putString(ANIMAL_TYPE_KEY, this.animalType);
+ }
+
+
+
+ private void setGridSpanCount(int width) {
+ float itemWidth;
+ itemWidth = getContext().getResources().getDimension(R.dimen.pet_width);
+
+ int spanCount = (int) (width / itemWidth);
+ if (spanCount == 0) {
+ spanCount = 1;
+ }
+ layoutManager.setSpanCount(spanCount);
+ layoutManager.requestLayout();
+ }
+
+ private void loadItems() {
+ Runnable itemsRunnable = new Runnable() {
+ @Override
+ public void run() {
+ List items = new Select().from(Mount.class).where(Condition.column("animal").eq(animalType)).orderBy(true, "color").queryList();
+ adapter.setItemList(items);
+ animals = items;
+ adapter.setOwnedMapping(user.getItems().getMounts());
+ }
+ };
+ itemsRunnable.run();
+
+ }
+}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/PetDetailRecyclerFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/PetDetailRecyclerFragment.java
new file mode 100644
index 000000000..fd9a91b49
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/PetDetailRecyclerFragment.java
@@ -0,0 +1,117 @@
+package com.habitrpg.android.habitica.ui.fragments.inventory;
+
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.support.v7.widget.GridLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.habitrpg.android.habitica.R;
+import com.habitrpg.android.habitica.ui.adapter.inventory.PetDetailRecyclerAdapter;
+import com.habitrpg.android.habitica.ui.adapter.inventory.StableRecyclerAdapter;
+import com.habitrpg.android.habitica.ui.fragments.BaseFragment;
+import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment;
+import com.habitrpg.android.habitica.ui.helpers.MarginDecoration;
+import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.Animal;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.Mount;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.Pet;
+import com.raizlabs.android.dbflow.sql.builder.Condition;
+import com.raizlabs.android.dbflow.sql.language.From;
+import com.raizlabs.android.dbflow.sql.language.Select;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class PetDetailRecyclerFragment extends BaseMainFragment {
+ public RecyclerView recyclerView;
+ public PetDetailRecyclerAdapter adapter;
+ public String animalType;
+ public List animals;
+ private static final String ANIMAL_TYPE_KEY = "ANIMAL_TYPE_KEY";
+ GridLayoutManager layoutManager = null;
+
+ private View view;
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+ this.usesTabLayout = false;
+ super.onCreateView(inflater, container, savedInstanceState);
+ if (view == null) {
+ view = inflater.inflate(R.layout.fragment_recyclerview, container, false);
+
+ recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
+
+ android.support.v4.app.FragmentActivity context = getActivity();
+
+ layoutManager = new GridLayoutManager(getActivity(), 2);
+ recyclerView.setLayoutManager(layoutManager);
+ recyclerView.addItemDecoration(new MarginDecoration(getActivity()));
+
+ adapter = (PetDetailRecyclerAdapter)recyclerView.getAdapter();
+ if (adapter == null) {
+ adapter = new PetDetailRecyclerAdapter();
+ adapter.context = this.getActivity();
+ adapter.itemType = this.animalType;
+ recyclerView.setAdapter(adapter);
+ this.loadItems();
+
+ }
+ }
+
+ if (savedInstanceState != null){
+ this.animalType = savedInstanceState.getString(ANIMAL_TYPE_KEY, "");
+ }
+
+ return view;
+ }
+
+ @Override
+ public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+ final View finalView = view;
+ finalView.post(new Runnable() {
+ @Override
+ public void run() {
+ setGridSpanCount(finalView.getWidth());
+ }
+ });
+ }
+
+ @Override
+ public void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+ outState.putString(ANIMAL_TYPE_KEY, this.animalType);
+ }
+
+
+
+ private void setGridSpanCount(int width) {
+ float itemWidth;
+ itemWidth = getContext().getResources().getDimension(R.dimen.pet_width);
+
+ int spanCount = (int) (width / itemWidth);
+ if (spanCount == 0) {
+ spanCount = 1;
+ }
+ layoutManager.setSpanCount(spanCount);
+ layoutManager.requestLayout();
+ }
+
+ private void loadItems() {
+ Runnable itemsRunnable = new Runnable() {
+ @Override
+ public void run() {
+ List items = new Select().from(Pet.class).where(Condition.column("animal").eq(animalType)).orderBy(true, "color").queryList();
+ adapter.setItemList(items);
+ animals = items;
+ adapter.setOwnedMapping(user.getItems().getPets());
+ }
+ };
+ itemsRunnable.run();
+
+ }
+}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/StableFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/StableFragment.java
new file mode 100644
index 000000000..fdabe51c7
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/StableFragment.java
@@ -0,0 +1,86 @@
+package com.habitrpg.android.habitica.ui.fragments.inventory;
+
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentPagerAdapter;
+import android.support.v4.view.ViewPager;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.habitrpg.android.habitica.R;
+import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment;
+import com.habitrpg.android.habitica.ui.fragments.inventory.items.ItemRecyclerFragment;
+import com.magicmicky.habitrpgwrapper.lib.models.UserParty;
+
+public class StableFragment extends BaseMainFragment {
+
+ public ViewPager viewPager;
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ this.usesTabLayout = true;
+ super.onCreateView(inflater, container, savedInstanceState);
+ View v = inflater.inflate(R.layout.fragment_party, container, false);
+
+ viewPager = (ViewPager) v.findViewById(R.id.view_pager);
+
+ viewPager.setCurrentItem(0);
+
+ setViewPagerAdapter();
+
+ return v;
+ }
+
+ public void setViewPagerAdapter() {
+ android.support.v4.app.FragmentManager fragmentManager = getChildFragmentManager();
+
+ UserParty party = user.getParty();
+
+ if (party == null) {
+ return;
+ }
+
+ viewPager.setAdapter(new FragmentPagerAdapter(fragmentManager) {
+
+ @Override
+ public Fragment getItem(int position) {
+
+ StableRecyclerFragment fragment = new StableRecyclerFragment();
+
+ switch (position) {
+ case 0: {
+ fragment.itemType = "pets";
+ break;
+ }
+ case 1: {
+ fragment.itemType = "mounts";
+ break;
+ }
+ }
+ fragment.user = StableFragment.this.user;
+
+ return fragment;
+ }
+
+ @Override
+ public int getCount() {
+ return 2;
+ }
+
+ @Override
+ public CharSequence getPageTitle(int position) {
+ switch (position) {
+ case 0:
+ return activity.getString(R.string.pets);
+ case 1:
+ return activity.getString(R.string.mounts);
+ }
+ return "";
+ }
+ });
+
+ tabLayout.setupWithViewPager(viewPager);
+ }
+}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/StableRecyclerFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/StableRecyclerFragment.java
new file mode 100644
index 000000000..dac6b282d
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/StableRecyclerFragment.java
@@ -0,0 +1,156 @@
+package com.habitrpg.android.habitica.ui.fragments.inventory;
+
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.support.v4.app.Fragment;
+import android.support.v7.widget.GridLayoutManager;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.habitrpg.android.habitica.R;
+import com.habitrpg.android.habitica.ui.DividerItemDecoration;
+import com.habitrpg.android.habitica.ui.activities.MainActivity;
+import com.habitrpg.android.habitica.ui.adapter.inventory.ItemRecyclerAdapter;
+import com.habitrpg.android.habitica.ui.adapter.inventory.StableRecyclerAdapter;
+import com.habitrpg.android.habitica.ui.fragments.BaseFragment;
+import com.habitrpg.android.habitica.ui.helpers.MarginDecoration;
+import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.Animal;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.Egg;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.Food;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.HatchingPotion;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.Item;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.Mount;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.Pet;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.QuestContent;
+import com.raizlabs.android.dbflow.sql.builder.Condition;
+import com.raizlabs.android.dbflow.sql.language.From;
+import com.raizlabs.android.dbflow.sql.language.Select;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class StableRecyclerFragment extends BaseFragment {
+ public RecyclerView recyclerView;
+ public StableRecyclerAdapter adapter;
+ public String itemType;
+ public HabitRPGUser user;
+ public List animals;
+ private static final String ITEM_TYPE_KEY = "CLASS_TYPE_KEY";
+ GridLayoutManager layoutManager = null;
+
+ private View view;
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+ super.onCreateView(inflater, container, savedInstanceState);
+ if (view == null) {
+ view = inflater.inflate(R.layout.fragment_recyclerview, container, false);
+
+ recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
+
+ android.support.v4.app.FragmentActivity context = getActivity();
+
+ layoutManager = new GridLayoutManager(getActivity(), 2);
+ recyclerView.setLayoutManager(layoutManager);
+ recyclerView.addItemDecoration(new MarginDecoration(getActivity()));
+
+ adapter = (StableRecyclerAdapter)recyclerView.getAdapter();
+ if (adapter == null) {
+ adapter = new StableRecyclerAdapter();
+ adapter.activity = (MainActivity)this.getActivity();
+ adapter.itemType = this.itemType;
+ recyclerView.setAdapter(adapter);
+ this.loadItems();
+
+ }
+ }
+
+ if (savedInstanceState != null){
+ this.itemType = savedInstanceState.getString(ITEM_TYPE_KEY, "");
+ }
+
+ return view;
+ }
+
+ @Override
+ public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+ final View finalView = view;
+ finalView.post(new Runnable() {
+ @Override
+ public void run() {
+ setGridSpanCount(finalView.getWidth());
+ }
+ });
+ }
+
+ @Override
+ public void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+ outState.putString(ITEM_TYPE_KEY, this.itemType);
+ }
+
+
+
+ private void setGridSpanCount(int width) {
+ float itemWidth;
+ itemWidth = getContext().getResources().getDimension(R.dimen.pet_width);
+
+ int spanCount = (int) (width / itemWidth);
+ if (spanCount == 0) {
+ spanCount = 1;
+ }
+ layoutManager.setSpanCount(spanCount);
+ }
+
+ private void loadItems() {
+ Runnable itemsRunnable = new Runnable() {
+ @Override
+ public void run() {
+ From from = null;
+ switch (itemType) {
+ case "pets":
+ from = new Select().from(Pet.class);
+ break;
+ case "mounts":
+ from = new Select().from(Mount.class);
+ break;
+ }
+
+ if (from != null) {
+ List items = from.where().orderBy(true, "animalGroup", "animal").groupBy("animal").queryList();
+ adapter.setItemList(items);
+ animals = items;
+ HashMap ownedMap = new HashMap<>();
+ for (Animal animal : animals) {
+ ownedMap.put(animal.getAnimal(), 0);
+ }
+ switch (itemType) {
+ case "pets":
+ for (Map.Entry pet : StableRecyclerFragment.this.user.getItems().getPets().entrySet()) {
+ if (pet.getValue() > 0) {
+ ownedMap.put(pet.getKey().split("-")[0], ownedMap.get(pet.getKey().split("-")[0])+1);
+ }
+ }
+ break;
+ case "mounts":
+ for (Map.Entry mount : StableRecyclerFragment.this.user.getItems().getMounts().entrySet()) {
+ if (mount.getValue()) {
+ ownedMap.put(mount.getKey().split("-")[0], ownedMap.get(mount.getKey().split("-")[0])+1);
+ }
+ }
+ break;
+ }
+ adapter.setOwnedMapping(ownedMap);
+ }
+ }
+ };
+ itemsRunnable.run();
+
+ }
+}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemRecyclerFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemRecyclerFragment.java
new file mode 100644
index 000000000..185780805
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemRecyclerFragment.java
@@ -0,0 +1,98 @@
+package com.habitrpg.android.habitica.ui.fragments.inventory.items;
+
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.support.v4.app.Fragment;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.habitrpg.android.habitica.R;
+import com.habitrpg.android.habitica.ui.DividerItemDecoration;
+import com.habitrpg.android.habitica.ui.adapter.inventory.ItemRecyclerAdapter;
+import com.habitrpg.android.habitica.ui.fragments.BaseFragment;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.Egg;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.Food;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.HatchingPotion;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.Item;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.QuestContent;
+import com.raizlabs.android.dbflow.sql.builder.Condition;
+import com.raizlabs.android.dbflow.sql.language.From;
+import com.raizlabs.android.dbflow.sql.language.Select;
+
+import java.util.List;
+
+public class ItemRecyclerFragment extends BaseFragment {
+ public RecyclerView recyclerView;
+ public ItemRecyclerAdapter adapter;
+ public String itemType;
+ private static final String ITEM_TYPE_KEY = "CLASS_TYPE_KEY";
+ LinearLayoutManager layoutManager = null;
+
+ private View view;
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+ if (view == null) {
+ view = inflater.inflate(R.layout.fragment_recyclerview, container, false);
+
+ recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
+
+ android.support.v4.app.FragmentActivity context = getActivity();
+
+ layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
+
+ if (layoutManager == null) {
+ layoutManager = new LinearLayoutManager(context);
+
+ recyclerView.setLayoutManager(layoutManager);
+ }
+
+ adapter = (ItemRecyclerAdapter)recyclerView.getAdapter();
+ if (adapter == null) {
+ adapter = new ItemRecyclerAdapter();
+ adapter.context = this.getActivity();
+ recyclerView.setAdapter(adapter);
+ this.loadItems();
+
+ }
+ recyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST));
+ }
+
+ if (savedInstanceState != null){
+ this.itemType = savedInstanceState.getString(ITEM_TYPE_KEY, "");
+ }
+
+ return view;
+ }
+
+ @Override
+ public void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+ outState.putString(ITEM_TYPE_KEY, this.itemType);
+ }
+
+ private void loadItems() {
+ From from = null;
+ switch (this.itemType) {
+ case "eggs":
+ from = new Select().from(Egg.class);
+ break;
+ case "hatchingPotions":
+ from = new Select().from(HatchingPotion.class);
+ break;
+ case "food":
+ from = new Select().from(Food.class);
+ break;
+ case "quests":
+ from = new Select().from(QuestContent.class);
+ }
+
+ if (from != null) {
+ List
- items = from.where(Condition.column("owned").greaterThan(0)).queryList();
+ adapter.setItemList(items);
+ }
+ }
+}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemsFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemsFragment.java
new file mode 100644
index 000000000..11148bc24
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemsFragment.java
@@ -0,0 +1,97 @@
+package com.habitrpg.android.habitica.ui.fragments.inventory.items;
+
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentPagerAdapter;
+import android.support.v4.view.ViewPager;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.habitrpg.android.habitica.ContentCache;
+import com.habitrpg.android.habitica.R;
+import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment;
+import com.magicmicky.habitrpgwrapper.lib.models.UserParty;
+
+public class ItemsFragment extends BaseMainFragment {
+
+ public ViewPager viewPager;
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ this.usesTabLayout = true;
+ super.onCreateView(inflater, container, savedInstanceState);
+ View v = inflater.inflate(R.layout.fragment_party, container, false);
+
+ viewPager = (ViewPager) v.findViewById(R.id.view_pager);
+
+ viewPager.setCurrentItem(0);
+
+ setViewPagerAdapter();
+
+ return v;
+ }
+
+ public void setViewPagerAdapter() {
+ android.support.v4.app.FragmentManager fragmentManager = getChildFragmentManager();
+
+ UserParty party = user.getParty();
+
+ if (party == null) {
+ return;
+ }
+
+ viewPager.setAdapter(new FragmentPagerAdapter(fragmentManager) {
+
+ @Override
+ public Fragment getItem(int position) {
+
+ ItemRecyclerFragment fragment = new ItemRecyclerFragment();
+
+ switch (position) {
+ case 0: {
+ fragment.itemType = "eggs";
+ break;
+ }
+ case 1: {
+ fragment.itemType = "hatchingPotions";
+ break;
+ }
+ case 2: {
+ fragment.itemType = "food";
+ break;
+ }
+ case 3: {
+ fragment.itemType = "quests";
+ break;
+ }
+ }
+
+ return fragment;
+ }
+
+ @Override
+ public int getCount() {
+ return 4;
+ }
+
+ @Override
+ public CharSequence getPageTitle(int position) {
+ switch (position) {
+ case 0:
+ return activity.getString(R.string.eggs);
+ case 1:
+ return activity.getString(R.string.hatching_potions);
+ case 2:
+ return activity.getString(R.string.food);
+ case 3:
+ return activity.getString(R.string.quests);
+ }
+ return "";
+ }
+ });
+
+ tabLayout.setupWithViewPager(viewPager);
+ }
+}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/GroupInformationFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/GroupInformationFragment.java
index 89095b609..c19c77af0 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/GroupInformationFragment.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/GroupInformationFragment.java
@@ -22,7 +22,7 @@ import com.habitrpg.android.habitica.databinding.ValueBarBinding;
import com.habitrpg.android.habitica.ui.adapter.social.QuestCollectRecyclerViewAdapter;
import com.magicmicky.habitrpgwrapper.lib.models.Group;
import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser;
-import com.magicmicky.habitrpgwrapper.lib.models.QuestContent;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.QuestContent;
import butterknife.Bind;
import butterknife.ButterKnife;
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyFragment.java
index a4dbba8a2..21cb9a1fe 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyFragment.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyFragment.java
@@ -16,8 +16,8 @@ import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment;
import com.habitrpg.android.habitica.ui.fragments.social.ChatListFragment;
import com.habitrpg.android.habitica.ui.fragments.social.GroupInformationFragment;
import com.magicmicky.habitrpgwrapper.lib.models.Group;
-import com.magicmicky.habitrpgwrapper.lib.models.QuestContent;
import com.magicmicky.habitrpgwrapper.lib.models.UserParty;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.QuestContent;
import retrofit.Callback;
import retrofit.RetrofitError;
diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/ContentResult.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/ContentResult.java
index ceecebf03..43365c998 100644
--- a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/ContentResult.java
+++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/ContentResult.java
@@ -1,5 +1,11 @@
package com.magicmicky.habitrpgwrapper.lib.models;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.Egg;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.Food;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.HatchingPotion;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.Mount;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.Pet;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.QuestContent;
import com.magicmicky.habitrpgwrapper.lib.models.tasks.ItemData;
import java.util.HashMap;
@@ -16,9 +22,21 @@ public class ContentResult {
public ContentGear gear;
- public HashMap quests;
+ public List quests;
+ public List eggs;
+ public List food;
+ public List hatchingPotions;
- public SkillList spells;
+ public List pets;
+ public List specialPets;
+ public List premiumPets;
+ public List questPets;
+
+ public List mounts;
+ public List specialMounts;
+ public List questMounts;
+
+ public List spells;
public List appearances;
public List backgrounds;
diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/Items.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/Items.java
index 306c37359..be546ea6c 100644
--- a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/Items.java
+++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/Items.java
@@ -1,6 +1,11 @@
package com.magicmicky.habitrpgwrapper.lib.models;
import com.habitrpg.android.habitica.HabitDatabase;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.Egg;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.Food;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.HatchingPotion;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.QuestContent;
+import com.magicmicky.habitrpgwrapper.lib.models.tasks.ItemData;
import com.raizlabs.android.dbflow.annotation.Column;
import com.raizlabs.android.dbflow.annotation.ForeignKey;
import com.raizlabs.android.dbflow.annotation.ForeignKeyReference;
@@ -10,6 +15,8 @@ import com.raizlabs.android.dbflow.annotation.Table;
import com.raizlabs.android.dbflow.structure.BaseModel;
import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
/**
* Created by MagicMicky on 16/03/14.
@@ -32,7 +39,15 @@ public class Items extends BaseModel {
@Column
private Date lastDrop_date;
- //private Quest quest;
+ public List eggs;
+ public List food;
+ public List hatchingPotions;
+ public List quests;
+
+ HashMap pets;
+ HashMap mounts;
+
+ //private QuestContent quest;
@Column
@ForeignKey(references = {@ForeignKeyReference(columnName = "gear_id",
@@ -87,6 +102,62 @@ public class Items extends BaseModel {
this.gear = gear;
}
+ public String getUser_id() {
+ return user_id;
+ }
+
+ public void setUser_id(String user_id) {
+ this.user_id = user_id;
+ }
+
+ public List getEggs() {
+ return eggs;
+ }
+
+ public void setEggs(List eggs) {
+ this.eggs = eggs;
+ }
+
+ public List getFood() {
+ return food;
+ }
+
+ public void setFood(List food) {
+ this.food = food;
+ }
+
+ public List getHatchingPotions() {
+ return hatchingPotions;
+ }
+
+ public void setHatchingPotions(List hatchingPotions) {
+ this.hatchingPotions = hatchingPotions;
+ }
+
+ public List getQuests() {
+ return quests;
+ }
+
+ public void setQuests(List quests) {
+ this.quests = quests;
+ }
+
+ public HashMap getPets() {
+ return pets;
+ }
+
+ public void setPets(HashMap pets) {
+ this.pets = pets;
+ }
+
+ public HashMap getMounts() {
+ return mounts;
+ }
+
+ public void setMounts(HashMap mounts) {
+ this.mounts = mounts;
+ }
+
public Items() {}
@Override
diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/SkillList.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/SkillList.java
deleted file mode 100644
index cdf6b51dd..000000000
--- a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/SkillList.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package com.magicmicky.habitrpgwrapper.lib.models;
-
-/**
- * Created by viirus on 25/11/15.
- */
-public class SkillList {
-
-}
diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/inventory/Animal.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/inventory/Animal.java
new file mode 100644
index 000000000..b259f801c
--- /dev/null
+++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/inventory/Animal.java
@@ -0,0 +1,48 @@
+package com.magicmicky.habitrpgwrapper.lib.models.inventory;
+
+import com.raizlabs.android.dbflow.annotation.Column;
+import com.raizlabs.android.dbflow.annotation.PrimaryKey;
+import com.raizlabs.android.dbflow.structure.BaseModel;
+
+public class Animal extends BaseModel {
+
+ @Column
+ @PrimaryKey
+ String key;
+
+ @Column
+ String animal, color, animalGroup;
+
+ public String getKey() {
+ return key;
+ }
+
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ public String getAnimal() {
+ return animal;
+ }
+
+ public void setAnimal(String animal) {
+ this.animal = animal;
+ }
+
+ public String getColor() {
+ return color;
+ }
+
+ public void setColor(String color) {
+ this.color = color;
+ }
+
+ public String getAnimalGroup() {
+ return animalGroup;
+ }
+
+ public void setAnimalGroup(String group) {
+ this.animalGroup = group;
+ }
+
+}
diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/inventory/Egg.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/inventory/Egg.java
new file mode 100644
index 000000000..8cda37c94
--- /dev/null
+++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/inventory/Egg.java
@@ -0,0 +1,49 @@
+package com.magicmicky.habitrpgwrapper.lib.models.inventory;
+
+import com.habitrpg.android.habitica.HabitDatabase;
+import com.raizlabs.android.dbflow.annotation.Column;
+import com.raizlabs.android.dbflow.annotation.Table;
+
+@Table(databaseName = HabitDatabase.NAME)
+public class Egg extends Item {
+
+ @Column
+ String adjective, mountText;
+
+ Integer stableOwned, stableTotal;
+
+ public String getAdjective() {
+ return adjective;
+ }
+
+ public void setAdjective(String adjective) {
+ this.adjective = adjective;
+ }
+
+ public String getMountText() {
+ return mountText;
+ }
+
+ public void setMountText(String mountText) {
+ this.mountText = mountText;
+ }
+
+ public Integer getStableOwned() {
+ if (stableOwned == null) {
+ stableOwned = 0;
+ }
+ return stableOwned;
+ }
+
+ public void setStableOwned(Integer stableOwned) {
+ this.stableOwned = stableOwned;
+ }
+
+ public Integer getStableTotal() {
+ return stableTotal;
+ }
+
+ public void setStableTotal(Integer stableTotal) {
+ this.stableTotal = stableTotal;
+ }
+}
diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/inventory/Food.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/inventory/Food.java
new file mode 100644
index 000000000..b4460f8ab
--- /dev/null
+++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/inventory/Food.java
@@ -0,0 +1,39 @@
+package com.magicmicky.habitrpgwrapper.lib.models.inventory;
+
+import com.habitrpg.android.habitica.HabitDatabase;
+import com.raizlabs.android.dbflow.annotation.Column;
+import com.raizlabs.android.dbflow.annotation.Table;
+
+@Table(databaseName = HabitDatabase.NAME)
+public class Food extends Item {
+
+ @Column
+ String target, article;
+
+ @Column
+ Boolean canDrop;
+
+ public String getTarget() {
+ return target;
+ }
+
+ public void setTarget(String target) {
+ this.target = target;
+ }
+
+ public String getArticle() {
+ return article;
+ }
+
+ public void setArticle(String article) {
+ this.article = article;
+ }
+
+ public Boolean getCanDrop() {
+ return canDrop;
+ }
+
+ public void setCanDrop(Boolean canDrop) {
+ this.canDrop = canDrop;
+ }
+}
diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/inventory/HatchingPotion.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/inventory/HatchingPotion.java
new file mode 100644
index 000000000..b7dfdb8e9
--- /dev/null
+++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/inventory/HatchingPotion.java
@@ -0,0 +1,28 @@
+package com.magicmicky.habitrpgwrapper.lib.models.inventory;
+
+import com.habitrpg.android.habitica.HabitDatabase;
+import com.raizlabs.android.dbflow.annotation.Column;
+import com.raizlabs.android.dbflow.annotation.Table;
+
+@Table(databaseName = HabitDatabase.NAME)
+public class HatchingPotion extends Item {
+
+ @Column
+ Boolean limited, premium;
+
+ public Boolean getLimited() {
+ return limited;
+ }
+
+ public void setLimited(Boolean limited) {
+ this.limited = limited;
+ }
+
+ public Boolean getPremium() {
+ return premium;
+ }
+
+ public void setPremium(Boolean premium) {
+ this.premium = premium;
+ }
+}
diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/inventory/Item.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/inventory/Item.java
new file mode 100644
index 000000000..326d8176f
--- /dev/null
+++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/inventory/Item.java
@@ -0,0 +1,60 @@
+package com.magicmicky.habitrpgwrapper.lib.models.inventory;
+
+import com.habitrpg.android.habitica.HabitDatabase;
+import com.raizlabs.android.dbflow.annotation.Column;
+import com.raizlabs.android.dbflow.annotation.PrimaryKey;
+import com.raizlabs.android.dbflow.annotation.Table;
+import com.raizlabs.android.dbflow.structure.BaseModel;
+
+public class Item extends BaseModel {
+
+ @Column
+ @PrimaryKey
+ String key;
+
+ @Column
+ String text, notes;
+
+ @Column
+ Integer value, owned;
+
+ public String getKey() {
+ return key;
+ }
+
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ public String getText() {
+ return text;
+ }
+
+ public void setText(String text) {
+ this.text = text;
+ }
+
+ public String getNotes() {
+ return notes;
+ }
+
+ public void setNotes(String notes) {
+ this.notes = notes;
+ }
+
+ public Integer getValue() {
+ return value;
+ }
+
+ public void setValue(Integer value) {
+ this.value = value;
+ }
+
+ public Integer getOwned() {
+ return owned;
+ }
+
+ public void setOwned(Integer owned) {
+ this.owned = owned;
+ }
+}
diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/inventory/Mount.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/inventory/Mount.java
new file mode 100644
index 000000000..d81bd0bf2
--- /dev/null
+++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/inventory/Mount.java
@@ -0,0 +1,22 @@
+package com.magicmicky.habitrpgwrapper.lib.models.inventory;
+
+import com.habitrpg.android.habitica.HabitDatabase;
+import com.raizlabs.android.dbflow.annotation.Column;
+import com.raizlabs.android.dbflow.annotation.PrimaryKey;
+import com.raizlabs.android.dbflow.annotation.Table;
+import com.raizlabs.android.dbflow.structure.BaseModel;
+
+@Table(databaseName = HabitDatabase.NAME)
+public class Mount extends Animal {
+
+ @Column
+ Boolean owned;
+
+ public Boolean getOwned() {
+ return owned;
+ }
+
+ public void setOwned(Boolean owned) {
+ this.owned = owned;
+ }
+}
diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/inventory/Pet.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/inventory/Pet.java
new file mode 100644
index 000000000..0c91a5a07
--- /dev/null
+++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/inventory/Pet.java
@@ -0,0 +1,23 @@
+package com.magicmicky.habitrpgwrapper.lib.models.inventory;
+
+import com.habitrpg.android.habitica.HabitDatabase;
+import com.raizlabs.android.dbflow.annotation.Column;
+import com.raizlabs.android.dbflow.annotation.PrimaryKey;
+import com.raizlabs.android.dbflow.annotation.Table;
+import com.raizlabs.android.dbflow.structure.BaseModel;
+
+@Table(databaseName = HabitDatabase.NAME)
+public class Pet extends Animal {
+
+
+ @Column
+ Integer trained;
+
+ public Integer getTrained() {
+ return trained;
+ }
+
+ public void setTrained(Integer trained) {
+ this.trained = trained;
+ }
+}
diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/QuestContent.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/inventory/QuestContent.java
similarity index 65%
rename from Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/QuestContent.java
rename to Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/inventory/QuestContent.java
index ad8594c71..be6b87ad3 100644
--- a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/QuestContent.java
+++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/inventory/QuestContent.java
@@ -1,36 +1,21 @@
-package com.magicmicky.habitrpgwrapper.lib.models;
+package com.magicmicky.habitrpgwrapper.lib.models.inventory;
import com.habitrpg.android.habitica.HabitDatabase;
+import com.magicmicky.habitrpgwrapper.lib.models.QuestBoss;
+import com.magicmicky.habitrpgwrapper.lib.models.QuestCollect;
import com.raizlabs.android.dbflow.annotation.Column;
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;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-/**
- * Created by Negue on 29.09.2015.
- */
@Table(databaseName = HabitDatabase.NAME)
-public class QuestContent extends BaseModel {
- @PrimaryKey
- @Column
- public String key;
-
- @Column
- public String text;
-
- @Column
- public String notes;
-
- @Column
- public double value;
+public class QuestContent extends Item {
@Column
public String previous;
@@ -48,6 +33,46 @@ public class QuestContent extends BaseModel {
HashMap collect;
+ public String getPrevious() {
+ return previous;
+ }
+
+ public void setPrevious(String previous) {
+ this.previous = previous;
+ }
+
+ public int getLvl() {
+ return lvl;
+ }
+
+ public void setLvl(int lvl) {
+ this.lvl = lvl;
+ }
+
+ public boolean isCanBuy() {
+ return canBuy;
+ }
+
+ public void setCanBuy(boolean canBuy) {
+ this.canBuy = canBuy;
+ }
+
+ public String getCategory() {
+ return category;
+ }
+
+ public void setCategory(String category) {
+ this.category = category;
+ }
+
+ public QuestBoss getBoss() {
+ return boss;
+ }
+
+ public void setBoss(QuestBoss boss) {
+ this.boss = boss;
+ }
+
@OneToMany(methods = {OneToMany.Method.SAVE, OneToMany.Method.DELETE}, variableName = "collect")
public Collection getCollectCollection() {
return getCollect().values();
@@ -81,6 +106,4 @@ public class QuestContent extends BaseModel {
super.save();
}
- // todo drops
}
-
diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/ContentDeserializer.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/ContentDeserializer.java
new file mode 100644
index 000000000..67efbd7a7
--- /dev/null
+++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/ContentDeserializer.java
@@ -0,0 +1,110 @@
+package com.magicmicky.habitrpgwrapper.lib.utils;
+
+import com.google.gson.JsonDeserializationContext;
+import com.google.gson.JsonDeserializer;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParseException;
+import com.google.gson.reflect.TypeToken;
+import com.magicmicky.habitrpgwrapper.lib.models.ContentGear;
+import com.magicmicky.habitrpgwrapper.lib.models.ContentResult;
+import com.magicmicky.habitrpgwrapper.lib.models.Customization;
+import com.magicmicky.habitrpgwrapper.lib.models.FAQArticle;
+import com.magicmicky.habitrpgwrapper.lib.models.Skill;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.Egg;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.Food;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.HatchingPotion;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.Mount;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.Pet;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.QuestContent;
+import com.magicmicky.habitrpgwrapper.lib.models.tasks.ItemData;
+import com.raizlabs.android.dbflow.runtime.TransactionManager;
+import com.raizlabs.android.dbflow.runtime.transaction.process.ProcessModelInfo;
+import com.raizlabs.android.dbflow.runtime.transaction.process.SaveModelTransaction;
+import com.raizlabs.android.dbflow.structure.BaseModel;
+
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.List;
+
+public class ContentDeserializer implements JsonDeserializer {
+
+
+ @Override
+ public ContentResult deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
+ List items = new ArrayList<>();
+
+ ContentResult result = new ContentResult();
+ JsonObject object = json.getAsJsonObject();
+
+ result.potion = context.deserialize(object.get("potion"), ItemData.class);
+ result.armoire = context.deserialize(object.get("armoire"), ItemData.class);
+ result.gear = context.deserialize(object.get("gear"), ContentGear.class);
+
+ result.quests = context.deserialize(object.get("quests"), new TypeToken
>() {}.getType());
+ result.eggs = context.deserialize(object.get("eggs"), new TypeToken>() {}.getType());
+ result.food = context.deserialize(object.get("food"), new TypeToken>() {}.getType());
+ result.hatchingPotions = context.deserialize(object.get("hatchingPotions"), new TypeToken>() {}.getType());
+
+ items.addAll(result.quests);
+ items.addAll(result.eggs);
+ items.addAll(result.food);
+ items.addAll(result.hatchingPotions);
+
+ result.pets = context.deserialize(object.get("pets"), new TypeToken>() {}.getType());
+ result.specialPets = context.deserialize(object.get("specialPets"), new TypeToken>() {}.getType());
+ result.premiumPets = context.deserialize(object.get("premiumPets"), new TypeToken>() {}.getType());
+ result.questPets = context.deserialize(object.get("questPets"), new TypeToken>() {}.getType());
+
+ for (Pet pet : result.pets) {
+ pet.setAnimalGroup("pets");
+ items.add(pet);
+ }
+ for (Pet pet : result.specialPets) {
+ pet.setAnimalGroup("specialPets");
+ items.add(pet);
+ }
+ for (Pet pet : result.premiumPets) {
+ pet.setAnimalGroup("premiumPets");
+ items.add(pet);
+ }
+ for (Pet pet : result.questPets) {
+ pet.setAnimalGroup("questPets");
+ items.add(pet);
+ }
+
+ result.mounts = context.deserialize(object.get("mounts"), new TypeToken>() {}.getType());
+ result.specialMounts = context.deserialize(object.get("specialMounts"), new TypeToken>() {}.getType());
+ result.questMounts = context.deserialize(object.get("questMounts"), new TypeToken>() {}.getType());
+
+ for (Mount mount : result.mounts) {
+ mount.setAnimalGroup("mounts");
+ items.add(mount);
+ }
+ for (Mount mount : result.specialMounts) {
+ mount.setAnimalGroup("specialMounts");
+ items.add(mount);
+ }
+ for (Mount mount : result.questMounts) {
+ mount.setAnimalGroup("questMounts");
+ items.add(mount);
+ }
+
+ result.spells = context.deserialize(object.get("spells"), new TypeToken>() {}.getType());
+
+ result.appearances = context.deserialize(object.get("appearances"), new TypeToken>() {}.getType());
+ result.backgrounds = context.deserialize(object.get("backgrounds"), new TypeToken>() {}.getType());
+
+ result.faq = context.deserialize(object.get("faq"), new TypeToken>() {}.getType());
+
+ items.addAll(result.spells);
+
+ items.addAll(result.appearances);
+ items.addAll(result.backgrounds);
+
+ items.addAll(result.faq);
+
+ TransactionManager.getInstance().addTransaction(new SaveModelTransaction<>(ProcessModelInfo.withModels(items)));
+ return result;
+ }
+}
diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/CustomizationDeserializer.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/CustomizationDeserializer.java
index a5a8ed7a2..cd4c38b79 100644
--- a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/CustomizationDeserializer.java
+++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/CustomizationDeserializer.java
@@ -87,7 +87,6 @@ public class CustomizationDeserializer implements JsonDeserializer(ProcessModelInfo.withModels(customizations)));
return customizations;
}
diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/EggListDeserializer.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/EggListDeserializer.java
new file mode 100644
index 000000000..3178aae28
--- /dev/null
+++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/EggListDeserializer.java
@@ -0,0 +1,70 @@
+package com.magicmicky.habitrpgwrapper.lib.utils;
+
+import com.google.gson.JsonDeserializationContext;
+import com.google.gson.JsonDeserializer;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParseException;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.Egg;
+import com.raizlabs.android.dbflow.runtime.TransactionManager;
+import com.raizlabs.android.dbflow.runtime.transaction.process.ProcessModelInfo;
+import com.raizlabs.android.dbflow.runtime.transaction.process.SaveModelTransaction;
+import com.raizlabs.android.dbflow.sql.language.Select;
+
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+public class EggListDeserializer implements JsonDeserializer> {
+ @Override
+ public List deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
+ List vals = new ArrayList<>();
+ if (json.isJsonObject()) {
+ JsonObject object = json.getAsJsonObject();
+
+ List existingItems = new Select().from(Egg.class).queryList();
+
+ for (Egg item : existingItems) {
+ if(object.has(item.getKey())) {
+ JsonElement itemObject = object.get(item.getKey());
+
+ if (itemObject.isJsonObject()) {
+ Egg parsedItem = context.deserialize(itemObject.getAsJsonObject(), Egg.class);
+ item.setText(parsedItem.getText());
+ item.setNotes(parsedItem.getNotes());
+ item.setValue(parsedItem.getValue());
+ item.setAdjective(parsedItem.getAdjective());
+ item.setMountText(parsedItem.getMountText());
+ } else {
+ item.setOwned(itemObject.getAsInt());
+ }
+ vals.add(item);
+ object.remove(item.getKey());
+ }
+ }
+
+ for (Map.Entry entry : json.getAsJsonObject().entrySet()) {
+ Egg item;
+ if (entry.getValue().isJsonObject()) {
+ item = context.deserialize(entry.getValue(), Egg.class);
+ } else {
+ item = new Egg();
+ item.setKey(entry.getKey());
+ if (entry.getValue().isJsonNull()) {
+ item.setOwned(0);
+ } else {
+ item.setOwned(entry.getValue().getAsInt());
+ }
+ }
+ vals.add(item);
+ }
+ } else {
+ for (JsonElement item : json.getAsJsonArray()) {
+ vals.add((Egg) context.deserialize(item.getAsJsonObject(), Egg.class));
+ }
+ }
+
+ return vals;
+ }
+}
diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/FAQArticleListDeserilializer.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/FAQArticleListDeserilializer.java
index 9776b3919..9a6d9922c 100644
--- a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/FAQArticleListDeserilializer.java
+++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/FAQArticleListDeserilializer.java
@@ -38,8 +38,6 @@ public class FAQArticleListDeserilializer implements JsonDeserializer(ProcessModelInfo.withModels(vals)));
-
return vals;
}
}
diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/FoodListDeserializer.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/FoodListDeserializer.java
new file mode 100644
index 000000000..f5611b21e
--- /dev/null
+++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/FoodListDeserializer.java
@@ -0,0 +1,71 @@
+package com.magicmicky.habitrpgwrapper.lib.utils;
+
+import com.google.gson.JsonDeserializationContext;
+import com.google.gson.JsonDeserializer;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParseException;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.Food;
+import com.raizlabs.android.dbflow.runtime.TransactionManager;
+import com.raizlabs.android.dbflow.runtime.transaction.process.ProcessModelInfo;
+import com.raizlabs.android.dbflow.runtime.transaction.process.SaveModelTransaction;
+import com.raizlabs.android.dbflow.sql.language.Select;
+
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+public class FoodListDeserializer implements JsonDeserializer> {
+ @Override
+ public List deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
+ List vals = new ArrayList<>();
+ if (json.isJsonObject()) {
+ JsonObject object = json.getAsJsonObject();
+
+ List existingItems = new Select().from(Food.class).queryList();
+
+ for (Food item : existingItems) {
+ if(object.has(item.getKey())) {
+ JsonElement itemObject = object.get(item.getKey());
+
+ if (itemObject.isJsonObject()) {
+ Food parsedItem = context.deserialize(itemObject.getAsJsonObject(), Food.class);
+ item.setText(parsedItem.getText());
+ item.setNotes(parsedItem.getNotes());
+ item.setValue(parsedItem.getValue());
+ item.setArticle(parsedItem.getArticle());
+ item.setCanDrop(parsedItem.getCanDrop());
+ item.setTarget(parsedItem.getTarget());
+ } else {
+ item.setOwned(itemObject.getAsInt());
+ }
+ vals.add(item);
+ object.remove(item.getKey());
+ }
+ }
+
+ for (Map.Entry entry : json.getAsJsonObject().entrySet()) {
+ Food item;
+ if (entry.getValue().isJsonObject()) {
+ item = context.deserialize(entry.getValue(), Food.class);
+ } else {
+ item = new Food();
+ item.setKey(entry.getKey());
+ if (entry.getValue().isJsonNull()) {
+ item.setOwned(0);
+ } else {
+ item.setOwned(entry.getValue().getAsInt());
+ }
+ }
+ vals.add(item);
+ }
+ } else {
+ for (JsonElement item : json.getAsJsonArray()) {
+ vals.add((Food) context.deserialize(item.getAsJsonObject(), Food.class));
+ }
+ }
+
+ return vals;
+ }
+}
diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/HatchingPotionListDeserializer.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/HatchingPotionListDeserializer.java
new file mode 100644
index 000000000..301a18a3e
--- /dev/null
+++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/HatchingPotionListDeserializer.java
@@ -0,0 +1,70 @@
+package com.magicmicky.habitrpgwrapper.lib.utils;
+
+import com.google.gson.JsonDeserializationContext;
+import com.google.gson.JsonDeserializer;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParseException;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.HatchingPotion;
+import com.raizlabs.android.dbflow.runtime.TransactionManager;
+import com.raizlabs.android.dbflow.runtime.transaction.process.ProcessModelInfo;
+import com.raizlabs.android.dbflow.runtime.transaction.process.SaveModelTransaction;
+import com.raizlabs.android.dbflow.sql.language.Select;
+
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+public class HatchingPotionListDeserializer implements JsonDeserializer> {
+ @Override
+ public List deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
+ List vals = new ArrayList<>();
+ if (json.isJsonObject()) {
+ JsonObject object = json.getAsJsonObject();
+
+ List existingItems = new Select().from(HatchingPotion.class).queryList();
+
+ for (HatchingPotion item : existingItems) {
+ if(object.has(item.getKey())) {
+ JsonElement itemObject = object.get(item.getKey());
+
+ if (itemObject.isJsonObject()) {
+ HatchingPotion parsedItem = context.deserialize(itemObject.getAsJsonObject(), HatchingPotion.class);
+ item.setText(parsedItem.getText());
+ item.setNotes(parsedItem.getNotes());
+ item.setValue(parsedItem.getValue());
+ item.setLimited(parsedItem.getLimited());
+ item.setPremium(parsedItem.getPremium());
+ } else {
+ item.setOwned(itemObject.getAsInt());
+ }
+ vals.add(item);
+ object.remove(item.getKey());
+ }
+ }
+
+ for (Map.Entry entry : json.getAsJsonObject().entrySet()) {
+ HatchingPotion item;
+ if (entry.getValue().isJsonObject()) {
+ item = context.deserialize(entry.getValue(), HatchingPotion.class);
+ } else {
+ item = new HatchingPotion();
+ item.setKey(entry.getKey());
+ if (entry.getValue().isJsonNull()) {
+ item.setOwned(0);
+ } else {
+ item.setOwned(entry.getValue().getAsInt());
+ }
+ }
+ vals.add(item);
+ }
+ } else {
+ for (JsonElement item : json.getAsJsonArray()) {
+ vals.add((HatchingPotion) context.deserialize(item.getAsJsonObject(), HatchingPotion.class));
+ }
+ }
+
+ return vals;
+ }
+}
diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/ItemDataListDeserializer.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/ItemDataListDeserializer.java
index 8768e1e99..13e561d40 100644
--- a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/ItemDataListDeserializer.java
+++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/ItemDataListDeserializer.java
@@ -64,7 +64,6 @@ public class ItemDataListDeserializer implements JsonDeserializer
}
vals.add(item);
}
- TransactionManager.getInstance().addTransaction(new SaveModelTransaction<>(ProcessModelInfo.withModels(vals)));
} else {
for (JsonElement item : json.getAsJsonArray()) {
vals.add((ItemData) context.deserialize(item.getAsJsonObject(), ItemData.class));
diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/MountListDeserializer.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/MountListDeserializer.java
new file mode 100644
index 000000000..7c97e1068
--- /dev/null
+++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/MountListDeserializer.java
@@ -0,0 +1,32 @@
+package com.magicmicky.habitrpgwrapper.lib.utils;
+
+import com.google.gson.JsonDeserializationContext;
+import com.google.gson.JsonDeserializer;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonParseException;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.Mount;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.Pet;
+import com.raizlabs.android.dbflow.runtime.TransactionManager;
+import com.raizlabs.android.dbflow.runtime.transaction.process.ProcessModelInfo;
+import com.raizlabs.android.dbflow.runtime.transaction.process.SaveModelTransaction;
+
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+public class MountListDeserializer implements JsonDeserializer> {
+ @Override
+ public List deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
+ List vals = new ArrayList<>();
+ for (Map.Entry entry : json.getAsJsonObject().entrySet()) {
+ Mount pet = new Mount();
+ pet.setKey(entry.getKey());
+ pet.setAnimal(entry.getKey().split("-")[0]);
+ pet.setColor(entry.getKey().split("-")[1]);
+ vals.add(pet);
+ }
+
+ return vals;
+ }
+}
diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/PetListDeserializer.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/PetListDeserializer.java
new file mode 100644
index 000000000..d9e2cf72a
--- /dev/null
+++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/PetListDeserializer.java
@@ -0,0 +1,34 @@
+package com.magicmicky.habitrpgwrapper.lib.utils;
+
+import com.google.gson.JsonDeserializationContext;
+import com.google.gson.JsonDeserializer;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParseException;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.HatchingPotion;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.Pet;
+import com.raizlabs.android.dbflow.runtime.TransactionManager;
+import com.raizlabs.android.dbflow.runtime.transaction.process.ProcessModelInfo;
+import com.raizlabs.android.dbflow.runtime.transaction.process.SaveModelTransaction;
+import com.raizlabs.android.dbflow.sql.language.Select;
+
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+public class PetListDeserializer implements JsonDeserializer> {
+ @Override
+ public List deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
+ List vals = new ArrayList<>();
+ for (Map.Entry entry : json.getAsJsonObject().entrySet()) {
+ Pet pet = new Pet();
+ pet.setKey(entry.getKey());
+ pet.setAnimal(entry.getKey().split("-")[0]);
+ pet.setColor(entry.getKey().split("-")[1]);
+ vals.add(pet);
+ }
+
+ return vals;
+ }
+}
diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/QuestListDeserializer.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/QuestListDeserializer.java
new file mode 100644
index 000000000..b25a83e8b
--- /dev/null
+++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/QuestListDeserializer.java
@@ -0,0 +1,75 @@
+package com.magicmicky.habitrpgwrapper.lib.utils;
+
+import com.google.gson.JsonDeserializationContext;
+import com.google.gson.JsonDeserializer;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParseException;
+import com.magicmicky.habitrpgwrapper.lib.models.inventory.QuestContent;
+import com.raizlabs.android.dbflow.runtime.TransactionManager;
+import com.raizlabs.android.dbflow.runtime.transaction.process.ProcessModelInfo;
+import com.raizlabs.android.dbflow.runtime.transaction.process.SaveModelTransaction;
+import com.raizlabs.android.dbflow.sql.language.Select;
+
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+public class QuestListDeserializer implements JsonDeserializer> {
+ @Override
+ public List deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
+ List vals = new ArrayList<>();
+ if (json.isJsonObject()) {
+ JsonObject object = json.getAsJsonObject();
+
+ List existingItems = new Select().from(QuestContent.class).queryList();
+
+ for (QuestContent item : existingItems) {
+ if(object.has(item.getKey())) {
+ JsonElement itemObject = object.get(item.getKey());
+
+ if (itemObject.isJsonObject()) {
+ QuestContent parsedItem = context.deserialize(itemObject.getAsJsonObject(), QuestContent.class);
+ item.setText(parsedItem.getText());
+ item.setNotes(parsedItem.getNotes());
+ item.setValue(parsedItem.getValue());
+ item.setPrevious(parsedItem.getPrevious());
+ item.setCanBuy(parsedItem.isCanBuy());
+ item.setBoss(parsedItem.getBoss());
+ item.setCategory(parsedItem.getCategory());
+ item.setCollect(parsedItem.getCollect());
+ item.setLvl(parsedItem.getLvl());
+ } else {
+ item.setOwned(itemObject.getAsInt());
+ }
+ vals.add(item);
+ object.remove(item.getKey());
+ }
+ }
+
+ for (Map.Entry entry : json.getAsJsonObject().entrySet()) {
+ QuestContent item;
+ if (entry.getValue().isJsonObject()) {
+ item = context.deserialize(entry.getValue(), QuestContent.class);
+ } else {
+ item = new QuestContent();
+ item.setKey(entry.getKey());
+ if (entry.getValue().isJsonNull()) {
+ item.setOwned(0);
+ } else {
+ item.setOwned(entry.getValue().getAsInt());
+ }
+ }
+ vals.add(item);
+ }
+ TransactionManager.getInstance().addTransaction(new SaveModelTransaction<>(ProcessModelInfo.withModels(vals)));
+ } else {
+ for (JsonElement item : json.getAsJsonArray()) {
+ vals.add((QuestContent) context.deserialize(item.getAsJsonObject(), QuestContent.class));
+ }
+ }
+
+ return vals;
+ }
+}
diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/SkillDeserializer.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/SkillDeserializer.java
index 0ee64f6fd..2624c4c0b 100644
--- a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/SkillDeserializer.java
+++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/SkillDeserializer.java
@@ -6,7 +6,6 @@ import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import com.magicmicky.habitrpgwrapper.lib.models.Skill;
-import com.magicmicky.habitrpgwrapper.lib.models.SkillList;
import com.raizlabs.android.dbflow.runtime.TransactionManager;
import com.raizlabs.android.dbflow.runtime.transaction.process.ProcessModelInfo;
import com.raizlabs.android.dbflow.runtime.transaction.process.SaveModelTransaction;
@@ -20,10 +19,10 @@ import java.util.Map;
* Created by viirus on 25/11/15.
*/
public class SkillDeserializer
- implements JsonDeserializer {
+ implements JsonDeserializer> {
@Override
- public SkillList deserialize(JsonElement json, Type type,
+ public List deserialize(JsonElement json, Type type,
JsonDeserializationContext context) throws JsonParseException {
JsonObject object = json.getAsJsonObject();
@@ -49,10 +48,6 @@ public class SkillDeserializer
}
}
- TransactionManager.getInstance().addTransaction(new SaveModelTransaction<>(ProcessModelInfo.withModels(skills)));
-
- SkillList skillList = new SkillList();
-
- return skillList;
+ return skills;
}
}
\ No newline at end of file