diff --git a/Habitica/res/layout/menu_bottom_sheet.xml b/Habitica/res/layout/menu_bottom_sheet.xml index 3509b8411..94fef211a 100644 --- a/Habitica/res/layout/menu_bottom_sheet.xml +++ b/Habitica/res/layout/menu_bottom_sheet.xml @@ -1,6 +1,7 @@ - + android:layout_height="match_parent" + style="@style/BottomMenu" + android:clickable="false"> \ No newline at end of file diff --git a/Habitica/res/layout/menu_bottom_sheet_item.xml b/Habitica/res/layout/menu_bottom_sheet_item.xml index a751f76bb..3fe3c3490 100644 --- a/Habitica/res/layout/menu_bottom_sheet_item.xml +++ b/Habitica/res/layout/menu_bottom_sheet_item.xml @@ -2,9 +2,11 @@ + style="@style/BottomMenuItem" + android:clickable="true"> + android:layout_height="wrap_content" + style="@style/BottomMenuItemText" /> \ No newline at end of file diff --git a/Habitica/res/values/dimens.xml b/Habitica/res/values/dimens.xml index c5f964bed..930df1dcc 100644 --- a/Habitica/res/values/dimens.xml +++ b/Habitica/res/values/dimens.xml @@ -67,4 +67,5 @@ 12sp 4dp 120dp + 18dp \ No newline at end of file diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml index 4fe0e9123..426796136 100644 --- a/Habitica/res/values/strings.xml +++ b/Habitica/res/values/strings.xml @@ -287,4 +287,9 @@ To start, which parts of your life do you want to improve? Open the Armoire to randomly receive special Equipment, Experience, or food! Equipment pieces remaining: %d You\'ve found the last piece of rare Equipment in the Enchanted Armoire. The Armoire will have new Equipment in the first week of every month. Until then, keep clicking for Experience and Food! + Sell (%s Gold) + Hatch with potion + Feed to pet + Hatch egg + Invite party diff --git a/Habitica/res/values/styles.xml b/Habitica/res/values/styles.xml index 388fe0de6..41add973c 100644 --- a/Habitica/res/values/styles.xml +++ b/Habitica/res/values/styles.xml @@ -156,4 +156,18 @@ @color/brand @color/white + + + + + + \ No newline at end of file diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/APIHelper.java b/Habitica/src/main/java/com/habitrpg/android/habitica/APIHelper.java index 510697ec5..da8529e03 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/APIHelper.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/APIHelper.java @@ -321,6 +321,11 @@ public class APIHelper implements ErrorHandler, Profiler { return cause; } else if (status == 404 && cause.getUrl().endsWith("party/chat")) { return cause; + } else if (status == 400) { + if(res != null && res.err != null && !res.err.isEmpty()) { + showConnectionProblemDialog("", res.err); + } + return cause; } } this.showConnectionProblemDialog(R.string.internal_error_api); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/events/commands/InvitePartyToQuestCommand.java b/Habitica/src/main/java/com/habitrpg/android/habitica/events/commands/InvitePartyToQuestCommand.java new file mode 100644 index 000000000..bdc586191 --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/events/commands/InvitePartyToQuestCommand.java @@ -0,0 +1,6 @@ +package com.habitrpg.android.habitica.events.commands; + +public class InvitePartyToQuestCommand { + + public String questKey; +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/events/commands/SellItemCommand.java b/Habitica/src/main/java/com/habitrpg/android/habitica/events/commands/SellItemCommand.java new file mode 100644 index 000000000..075025f68 --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/events/commands/SellItemCommand.java @@ -0,0 +1,9 @@ +package com.habitrpg.android.habitica.events.commands; + +import com.magicmicky.habitrpgwrapper.lib.models.inventory.Item; + +public class SellItemCommand { + + public Item item; + +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.java index 95e7092c4..d8a6f575b 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.java @@ -43,8 +43,10 @@ import com.habitrpg.android.habitica.events.ToggledInnStateEvent; import com.habitrpg.android.habitica.events.commands.BuyRewardCommand; import com.habitrpg.android.habitica.events.commands.DeleteTaskCommand; import com.habitrpg.android.habitica.events.commands.EquipGearCommand; +import com.habitrpg.android.habitica.events.commands.InvitePartyToQuestCommand; import com.habitrpg.android.habitica.events.commands.OpenGemPurchaseFragmentCommand; import com.habitrpg.android.habitica.events.commands.OpenMenuItemCommand; +import com.habitrpg.android.habitica.events.commands.SellItemCommand; import com.habitrpg.android.habitica.events.commands.UnlockPathCommand; import com.habitrpg.android.habitica.events.commands.UpdateUserCommand; import com.habitrpg.android.habitica.ui.AvatarWithBarsViewModel; @@ -573,6 +575,7 @@ public class MainActivity extends BaseActivity implements HabitRPGUserCallback.O @Subscribe public void onEvent(UnlockPathCommand event) { this.user.setBalance(this.user.getBalance() - event.balanceDiff); + this.setUserData(false); mAPIHelper.apiService.unlockPath(event.path, new UnlockCallback(this, this.user)); } @@ -675,6 +678,26 @@ public class MainActivity extends BaseActivity implements HabitRPGUserCallback.O this.displayFragment(event.fragment); } + @Subscribe + public void onEvent(SellItemCommand event) { + String itemType = ""; + this.mAPIHelper.apiService.sellItem(event.item.getType(), event.item.getKey(), new Callback() { + @Override + public void success(HabitRPGUser habitRPGUser, Response response) { + user.setItems(habitRPGUser.getItems()); + user.save(); + user.setStats(habitRPGUser.getStats()); + setUserData(false); + } + + @Override + public void failure(RetrofitError error) { + + } + }); + } + + // endregion @Override diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/ItemRecyclerAdapter.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/ItemRecyclerAdapter.java index 41e7c4496..d613f450f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/ItemRecyclerAdapter.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/ItemRecyclerAdapter.java @@ -3,22 +3,18 @@ package com.habitrpg.android.habitica.ui.adapter.inventory; import android.content.Context; import android.content.res.Resources; import android.databinding.DataBindingUtil; -import android.support.design.widget.BottomSheetDialog; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.Button; -import android.widget.LinearLayout; -import android.widget.TextView; import com.habitrpg.android.habitica.R; -import com.habitrpg.android.habitica.databinding.ItemImageRowBinding; import com.habitrpg.android.habitica.databinding.ItemItemBinding; -import com.habitrpg.android.habitica.events.commands.UseSkillCommand; -import com.magicmicky.habitrpgwrapper.lib.models.Group; -import com.magicmicky.habitrpgwrapper.lib.models.Quest; -import com.magicmicky.habitrpgwrapper.lib.models.Skill; +import com.habitrpg.android.habitica.events.commands.InvitePartyToQuestCommand; +import com.habitrpg.android.habitica.events.commands.SellItemCommand; +import com.habitrpg.android.habitica.ui.menu.BottomSheetMenu; +import com.habitrpg.android.habitica.ui.menu.BottomSheetMenuItem; +import com.habitrpg.android.habitica.ui.menu.BottomSheetMenuSelectionRunnable; import com.magicmicky.habitrpgwrapper.lib.models.inventory.Egg; import com.magicmicky.habitrpgwrapper.lib.models.inventory.Food; import com.magicmicky.habitrpgwrapper.lib.models.inventory.HatchingPotion; @@ -26,18 +22,14 @@ import com.magicmicky.habitrpgwrapper.lib.models.inventory.Item; import com.magicmicky.habitrpgwrapper.lib.models.inventory.QuestContent; import org.greenrobot.eventbus.EventBus; -import org.w3c.dom.Text; import java.util.List; -import butterknife.Bind; -import butterknife.ButterKnife; - public class ItemRecyclerAdapter extends RecyclerView.Adapter { private List itemList; - public Double mana; + public Boolean isHatching; public Context context; @@ -46,12 +38,6 @@ public class ItemRecyclerAdapter extends RecyclerView.Adapter 1) { + item.setOwned(item.getOwned()-1); + notifyItemChanged(getAdapterPosition()); + } else { + itemList.remove(getAdapterPosition()); + notifyItemRemoved(getAdapterPosition()); + } + + return; + } + if (item instanceof Egg) { + } else if (item instanceof Food) { + } else if (item instanceof HatchingPotion) { + } else if (item instanceof QuestContent) { + InvitePartyToQuestCommand event = new InvitePartyToQuestCommand(); + event.questKey = item.getKey(); + EventBus.getDefault().post(event); + } + } + }); + menu.show(); + } } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemRecyclerFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemRecyclerFragment.java index 185780805..155d5956b 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemRecyclerFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemRecyclerFragment.java @@ -28,6 +28,7 @@ public class ItemRecyclerFragment extends BaseFragment { public RecyclerView recyclerView; public ItemRecyclerAdapter adapter; public String itemType; + public Boolean isHatching; private static final String ITEM_TYPE_KEY = "CLASS_TYPE_KEY"; LinearLayoutManager layoutManager = null; @@ -54,6 +55,7 @@ public class ItemRecyclerFragment extends BaseFragment { if (adapter == null) { adapter = new ItemRecyclerAdapter(); adapter.context = this.getActivity(); + adapter.isHatching = this.isHatching; recyclerView.setAdapter(adapter); this.loadItems(); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemsFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemsFragment.java index 11148bc24..30ec09c9c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemsFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemsFragment.java @@ -10,9 +10,20 @@ import android.view.ViewGroup; import com.habitrpg.android.habitica.ContentCache; import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.events.commands.InvitePartyToQuestCommand; +import com.habitrpg.android.habitica.events.commands.OpenMenuItemCommand; +import com.habitrpg.android.habitica.ui.MainDrawerBuilder; import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment; +import com.magicmicky.habitrpgwrapper.lib.models.Group; import com.magicmicky.habitrpgwrapper.lib.models.UserParty; +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; + +import retrofit.Callback; +import retrofit.RetrofitError; +import retrofit.client.Response; + public class ItemsFragment extends BaseMainFragment { public ViewPager viewPager; @@ -67,6 +78,7 @@ public class ItemsFragment extends BaseMainFragment { break; } } + fragment.isHatching = false; return fragment; } @@ -94,4 +106,21 @@ public class ItemsFragment extends BaseMainFragment { tabLayout.setupWithViewPager(viewPager); } + + @Subscribe + public void onEvent(InvitePartyToQuestCommand event) { + this.mAPIHelper.apiService.inviteToQuest("party", event.questKey, new Callback() { + @Override + public void success(Group group, Response response) { + OpenMenuItemCommand event = new OpenMenuItemCommand(); + event.identifier = MainDrawerBuilder.SIDEBAR_PARTY; + EventBus.getDefault().post(event); + } + + @Override + public void failure(RetrofitError error) { + + } + }); + } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/menu/BottomSheetMenu.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/menu/BottomSheetMenu.java new file mode 100644 index 000000000..e7df06cac --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/menu/BottomSheetMenu.java @@ -0,0 +1,61 @@ +package com.habitrpg.android.habitica.ui.menu; + +import android.content.Context; +import android.support.design.widget.BottomSheetDialog; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.habitrpg.android.habitica.R; + +import org.w3c.dom.Text; + +import java.util.ArrayList; + +public class BottomSheetMenu extends BottomSheetDialog implements View.OnClickListener { + + private LayoutInflater inflater; + private Context context; + private LinearLayout contentView; + private BottomSheetMenuSelectionRunnable runnable; + + public BottomSheetMenu(Context context) { + super(context); + this.context = context; + this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + this.contentView = (LinearLayout)inflater.inflate(R.layout.menu_bottom_sheet, null); + this.setContentView(this.contentView); + } + + public void setSelectionRunnable(BottomSheetMenuSelectionRunnable runnable) { + this.runnable = runnable; + } + + public void addMenuItems(BottomSheetMenuItem... menuItems) { + for (BottomSheetMenuItem menuItem : menuItems) { + this.addMenuItem(menuItem); + } + } + + public void addMenuItem(BottomSheetMenuItem menuItem) { + View item = menuItem.inflate(this.context, this.inflater, this.contentView); + item.setOnClickListener(this); + this.contentView.addView(item); + } + + public void removeMenuItem(Integer index) { + this.contentView.removeViewAt(index); + } + + @Override + public void onClick(View v) { + if (this.runnable != null) { + Integer index = this.contentView.indexOfChild(v); + if (index != -1) { + this.runnable.selectedItemAt(index); + this.dismiss(); + } + } + } +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/menu/BottomSheetMenuItem.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/menu/BottomSheetMenuItem.java new file mode 100644 index 000000000..d95a8eda6 --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/menu/BottomSheetMenuItem.java @@ -0,0 +1,37 @@ +package com.habitrpg.android.habitica.ui.menu; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.FrameLayout; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.habitrpg.android.habitica.R; + +public class BottomSheetMenuItem { + + private String title; + private Boolean isDestructive; + + public BottomSheetMenuItem(String title) { + this.title = title; + this.isDestructive = false; + } + + public BottomSheetMenuItem(String title, Boolean isDestructive) { + this.title = title; + this.isDestructive = isDestructive; + } + + public View inflate(Context context, LayoutInflater inflater, ViewGroup contentView) { + LinearLayout menuItemView = (LinearLayout)inflater.inflate(R.layout.menu_bottom_sheet_item, contentView, false); + TextView textView = (TextView)menuItemView.findViewById(R.id.textView); + textView.setText(this.title); + if (this.isDestructive) { + textView.setTextColor(context.getResources().getColor(R.color.worse_50)); + } + return menuItemView; + } +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/menu/BottomSheetMenuSelectionRunnable.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/menu/BottomSheetMenuSelectionRunnable.java new file mode 100644 index 000000000..c912c50e6 --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/menu/BottomSheetMenuSelectionRunnable.java @@ -0,0 +1,9 @@ +package com.habitrpg.android.habitica.ui.menu; + +import android.graphics.Bitmap; + +public interface BottomSheetMenuSelectionRunnable { + + void selectedItemAt(Integer index); + +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/userpicture/UserPictureRunnable.java b/Habitica/src/main/java/com/habitrpg/android/habitica/userpicture/UserPictureRunnable.java index d35d8a718..ea8797492 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/userpicture/UserPictureRunnable.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/userpicture/UserPictureRunnable.java @@ -2,9 +2,6 @@ package com.habitrpg.android.habitica.userpicture; import android.graphics.Bitmap; -/** - * Created by viirus on 16/11/15. - */ public interface UserPictureRunnable { void run(Bitmap avatarBitmap); diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java index 66879b162..03583cf3d 100644 --- a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java +++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java @@ -60,6 +60,9 @@ public interface ApiService { @POST("/user/inventory/buy/{key}") void buyItem(@Path("key") String itemKey, Callback voidCallback); + @POST("/user/inventory/sell/{type}/{key}") + void sellItem(@Path("type") String itemType, @Path("key") String itemKey, Callback voidCallback); + @POST("/user/unlock") void unlockPath(@Query("path") String path, Callback unlockResponseCallback); @@ -164,6 +167,8 @@ public interface ApiService { @POST("/groups/{gid}/questAccept?force=true") void forceStartQuest(@Path("gid") String groupId, @Body Group group, Callback cb); + @POST("/groups/{gid}/questAccept") + void inviteToQuest(@Path("gid") String groupId, @Query("key") String questKey, Callback cb); @POST("/groups/{gid}/questAbort") void abortQuest(@Path("gid") String groupId, Callback cb); diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/Items.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/Items.java index be546ea6c..be314b90d 100644 --- a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/Items.java +++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/Items.java @@ -12,8 +12,12 @@ import com.raizlabs.android.dbflow.annotation.ForeignKeyReference; import com.raizlabs.android.dbflow.annotation.NotNull; import com.raizlabs.android.dbflow.annotation.PrimaryKey; import com.raizlabs.android.dbflow.annotation.Table; +import com.raizlabs.android.dbflow.runtime.TransactionManager; +import com.raizlabs.android.dbflow.runtime.transaction.process.ProcessModelInfo; +import com.raizlabs.android.dbflow.runtime.transaction.process.SaveModelTransaction; import com.raizlabs.android.dbflow.structure.BaseModel; +import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; @@ -164,6 +168,13 @@ public class Items extends BaseModel { public void save() { gear.user_id = user_id; + List items = new ArrayList<>(); + items.addAll(this.quests); + items.addAll(this.eggs); + items.addAll(this.food); + items.addAll(this.hatchingPotions); + TransactionManager.getInstance().addTransaction(new SaveModelTransaction<>(ProcessModelInfo.withModels(items))); + super.save(); } } diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/inventory/Egg.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/inventory/Egg.java index 8cda37c94..12ac796b0 100644 --- a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/inventory/Egg.java +++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/inventory/Egg.java @@ -46,4 +46,9 @@ public class Egg extends Item { public void setStableTotal(Integer stableTotal) { this.stableTotal = stableTotal; } + + @Override + public String getType() { + return "eggs"; + } } diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/inventory/Food.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/inventory/Food.java index b4460f8ab..dd796aa16 100644 --- a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/inventory/Food.java +++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/inventory/Food.java @@ -36,4 +36,8 @@ public class Food extends Item { public void setCanDrop(Boolean canDrop) { this.canDrop = canDrop; } + + public String getType() { + return "food"; + } } diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/inventory/HatchingPotion.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/inventory/HatchingPotion.java index b7dfdb8e9..a5de9ceb8 100644 --- a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/inventory/HatchingPotion.java +++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/inventory/HatchingPotion.java @@ -25,4 +25,9 @@ public class HatchingPotion extends Item { public void setPremium(Boolean premium) { this.premium = premium; } + + @Override + public String getType() { + return "hatchingPotions"; + } } diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/inventory/Item.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/inventory/Item.java index 326d8176f..d5a1b2055 100644 --- a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/inventory/Item.java +++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/inventory/Item.java @@ -6,7 +6,7 @@ import com.raizlabs.android.dbflow.annotation.PrimaryKey; import com.raizlabs.android.dbflow.annotation.Table; import com.raizlabs.android.dbflow.structure.BaseModel; -public class Item extends BaseModel { +public abstract class Item extends BaseModel { @Column @PrimaryKey @@ -57,4 +57,6 @@ public class Item extends BaseModel { public void setOwned(Integer owned) { this.owned = owned; } + + public abstract String getType(); } diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/inventory/QuestContent.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/inventory/QuestContent.java index be6b87ad3..3e4d099ad 100644 --- a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/inventory/QuestContent.java +++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/inventory/QuestContent.java @@ -106,4 +106,8 @@ public class QuestContent extends Item { super.save(); } + @Override + public String getType() { + return "quests"; + } } diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/GroupSerialization.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/GroupSerialization.java index c8d20b79c..dca63b82a 100644 --- a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/GroupSerialization.java +++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/GroupSerialization.java @@ -1,5 +1,6 @@ package com.magicmicky.habitrpgwrapper.lib.utils; +import com.google.gson.JsonArray; import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonDeserializer; import com.google.gson.JsonElement; @@ -46,7 +47,10 @@ public class GroupSerialization implements JsonDeserializer, JsonSerializ }.getType()); } if (obj.has("members")) { - group.members = context.deserialize(obj.get("members"), new TypeToken>(){}.getType()); + JsonArray memberList = obj.get("members").getAsJsonArray(); + if (memberList.size() > 0 && memberList.get(0).isJsonObject()) { + group.members = context.deserialize(memberList, new TypeToken>(){}.getType()); + } } if (obj.has("leader")) { if (obj.get("leader").isJsonPrimitive()) {