diff --git a/Habitica/assets/migrations/Habitica/14.sql b/Habitica/assets/migrations/Habitica/14.sql
new file mode 100644
index 000000000..cb26c6637
--- /dev/null
+++ b/Habitica/assets/migrations/Habitica/14.sql
@@ -0,0 +1 @@
+ALTER TABLE ItemData ADD COLUMN owned bool;
\ No newline at end of file
diff --git a/Habitica/res/layout/equipment_overview_list.xml b/Habitica/res/layout/equipment_overview_list.xml
new file mode 100644
index 000000000..3566a4166
--- /dev/null
+++ b/Habitica/res/layout/equipment_overview_list.xml
@@ -0,0 +1,74 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Habitica/res/layout/fragment_avatar_overview.xml b/Habitica/res/layout/fragment_avatar_overview.xml
index 203c49884..8d2fbeebf 100644
--- a/Habitica/res/layout/fragment_avatar_overview.xml
+++ b/Habitica/res/layout/fragment_avatar_overview.xml
@@ -71,12 +71,12 @@
android:layout_marginEnd="8dp"
android:entries="@array/avatar_sizes"/>
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Habitica/res/layout/gear_list_item.xml b/Habitica/res/layout/gear_list_item.xml
new file mode 100644
index 000000000..195510655
--- /dev/null
+++ b/Habitica/res/layout/gear_list_item.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Habitica/res/layout/avatar_overview_card.xml b/Habitica/res/layout/item_image_row.xml
similarity index 94%
rename from Habitica/res/layout/avatar_overview_card.xml
rename to Habitica/res/layout/item_image_row.xml
index f9ac30c09..27cd118f9 100644
--- a/Habitica/res/layout/avatar_overview_card.xml
+++ b/Habitica/res/layout/item_image_row.xml
@@ -13,8 +13,8 @@
android:layout_height="wrap_content"
android:minHeight="60dp"
android:padding="5dp"
- android:paddingTop="8dp"
- android:paddingBottom="8dp"
+ android:paddingTop="@dimen/row_padding"
+ android:paddingBottom="@dimen/row_padding"
android:clickable="true"
android:background="@drawable/selection_highlight">
+ android:padding="@dimen/row_padding">
114dp
90dp
100dp
+ 90dp
+ 8dp
\ No newline at end of file
diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml
index 41964b41e..611a39f40 100644
--- a/Habitica/res/values/strings.xml
+++ b/Habitica/res/values/strings.xml
@@ -241,4 +241,15 @@ To start, which parts of your life do you want to improve?
Due: %s
current streak: %d
Task has Due Date
+ Battle Gear
+ Costume
+ Head
+ Head Accessory
+ Eyewear
+ Armor
+ Back
+ Body
+ Shield
+ Weapon
+ Wear Costume
\ No newline at end of file
diff --git a/Habitica/src/com/habitrpg/android/habitica/APIHelper.java b/Habitica/src/com/habitrpg/android/habitica/APIHelper.java
index 45b84ca0b..f55966b33 100644
--- a/Habitica/src/com/habitrpg/android/habitica/APIHelper.java
+++ b/Habitica/src/com/habitrpg/android/habitica/APIHelper.java
@@ -35,6 +35,7 @@ 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.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;
@@ -42,6 +43,7 @@ import com.magicmicky.habitrpgwrapper.lib.utils.CustomizationDeserializer;
import com.magicmicky.habitrpgwrapper.lib.utils.DateDeserializer;
import com.magicmicky.habitrpgwrapper.lib.utils.FAQArticleListDeserilializer;
import com.magicmicky.habitrpgwrapper.lib.utils.GroupSerialization;
+import com.magicmicky.habitrpgwrapper.lib.utils.ItemDataListDeserializer;
import com.magicmicky.habitrpgwrapper.lib.utils.PurchasedDeserializer;
import com.magicmicky.habitrpgwrapper.lib.utils.SkillDeserializer;
import com.magicmicky.habitrpgwrapper.lib.utils.TaskListDeserializer;
@@ -94,6 +96,7 @@ public class APIHelper implements ErrorHandler, Profiler {
Type customizationListType = new TypeToken>() {}.getType();
Type tutorialStepListType = new TypeToken>() {}.getType();
Type faqArticleListType = new TypeToken>() {}.getType();
+ Type itemDataListType = new TypeToken>() {}.getType();
//Exclusion stratety needed for DBFlow https://github.com/Raizlabs/DBFlow/issues/121
Gson gson = new GsonBuilder()
@@ -122,6 +125,7 @@ public class APIHelper implements ErrorHandler, Profiler {
.registerTypeAdapter(faqArticleListType, new FAQArticleListDeserilializer())
.registerTypeAdapter(Group.class, new GroupSerialization())
.registerTypeAdapter(Date.class, new DateDeserializer())
+ .registerTypeAdapter(itemDataListType, new ItemDataListDeserializer())
.setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
.create();
diff --git a/Habitica/src/com/habitrpg/android/habitica/ContentCache.java b/Habitica/src/com/habitrpg/android/habitica/ContentCache.java
index 104c2a347..f9b51f081 100644
--- a/Habitica/src/com/habitrpg/android/habitica/ContentCache.java
+++ b/Habitica/src/com/habitrpg/android/habitica/ContentCache.java
@@ -106,10 +106,10 @@ public class ContentCache {
} else if (searchKey == "armoire") {
searchedItem = (T) contentResult.armoire;
} else {
- Collection itemList = contentResult.gear.flat.values();
+ Collection itemList = contentResult.gear.flat;
for (ItemData item : itemList) {
- if (item.key == searchKey) {
+ if (item.key.equals(searchKey)) {
searchedItem = (T) item;
}
}
@@ -141,7 +141,7 @@ public class ContentCache {
case "item": {
List resultList = new ArrayList();
- List itemList = new ArrayList(contentResult.gear.flat.values());
+ List itemList = new ArrayList(contentResult.gear.flat);
itemList.add(contentResult.potion);
itemList.add(contentResult.armoire);
@@ -181,7 +181,7 @@ public class ContentCache {
}
}
- Collection itemList = new ArrayList<>(contentResult.gear.flat.values());
+ Collection itemList = new ArrayList<>(contentResult.gear.flat);
itemList.add(contentResult.armoire);
itemList.add(contentResult.potion);
diff --git a/Habitica/src/com/habitrpg/android/habitica/HabitDatabase.java b/Habitica/src/com/habitrpg/android/habitica/HabitDatabase.java
index f880ccc18..a7d9d3a7b 100644
--- a/Habitica/src/com/habitrpg/android/habitica/HabitDatabase.java
+++ b/Habitica/src/com/habitrpg/android/habitica/HabitDatabase.java
@@ -10,5 +10,5 @@ public class HabitDatabase {
public static final String NAME = "Habitica";
- public static final int VERSION = 13;
+ public static final int VERSION = 14;
}
diff --git a/Habitica/src/com/habitrpg/android/habitica/callbacks/ItemsCallback.java b/Habitica/src/com/habitrpg/android/habitica/callbacks/ItemsCallback.java
new file mode 100644
index 000000000..4f8816e3a
--- /dev/null
+++ b/Habitica/src/com/habitrpg/android/habitica/callbacks/ItemsCallback.java
@@ -0,0 +1,36 @@
+package com.habitrpg.android.habitica.callbacks;
+
+import com.magicmicky.habitrpgwrapper.lib.models.Gear;
+import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser;
+import com.magicmicky.habitrpgwrapper.lib.models.Items;
+import com.magicmicky.habitrpgwrapper.lib.models.responses.UnlockResponse;
+
+import retrofit.Callback;
+import retrofit.RetrofitError;
+import retrofit.client.Response;
+
+public class ItemsCallback implements Callback {
+
+ private final HabitRPGUserCallback.OnUserReceived mCallback;
+
+ private HabitRPGUser user;
+
+ public ItemsCallback(HabitRPGUserCallback.OnUserReceived callback, HabitRPGUser user) {
+ this.mCallback = callback;
+ this.user = user;
+ }
+
+ @Override
+ public void success(Items items, Response response) {
+ this.user.setItems(items);
+
+ this.user.async().save();
+
+ mCallback.onUserReceived(this.user);
+ }
+
+ @Override
+ public void failure(RetrofitError error) {
+ mCallback.onUserFail();
+ }
+}
diff --git a/Habitica/src/com/habitrpg/android/habitica/events/commands/EquipGearCommand.java b/Habitica/src/com/habitrpg/android/habitica/events/commands/EquipGearCommand.java
new file mode 100644
index 000000000..be23ab6a9
--- /dev/null
+++ b/Habitica/src/com/habitrpg/android/habitica/events/commands/EquipGearCommand.java
@@ -0,0 +1,10 @@
+package com.habitrpg.android.habitica.events.commands;
+
+import com.magicmicky.habitrpgwrapper.lib.models.tasks.ItemData;
+
+public class EquipGearCommand {
+
+ public ItemData gear;
+ public Boolean asCostume;
+
+}
diff --git a/Habitica/src/com/habitrpg/android/habitica/ui/MainDrawerBuilder.java b/Habitica/src/com/habitrpg/android/habitica/ui/MainDrawerBuilder.java
index 5b8e713a3..57d65ac6c 100644
--- a/Habitica/src/com/habitrpg/android/habitica/ui/MainDrawerBuilder.java
+++ b/Habitica/src/com/habitrpg/android/habitica/ui/MainDrawerBuilder.java
@@ -13,6 +13,7 @@ import com.habitrpg.android.habitica.ui.fragments.inventory.customization.Avatar
import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment;
import com.habitrpg.android.habitica.ui.fragments.faq.FAQOverviewFragment;
import com.habitrpg.android.habitica.ui.fragments.GemsPurchaseFragment;
+import com.habitrpg.android.habitica.ui.fragments.inventory.equipment.EquipmentOverviewFragment;
import com.habitrpg.android.habitica.ui.fragments.social.GuildsOverviewFragment;
import com.habitrpg.android.habitica.ui.fragments.social.party.PartyFragment;
import com.habitrpg.android.habitica.ui.fragments.SkillsFragment;
@@ -87,7 +88,7 @@ public class MainDrawerBuilder {
new SectionDrawerItem().withName(activity.getString(R.string.sidebar_section_inventory)),
new PrimaryDrawerItem().withName(activity.getString(R.string.sidebar_avatar)).withIdentifier(SIDEBAR_AVATAR),
- new PrimaryDrawerItem().withName(activity.getString(R.string.sidebar_equipment)).withIdentifier(SIDEBAR_EQUIPMENT).withEnabled(false).withBadge(R.string.coming_soon),
+ new PrimaryDrawerItem().withName(activity.getString(R.string.sidebar_equipment)).withIdentifier(SIDEBAR_EQUIPMENT),
new PrimaryDrawerItem().withName(activity.getString(R.string.sidebar_stable)).withIdentifier(SIDEBAR_STABLE).withEnabled(false).withBadge(R.string.coming_soon),
new PrimaryDrawerItem().withName(activity.getString(R.string.sidebar_purchaseGems)).withIdentifier(SIDEBAR_PURCHASE),
@@ -131,6 +132,10 @@ public class MainDrawerBuilder {
fragment = new AvatarOverviewFragment();
break;
}
+ case SIDEBAR_EQUIPMENT: {
+ fragment = new EquipmentOverviewFragment();
+ break;
+ }
case SIDEBAR_PURCHASE: {
fragment = new GemsPurchaseFragment();
break;
diff --git a/Habitica/src/com/habitrpg/android/habitica/ui/activities/MainActivity.java b/Habitica/src/com/habitrpg/android/habitica/ui/activities/MainActivity.java
index 21318eaf1..dd65dfff5 100644
--- a/Habitica/src/com/habitrpg/android/habitica/ui/activities/MainActivity.java
+++ b/Habitica/src/com/habitrpg/android/habitica/ui/activities/MainActivity.java
@@ -32,8 +32,10 @@ import com.habitrpg.android.habitica.HabiticaApplication;
import com.habitrpg.android.habitica.HostConfig;
import com.habitrpg.android.habitica.NotificationPublisher;
import com.habitrpg.android.habitica.R;
+import com.habitrpg.android.habitica.callbacks.ItemsCallback;
import com.habitrpg.android.habitica.events.DisplayFragmentEvent;
import com.habitrpg.android.habitica.events.DisplayTutorialEvent;
+import com.habitrpg.android.habitica.events.commands.EquipGearCommand;
import com.habitrpg.android.habitica.ui.TutorialView;
import com.habitrpg.android.habitica.callbacks.HabitRPGUserCallback;
import com.habitrpg.android.habitica.callbacks.TaskScoringCallback;
@@ -54,6 +56,7 @@ import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment;
import com.habitrpg.android.habitica.ui.fragments.GemsPurchaseFragment;
import com.habitrpg.android.habitica.userpicture.UserPicture;
import com.habitrpg.android.habitica.userpicture.UserPictureRunnable;
+import com.magicmicky.habitrpgwrapper.lib.models.Gear;
import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser;
import com.magicmicky.habitrpgwrapper.lib.models.SuppressedModals;
import com.magicmicky.habitrpgwrapper.lib.models.TaskDirection;
@@ -525,6 +528,15 @@ public class MainActivity extends BaseActivity implements HabitRPGUserCallback.O
mAPIHelper.apiService.updateUser(event.updateData, new HabitRPGUserCallback(this));
}
+ @Subscribe
+ public void onEvent(EquipGearCommand event) {
+ if (event.asCostume) {
+ this.mAPIHelper.apiService.equipCostume(event.gear.key, new ItemsCallback(this, this.user));
+ } else {
+ this.mAPIHelper.apiService.equipBattleGear(event.gear.key, new ItemsCallback(this, this.user));
+ }
+ }
+
@Subscribe
public void onEvent(UnlockPathCommand event) {
this.user.setBalance(this.user.getBalance() - event.balanceDiff);
diff --git a/Habitica/src/com/habitrpg/android/habitica/ui/adapter/inventory/EquipmentRecyclerViewAdapter.java b/Habitica/src/com/habitrpg/android/habitica/ui/adapter/inventory/EquipmentRecyclerViewAdapter.java
new file mode 100644
index 000000000..433c314d6
--- /dev/null
+++ b/Habitica/src/com/habitrpg/android/habitica/ui/adapter/inventory/EquipmentRecyclerViewAdapter.java
@@ -0,0 +1,96 @@
+package com.habitrpg.android.habitica.ui.adapter.inventory;
+
+import android.content.res.Resources;
+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.events.commands.EquipGearCommand;
+import com.magicmicky.habitrpgwrapper.lib.models.tasks.ItemData;
+import com.squareup.picasso.Picasso;
+
+import org.greenrobot.eventbus.EventBus;
+
+import java.util.List;
+
+import butterknife.Bind;
+import butterknife.ButterKnife;
+
+public class EquipmentRecyclerViewAdapter extends RecyclerView.Adapter {
+
+private List gearList;
+
+public String equippedGear;
+public Boolean isCostume;
+
+public void setGearList(List gearList) {
+ this.gearList = gearList;
+ this.notifyDataSetChanged();
+ }
+
+@Override
+public GearViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+
+ View view = LayoutInflater.from(parent.getContext())
+ .inflate(R.layout.gear_list_item, parent, false);
+
+ return new GearViewHolder(view);
+ }
+
+@Override
+public void onBindViewHolder(GearViewHolder holder, int position) {
+ holder.bind(gearList.get(position));
+ }
+
+@Override
+public int getItemCount() {
+ return gearList == null ? 0 : gearList.size();
+ }
+
+class GearViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
+
+ @Bind(R.id.gear_text)
+ TextView gearNameTextView;
+
+ @Bind(R.id.gear_notes)
+ TextView gearNotesTextView;
+
+ @Bind(R.id.gear_image)
+ ImageView imageView;
+
+ ItemData gear;
+
+ Resources resources;
+
+ public GearViewHolder(View itemView) {
+ super(itemView);
+
+ ButterKnife.bind(this, itemView);
+
+ resources = itemView.getResources();
+ itemView.setOnClickListener(this);
+ }
+
+ public void bind(ItemData gear) {
+ this.gear = gear;
+ this.gearNameTextView.setText(this.gear.text);
+ this.gearNotesTextView.setText(this.gear.notes);
+
+ Picasso.with(imageView.getContext())
+ .load("https://habitica-assets.s3.amazonaws.com/mobileApp/images/" + gear.key + ".png")
+ .into(imageView);
+ }
+
+ @Override
+ public void onClick(View v) {
+ EquipGearCommand command = new EquipGearCommand();
+ command.gear = this.gear;
+ command.asCostume = isCostume;
+ EventBus.getDefault().post(command);
+ }
+}
+}
diff --git a/Habitica/src/com/habitrpg/android/habitica/ui/fragments/inventory/equipment/EquipmentDetailFragment.java b/Habitica/src/com/habitrpg/android/habitica/ui/fragments/inventory/equipment/EquipmentDetailFragment.java
new file mode 100644
index 000000000..57561eed5
--- /dev/null
+++ b/Habitica/src/com/habitrpg/android/habitica/ui/fragments/inventory/equipment/EquipmentDetailFragment.java
@@ -0,0 +1,76 @@
+package com.habitrpg.android.habitica.ui.fragments.inventory.equipment;
+
+import android.databinding.DataBindingUtil;
+import android.os.Bundle;
+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.CustomizationRecyclerViewAdapter;
+import com.habitrpg.android.habitica.ui.adapter.inventory.EquipmentRecyclerViewAdapter;
+import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment;
+import com.habitrpg.android.habitica.ui.fragments.inventory.customization.AvatarCustomizationFragment;
+import com.habitrpg.android.habitica.ui.helpers.MarginDecoration;
+import com.magicmicky.habitrpgwrapper.lib.models.FAQArticle;
+import com.magicmicky.habitrpgwrapper.lib.models.Gear;
+import com.magicmicky.habitrpgwrapper.lib.models.tasks.ItemData;
+import com.raizlabs.android.dbflow.sql.builder.Condition;
+import com.raizlabs.android.dbflow.sql.language.Select;
+
+import java.util.List;
+
+import butterknife.Bind;
+import butterknife.ButterKnife;
+
+public class EquipmentDetailFragment extends BaseMainFragment {
+
+ public String type;
+ public String equippedGear;
+ public Boolean isCostume;
+
+ @Bind(R.id.recyclerView)
+ RecyclerView recyclerView;
+
+ EquipmentRecyclerViewAdapter adapter;
+
+
+ @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_recyclerview, container, false);
+
+ ButterKnife.bind(this, v);
+
+ this.adapter = new EquipmentRecyclerViewAdapter();
+ this.adapter.equippedGear = this.equippedGear;
+ this.adapter.isCostume = this.isCostume;
+ this.recyclerView.setLayoutManager(new LinearLayoutManager(activity));
+ this.recyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST));
+
+ this.recyclerView.setAdapter(this.adapter);
+
+ this.loadGear();
+
+ return v;
+ }
+
+ private void loadGear() {
+ if(user == null || adapter == null){
+ return;
+ }
+
+ List gear = new Select()
+ .from(ItemData.class)
+ .where(Condition.CombinedCondition.begin(Condition.column("type").eq(this.type))
+ .and(Condition.column("owned").eq(true))
+ ).queryList();
+
+ adapter.setGearList(gear);
+ }
+}
diff --git a/Habitica/src/com/habitrpg/android/habitica/ui/fragments/inventory/equipment/EquipmentOverviewFragment.java b/Habitica/src/com/habitrpg/android/habitica/ui/fragments/inventory/equipment/EquipmentOverviewFragment.java
new file mode 100644
index 000000000..71c5654f7
--- /dev/null
+++ b/Habitica/src/com/habitrpg/android/habitica/ui/fragments/inventory/equipment/EquipmentOverviewFragment.java
@@ -0,0 +1,212 @@
+package com.habitrpg.android.habitica.ui.fragments.inventory.equipment;
+
+import android.databinding.DataBindingUtil;
+import android.os.Bundle;
+import android.support.v4.view.ViewPager;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.CompoundButton;
+import android.widget.Switch;
+
+import com.habitrpg.android.habitica.ContentCache;
+import com.habitrpg.android.habitica.R;
+import com.habitrpg.android.habitica.databinding.FragmentEquipmentOverviewBinding;
+import com.habitrpg.android.habitica.events.commands.UpdateUserCommand;
+import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment;
+import com.habitrpg.android.habitica.ui.fragments.inventory.customization.AvatarCustomizationFragment;
+
+import org.greenrobot.eventbus.EventBus;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import butterknife.Bind;
+import butterknife.ButterKnife;
+
+public class EquipmentOverviewFragment extends BaseMainFragment {
+
+ FragmentEquipmentOverviewBinding viewBinding;
+
+ @Bind(R.id.battle_gear_group)
+ View battleGearGroupView;
+
+ @Bind(R.id.costume_group)
+ View costumeGroupView;
+
+ View battleGearHeadView;
+ View battleGearHeadAccessoryView;
+ View battleGearEyewearView;
+ View battleGearArmorView;
+ View battleGearBackView;
+ View battleGearBodyView;
+ View battleGearWeaponView;
+ View battleGearShieldView;
+
+ View costumeHeadView;
+ View costumeHeadAccessoryView;
+ View costumeEyewearView;
+ View costumeArmorView;
+ View costumeBackView;
+ View costumeBodyView;
+ View costumeWeaponView;
+ View costumeShieldView;
+
+ @Bind(R.id.costume_switch)
+ Switch costumeSwitch;
+
+ @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_equipment_overview, container, false);
+
+ viewBinding = DataBindingUtil.bind(v);
+ viewBinding.setCurrentBattleGear(this.user.getItems().getGear().getEquipped());
+ viewBinding.setCurrentCostume(this.user.getItems().getGear().getCostume());
+ viewBinding.setUsingCostume(this.user.getPreferences().getCostume());
+
+ ButterKnife.bind(this, v);
+
+ battleGearHeadView = battleGearGroupView.findViewById(R.id.outfit_head);
+ battleGearHeadAccessoryView = battleGearGroupView.findViewById(R.id.outfit_head_accessory);
+ battleGearEyewearView = battleGearGroupView.findViewById(R.id.outfit_Eyewear);
+ battleGearArmorView = battleGearGroupView.findViewById(R.id.outfit_Armor);
+ battleGearBackView = battleGearGroupView.findViewById(R.id.outfit_back);
+ battleGearBodyView = battleGearGroupView.findViewById(R.id.outfit_Body);
+ battleGearWeaponView = battleGearGroupView.findViewById(R.id.outfit_weapon);
+ battleGearShieldView = battleGearGroupView.findViewById(R.id.outfit_shield);
+
+ costumeHeadView = costumeGroupView.findViewById(R.id.outfit_head);
+ costumeHeadAccessoryView = costumeGroupView.findViewById(R.id.outfit_head_accessory);
+ costumeEyewearView = costumeGroupView.findViewById(R.id.outfit_Eyewear);
+ costumeArmorView = costumeGroupView.findViewById(R.id.outfit_Armor);
+ costumeBackView = costumeGroupView.findViewById(R.id.outfit_back);
+ costumeBodyView = costumeGroupView.findViewById(R.id.outfit_Body);
+ costumeWeaponView = costumeGroupView.findViewById(R.id.outfit_weapon);
+ costumeShieldView = costumeGroupView.findViewById(R.id.outfit_shield);
+
+ battleGearHeadView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ displayEquipmentDetailList("head", user.getItems().getGear().getEquipped().getHead(), false);
+ }
+ });
+ battleGearHeadAccessoryView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ displayEquipmentDetailList("headAccessory", user.getItems().getGear().getEquipped().getHeadAccessory(), false);
+ }
+ });
+ battleGearEyewearView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ displayEquipmentDetailList("eyewear", user.getItems().getGear().getEquipped().getEyeWear(), false);
+ }
+ });
+ battleGearArmorView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ displayEquipmentDetailList("armor", user.getItems().getGear().getEquipped().getArmor(), false);
+ }
+ });
+ battleGearBackView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ displayEquipmentDetailList("back", user.getItems().getGear().getEquipped().getBack(), false);
+ }
+ });
+ battleGearBodyView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ displayEquipmentDetailList("body", user.getItems().getGear().getEquipped().getBody(), false);
+ }
+ });
+ battleGearWeaponView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ displayEquipmentDetailList("weapon", user.getItems().getGear().getEquipped().getWeapon(), false);
+ }
+ });
+ battleGearShieldView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ displayEquipmentDetailList("shield", user.getItems().getGear().getEquipped().getShield(), false);
+ }
+ });
+
+
+ costumeHeadView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ displayEquipmentDetailList("head", user.getItems().getGear().getEquipped().getHead(), true);
+ }
+ });
+ costumeHeadAccessoryView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ displayEquipmentDetailList("headAccessory", user.getItems().getGear().getEquipped().getHeadAccessory(), true);
+ }
+ });
+ costumeEyewearView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ displayEquipmentDetailList("eyewear", user.getItems().getGear().getEquipped().getEyeWear(), true);
+ }
+ });
+ costumeArmorView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ displayEquipmentDetailList("armor", user.getItems().getGear().getEquipped().getArmor(), true);
+ }
+ });
+ costumeBackView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ displayEquipmentDetailList("back", user.getItems().getGear().getEquipped().getBack(), true);
+ }
+ });
+ costumeBodyView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ displayEquipmentDetailList("body", user.getItems().getGear().getEquipped().getBody(), true);
+ }
+ });
+ costumeWeaponView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ displayEquipmentDetailList("weapon", user.getItems().getGear().getEquipped().getWeapon(), true);
+ }
+ });
+ costumeShieldView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ displayEquipmentDetailList("shield", user.getItems().getGear().getEquipped().getShield(), true);
+ }
+ });
+
+ this.costumeSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+ UpdateUserCommand command = new UpdateUserCommand();
+ Map updateData = new HashMap<>();
+ updateData.put("preferences.costume", isChecked);
+ command.updateData = updateData;
+
+ EventBus.getDefault().post(command);
+ }
+ });
+
+ return v;
+ }
+
+ private void displayEquipmentDetailList(String type, String equipped, Boolean isCostume) {
+ EquipmentDetailFragment fragment = new EquipmentDetailFragment();
+ fragment.type = type;
+ fragment.isCostume = isCostume;
+ fragment.equippedGear = equipped;
+ activity.displayFragment(fragment);
+ }
+
+}
diff --git a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java
index 632aa1040..fc2daed74 100644
--- a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java
+++ b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java
@@ -1,10 +1,13 @@
package com.magicmicky.habitrpgwrapper.lib.api;
+import com.habitrpg.android.habitica.callbacks.ItemsCallback;
import com.habitrpg.android.habitica.ui.activities.SetupActivity;
import com.magicmicky.habitrpgwrapper.lib.models.ChatMessage;
import com.magicmicky.habitrpgwrapper.lib.models.ContentResult;
+import com.magicmicky.habitrpgwrapper.lib.models.Gear;
import com.magicmicky.habitrpgwrapper.lib.models.Group;
import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser;
+import com.magicmicky.habitrpgwrapper.lib.models.Items;
import com.magicmicky.habitrpgwrapper.lib.models.PostChatMessageResult;
import com.magicmicky.habitrpgwrapper.lib.models.Status;
import com.magicmicky.habitrpgwrapper.lib.models.Tag;
@@ -50,6 +53,12 @@ public interface ApiService {
@GET("/user/inventory/buy")
void getInventoryBuyableGear(Callback> buyableGearCallback);
+ @POST("/user/inventory/equip/equipped/{key}")
+ void equipBattleGear(@Path("key") String itemKey, Callback gearCallback);
+
+ @POST("/user/inventory/equip/costume/{key}")
+ void equipCostume(@Path("key") String itemKey, Callback gearCallback);
+
@POST("/user/inventory/buy/{key}")
void buyItem(@Path("key") String itemKey, Callback voidCallback);
diff --git a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/ContentGear.java b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/ContentGear.java
index 2d53d6b65..d8da28429 100644
--- a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/ContentGear.java
+++ b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/ContentGear.java
@@ -3,9 +3,10 @@ package com.magicmicky.habitrpgwrapper.lib.models;
import com.magicmicky.habitrpgwrapper.lib.models.tasks.ItemData;
import java.util.HashMap;
+import java.util.List;
public class ContentGear{
- public HashMap flat;
+ public List flat;
}
diff --git a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/Gear.java b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/Gear.java
index f72f3dfef..213e50775 100644
--- a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/Gear.java
+++ b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/Gear.java
@@ -1,6 +1,7 @@
package com.magicmicky.habitrpgwrapper.lib.models;
import com.habitrpg.android.habitica.HabitDatabase;
+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;
@@ -9,6 +10,8 @@ import com.raizlabs.android.dbflow.annotation.PrimaryKey;
import com.raizlabs.android.dbflow.annotation.Table;
import com.raizlabs.android.dbflow.structure.BaseModel;
+import java.util.List;
+
/**
* Created by viirus on 20/07/15.
*/
@@ -33,6 +36,8 @@ public class Gear extends BaseModel {
foreignColumnName = "user_id")})
private Outfit costume;
+ public List owned;
+
public Outfit getCostume() {
return costume;
}
diff --git a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/tasks/ItemData.java b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/tasks/ItemData.java
index 5159b1502..870186ed1 100644
--- a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/tasks/ItemData.java
+++ b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/tasks/ItemData.java
@@ -42,4 +42,7 @@ public class ItemData extends BaseModel {
@Column
@SerializedName("int")
public float _int;
+
+ @Column
+ public Boolean owned;
}
diff --git a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/utils/CustomizationDeserializer.java b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/utils/CustomizationDeserializer.java
index f87deec4d..5f086cac0 100644
--- a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/utils/CustomizationDeserializer.java
+++ b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/utils/CustomizationDeserializer.java
@@ -28,9 +28,6 @@ import java.util.Arrays;
import java.util.List;
import java.util.Map;
-/**
- * Created by viirus on 14/01/16.
- */
public class CustomizationDeserializer implements JsonDeserializer> {
@Override
diff --git a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/utils/ItemDataListDeserializer.java b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/utils/ItemDataListDeserializer.java
new file mode 100644
index 000000000..eb5a5558b
--- /dev/null
+++ b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/utils/ItemDataListDeserializer.java
@@ -0,0 +1,63 @@
+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.Customization;
+import com.magicmicky.habitrpgwrapper.lib.models.tasks.ItemData;
+import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task;
+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.builder.Condition;
+import com.raizlabs.android.dbflow.sql.language.Select;
+
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+public class ItemDataListDeserializer implements JsonDeserializer> {
+ @Override
+ public List deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
+ JsonObject object = json.getAsJsonObject();
+ List vals = new ArrayList<>();
+
+ List existingItems = new Select().from(ItemData.class).queryList();
+
+ for (ItemData item : existingItems) {
+ if(object.has(item.key)) {
+ JsonElement itemObject = object.get(item.key);
+
+ if (itemObject.isJsonObject()) {
+ ItemData parsedItem = context.deserialize(itemObject.getAsJsonObject(), ItemData.class);
+ item.text = parsedItem.text;
+ item.value = parsedItem.value;
+ item.type = parsedItem.type;
+ item.klass = parsedItem.klass;
+ item.index = parsedItem.index;
+ item.notes = parsedItem.notes;
+ item.con = parsedItem.con;
+ item.str = parsedItem.str;
+ item.per = parsedItem.per;
+ item._int = parsedItem._int;
+ } else {
+ item.owned = itemObject.getAsBoolean();
+ }
+ vals.add(item);
+ object.remove(item.key);
+ }
+ }
+
+ for (Map.Entry entry : json.getAsJsonObject().entrySet()) {
+ ItemData item = context.deserialize(entry.getValue(), ItemData.class);
+ vals.add(item);
+ }
+ TransactionManager.getInstance().addTransaction(new SaveModelTransaction<>(ProcessModelInfo.withModels(vals)));
+
+ return vals;
+ }
+}