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