allow changing equipment

This commit is contained in:
Phillip Thelen 2016-03-10 14:05:32 +01:00
parent 9c8e1be9d4
commit 11eb098d35
25 changed files with 729 additions and 21 deletions

View file

@ -0,0 +1 @@
ALTER TABLE ItemData ADD COLUMN owned bool;

View file

@ -0,0 +1,74 @@
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:bind="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<import type="com.magicmicky.habitrpgwrapper.lib.models.Outfit" />
<variable name="categorytitle" type="String"/>
<variable name="outfit" type="Outfit"/>
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:text="@{categorytitle}"
android:textAppearance="?android:attr/textAppearanceMedium" />
<android.support.v7.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/card_horizontal_padding">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:divider="?android:listDivider"
android:showDividers="middle">
<include layout="@layout/item_image_row"
android:id="@+id/outfit_head"
bind:title="@{@string/outfit_head}"
bind:value="@{outfit.getHead}"
bind:imageNamed='@{outfit.getHead}'/>
<include layout="@layout/item_image_row"
android:id="@+id/outfit_head_accessory"
bind:title="@{@string/outfit_headAccessory}"
bind:value="@{outfit.getHeadAccessory}"
bind:imageNamed='@{outfit.getHeadAccessory}'/>
<include layout="@layout/item_image_row"
android:id="@+id/outfit_Eyewear"
bind:title="@{@string/outfit_eyewear}"
bind:value="@{outfit.getEyeWear}"
bind:imageNamed='@{outfit.getEyeWear}'/>
<include layout="@layout/item_image_row"
android:id="@+id/outfit_Armor"
bind:title="@{@string/outfit_armor}"
bind:value="@{outfit.getArmor}"
bind:imageNamed='@{outfit.getArmor}'/>
<include layout="@layout/item_image_row"
android:id="@+id/outfit_back"
bind:title="@{@string/outfit_back}"
bind:value="@{outfit.getBack}"
bind:imageNamed='@{outfit.getBack}'/>
<include layout="@layout/item_image_row"
android:id="@+id/outfit_Body"
bind:title="@{@string/outfit_body}"
bind:value="@{outfit.getBody}"
bind:imageNamed='@{outfit.getBody}'/>
<include layout="@layout/item_image_row"
android:id="@+id/outfit_weapon"
bind:title="@{@string/outfit_weapon}"
bind:value="@{outfit.getWeapon}"
bind:imageNamed='@{outfit.getWeapon}'/>
<include layout="@layout/item_image_row"
android:id="@+id/outfit_shield"
bind:title="@{@string/outfit_shield}"
bind:value="@{outfit.getShield}"
bind:imageNamed='@{outfit.getShield}'/>
</LinearLayout>
</android.support.v7.widget.CardView>
</LinearLayout>
</layout>

View file

@ -71,12 +71,12 @@
android:layout_marginEnd="8dp"
android:entries="@array/avatar_sizes"/>
</LinearLayout>
<include layout="@layout/avatar_overview_card"
<include layout="@layout/item_image_row"
android:id="@+id/avatar_shirt"
bind:title="@{@string/avatar_shirt}"
bind:value="@{preferences.getShirt}"
bind:imageNamed='@{preferences.getSize + "_shirt_" + preferences.getShirt}'/>
<include layout="@layout/avatar_overview_card"
<include layout="@layout/item_image_row"
android:id="@+id/avatar_skin"
bind:title="@{@string/avatar_skin}"
bind:value="@{preferences.getSkin}"
@ -100,32 +100,32 @@
android:orientation="vertical"
android:divider="?android:listDivider"
android:showDividers="middle">
<include layout="@layout/avatar_overview_card"
<include layout="@layout/item_image_row"
android:id="@+id/avatar_hair_color"
bind:title="@{@string/avatar_color}"
bind:value="@{preferences.getHair.getColor}"
bind:imageNamed='@{"hair_bangs_1_" + preferences.getHair.getColor}' />
<include layout="@layout/avatar_overview_card"
<include layout="@layout/item_image_row"
android:id="@+id/avatar_hair_base"
bind:title="@{@string/avatar_base}"
bind:valueInt="@{preferences.getHair.getBase}"
bind:imageNamed='@{preferences.getHair.getBase == 0 ? null : "hair_base_" + preferences.getHair.getBase + "_" + preferences.getHair.getColor}' />
<include layout="@layout/avatar_overview_card"
<include layout="@layout/item_image_row"
android:id="@+id/avatar_hair_bangs"
bind:title="@{@string/avatar_bangs}"
bind:valueInt="@{preferences.getHair.getBangs}"
bind:imageNamed='@{preferences.getHair.getBangs == 0 ? null : "hair_bangs_" + preferences.getHair.getBangs + "_" + preferences.getHair.getColor}' />
<include layout="@layout/avatar_overview_card"
<include layout="@layout/item_image_row"
android:id="@+id/avatar_hair_flower"
bind:title="@{@string/avatar_flower}"
bind:valueInt="@{preferences.getHair.getFlower}"
bind:imageNamed='@{preferences.getHair.getFlower == 0 ? null : "hair_flower_" + preferences.getHair.getFlower}' />
<include layout="@layout/avatar_overview_card"
<include layout="@layout/item_image_row"
android:id="@+id/avatar_hair_beard"
bind:title="@{@string/avatar_beard}"
bind:valueInt="@{preferences.getHair.getBeard}"
bind:imageNamed='@{preferences.getHair.getBeard == 0 ? null : "hair_beard_" + preferences.getHair.getBeard + "_" + preferences.getHair.getColor}' />
<include layout="@layout/avatar_overview_card"
<include layout="@layout/item_image_row"
android:id="@+id/avatar_hair_mustache"
bind:title="@{@string/avatar_mustache}"
bind:valueInt="@{preferences.getHair.getMustache}"

View file

@ -0,0 +1,61 @@
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:bind="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<import type="com.magicmicky.habitrpgwrapper.lib.models.Outfit" />
<import type="android.view.View" />
<variable
name="currentBattleGear"
type="Outfit" />
<variable
name="currentCostume"
type="Outfit" />
<variable
name="usingCostume"
type="Boolean" />
</data>
<android.support.v4.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbarSize="3dp"
android:scrollbarThumbVertical="@color/md_grey_500"
android:scrollbars="vertical"
android:paddingTop="@dimen/row_padding"
android:paddingBottom="@dimen/row_padding" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<include layout="@layout/equipment_overview_list"
android:id="@+id/battle_gear_group"
bind:categorytitle="@{@string/battle_gear}"
bind:outfit="@{currentBattleGear}"/>
<include layout="@layout/equipment_overview_list"
android:id="@+id/costume_group"
bind:categorytitle="@{@string/costume}"
bind:outfit="@{currentCostume}"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/row_padding">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/wear_costume"/>
<Switch
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/costume_switch"
android:checked="@{usingCostume}"/>
</LinearLayout>
</LinearLayout>
</android.support.v4.widget.NestedScrollView>
</layout>

View file

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/row_padding"
android:background="@drawable/selection_highlight">
<ImageView
android:layout_width="@dimen/gear_image_size"
android:layout_height="@dimen/gear_image_size"
android:id="@+id/gear_image" />
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/gear_text"
android:textStyle="bold" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/gear_notes" />
</LinearLayout>
</LinearLayout>

View file

@ -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">
<ImageView

View file

@ -2,7 +2,7 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="8dp">
android:padding="@dimen/row_padding">
<LinearLayout
android:orientation="horizontal"

View file

@ -55,4 +55,6 @@
<dimen name="avatar_small_width">114dp</dimen>
<dimen name="avatar_small_height">90dp</dimen>
<dimen name="customization_width">100dp</dimen>
<dimen name="gear_image_size">90dp</dimen>
<dimen name="row_padding">8dp</dimen>
</resources>

View file

@ -241,4 +241,15 @@ To start, which parts of your life do you want to improve?</string>
<string name="todo_due" formatted="false">Due: %s</string>
<string name="daily_streak" formatted="false">current streak: %d</string>
<string name="todo_has_duedate">Task has Due Date</string>
<string name="battle_gear">Battle Gear</string>
<string name="costume">Costume</string>
<string name="outfit_head">Head</string>
<string name="outfit_headAccessory">Head Accessory</string>
<string name="outfit_eyewear">Eyewear</string>
<string name="outfit_armor">Armor</string>
<string name="outfit_back">Back</string>
<string name="outfit_body">Body</string>
<string name="outfit_shield">Shield</string>
<string name="outfit_weapon">Weapon</string>
<string name="wear_costume">Wear Costume</string>
</resources>

View file

@ -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<List<Customization>>() {}.getType();
Type tutorialStepListType = new TypeToken<List<TutorialStep>>() {}.getType();
Type faqArticleListType = new TypeToken<List<FAQArticle>>() {}.getType();
Type itemDataListType = new TypeToken<List<ItemData>>() {}.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();

View file

@ -106,10 +106,10 @@ public class ContentCache {
} else if (searchKey == "armoire") {
searchedItem = (T) contentResult.armoire;
} else {
Collection<ItemData> itemList = contentResult.gear.flat.values();
Collection<ItemData> 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<T> resultList = new ArrayList<T>();
List<ItemData> itemList = new ArrayList<ItemData>(contentResult.gear.flat.values());
List<ItemData> itemList = new ArrayList<ItemData>(contentResult.gear.flat);
itemList.add(contentResult.potion);
itemList.add(contentResult.armoire);
@ -181,7 +181,7 @@ public class ContentCache {
}
}
Collection<ItemData> itemList = new ArrayList<>(contentResult.gear.flat.values());
Collection<ItemData> itemList = new ArrayList<>(contentResult.gear.flat);
itemList.add(contentResult.armoire);
itemList.add(contentResult.potion);

View file

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

View file

@ -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<Items> {
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();
}
}

View file

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

View file

@ -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;

View file

@ -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);

View file

@ -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<EquipmentRecyclerViewAdapter.GearViewHolder> {
private List<ItemData> gearList;
public String equippedGear;
public Boolean isCostume;
public void setGearList(List<ItemData> 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);
}
}
}

View file

@ -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<ItemData> 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);
}
}

View file

@ -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<String, Object> 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);
}
}

View file

@ -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<List<ItemData>> buyableGearCallback);
@POST("/user/inventory/equip/equipped/{key}")
void equipBattleGear(@Path("key") String itemKey, Callback<Items> gearCallback);
@POST("/user/inventory/equip/costume/{key}")
void equipCostume(@Path("key") String itemKey, Callback<Items> gearCallback);
@POST("/user/inventory/buy/{key}")
void buyItem(@Path("key") String itemKey, Callback<Void> voidCallback);

View file

@ -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<String, ItemData> flat;
public List<ItemData> flat;
}

View file

@ -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<ItemData> owned;
public Outfit getCostume() {
return costume;
}

View file

@ -42,4 +42,7 @@ public class ItemData extends BaseModel {
@Column
@SerializedName("int")
public float _int;
@Column
public Boolean owned;
}

View file

@ -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<List<Customization>> {
@Override

View file

@ -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<List<ItemData>> {
@Override
public List<ItemData> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
JsonObject object = json.getAsJsonObject();
List<ItemData> vals = new ArrayList<>();
List<ItemData> 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<String,JsonElement> 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;
}
}