From 9dc2a79d17e2ccc3ec54fb3c23b2688a8fc5dfc3 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Mon, 8 Apr 2019 17:41:54 +0200 Subject: [PATCH] Improve content loading --- Habitica/build.gradle | 2 +- .../habitica/api/GSonFactoryCreator.java | 16 +- .../habitica/data/InventoryRepository.kt | 8 +- .../implementation/InventoryRepositoryImpl.kt | 33 ++-- .../data/local/InventoryLocalRepository.kt | 10 +- .../RealmInventoryLocalRepository.kt | 68 ++++---- .../habitica/models/inventory/Egg.java | 12 +- .../habitica/models/inventory/Food.java | 11 +- .../models/inventory/HatchingPotion.java | 13 +- .../habitica/models/inventory/Item.java | 4 - .../habitica/models/inventory/QuestContent.kt | 9 - .../models/inventory/SpecialItem.java | 12 +- .../android/habitica/models/user/Items.java | 155 ------------------ .../android/habitica/models/user/Items.kt | 76 +++++++++ .../android/habitica/models/user/OwnedItem.kt | 23 +++ .../android/habitica/models/user/User.kt | 4 +- .../ui/activities/FullProfileActivity.kt | 3 +- .../adapter/inventory/ItemRecyclerAdapter.kt | 25 ++- .../adapter/inventory/ShopRecyclerAdapter.kt | 7 +- .../habitica/ui/fragments/StatsFragment.kt | 2 +- .../inventory/items/ItemRecyclerFragment.kt | 25 ++- .../habitica/utils/ContentDeserializer.kt | 20 ++- .../habitica/utils/EggListDeserializer.java | 70 -------- .../habitica/utils/FoodListDeserializer.java | 71 -------- .../utils/HatchingPotionListDeserializer.java | 70 -------- .../utils/OwnedItemListDeserializer.kt | 24 +++ .../habitica/utils/QuestListDeserializer.java | 78 --------- .../UserRepositoryImplTest.java | 2 +- 28 files changed, 263 insertions(+), 590 deletions(-) delete mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Items.java create mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Items.kt create mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/models/user/OwnedItem.kt delete mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/utils/EggListDeserializer.java delete mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/utils/FoodListDeserializer.java delete mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/utils/HatchingPotionListDeserializer.java create mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/utils/OwnedItemListDeserializer.kt delete mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/utils/QuestListDeserializer.java diff --git a/Habitica/build.gradle b/Habitica/build.gradle index a37bbb5f6..90b913c8c 100644 --- a/Habitica/build.gradle +++ b/Habitica/build.gradle @@ -150,7 +150,7 @@ android { buildConfigField "String", "STORE", "\"google\"" multiDexEnabled true - versionCode 2081 + versionCode 2083 versionName "1.9" } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/api/GSonFactoryCreator.java b/Habitica/src/main/java/com/habitrpg/android/habitica/api/GSonFactoryCreator.java index ac798f708..918a9e04e 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/api/GSonFactoryCreator.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/api/GSonFactoryCreator.java @@ -28,6 +28,7 @@ import com.habitrpg.android.habitica.models.social.FindUsernameResult; import com.habitrpg.android.habitica.models.social.Group; import com.habitrpg.android.habitica.models.tasks.Task; import com.habitrpg.android.habitica.models.tasks.TaskList; +import com.habitrpg.android.habitica.models.user.OwnedItem; import com.habitrpg.android.habitica.models.user.Purchases; import com.habitrpg.android.habitica.models.user.User; import com.habitrpg.android.habitica.utils.BooleanAsIntAdapter; @@ -38,24 +39,21 @@ import com.habitrpg.android.habitica.utils.ChatMessageListDeserializer; import com.habitrpg.android.habitica.utils.ContentDeserializer; import com.habitrpg.android.habitica.utils.CustomizationDeserializer; import com.habitrpg.android.habitica.utils.DateDeserializer; -import com.habitrpg.android.habitica.utils.EggListDeserializer; import com.habitrpg.android.habitica.utils.EquipmentListDeserializer; import com.habitrpg.android.habitica.utils.FAQArticleListDeserilializer; import com.habitrpg.android.habitica.utils.FeedResponseDeserializer; import com.habitrpg.android.habitica.utils.FindUsernameResultDeserializer; -import com.habitrpg.android.habitica.utils.FoodListDeserializer; import com.habitrpg.android.habitica.utils.GroupSerialization; -import com.habitrpg.android.habitica.utils.HatchingPotionListDeserializer; import com.habitrpg.android.habitica.utils.MemberSerialization; import com.habitrpg.android.habitica.utils.MountListDeserializer; import com.habitrpg.android.habitica.utils.MountMapDeserializer; +import com.habitrpg.android.habitica.utils.OwnedItemListDeserializer; import com.habitrpg.android.habitica.utils.PetListDeserializer; import com.habitrpg.android.habitica.utils.PetMapDeserializer; import com.habitrpg.android.habitica.utils.PurchasedDeserializer; import com.habitrpg.android.habitica.utils.QuestCollectDeserializer; import com.habitrpg.android.habitica.utils.QuestDeserializer; import com.habitrpg.android.habitica.utils.QuestDropItemsListSerialization; -import com.habitrpg.android.habitica.utils.QuestListDeserializer; import com.habitrpg.android.habitica.utils.SkillDeserializer; import com.habitrpg.android.habitica.utils.TaskListDeserializer; import com.habitrpg.android.habitica.utils.TaskSerializer; @@ -81,10 +79,6 @@ public class GSonFactoryCreator { Type tutorialStepListType = new TypeToken>() {}.getType(); Type faqArticleListType = new TypeToken>() {}.getType(); Type itemDataListType = new TypeToken>() {}.getType(); - Type eggListType = new TypeToken>() {}.getType(); - Type foodListType = new TypeToken>() {}.getType(); - Type hatchingPotionListType = new TypeToken>() {}.getType(); - Type questContentListType = new TypeToken>() {}.getType(); Type petMapType = new TypeToken>() {}.getType(); Type mountMapType = new TypeToken>() {}.getType(); Type petListType = new TypeToken>() {}.getType(); @@ -94,6 +88,7 @@ public class GSonFactoryCreator { Type challengeListType = new TypeToken>() {}.getType(); Type challengeRealmListType = new TypeToken>() {}.getType(); Type questDropItemListType = new TypeToken>() {}.getType(); + Type ownedItemListType = new TypeToken>() {}.getType(); //Exclusion strategy needed for DBFlow https://github.com/Raizlabs/DBFlow/issues/121 Gson gson = new GsonBuilder() @@ -109,10 +104,6 @@ public class GSonFactoryCreator { .registerTypeAdapter(Group.class, new GroupSerialization()) .registerTypeAdapter(Date.class, new DateDeserializer()) .registerTypeAdapter(itemDataListType, new EquipmentListDeserializer()) - .registerTypeAdapter(eggListType, new EggListDeserializer()) - .registerTypeAdapter(foodListType, new FoodListDeserializer()) - .registerTypeAdapter(hatchingPotionListType, new HatchingPotionListDeserializer()) - .registerTypeAdapter(questContentListType, new QuestListDeserializer()) .registerTypeAdapter(petListType, new PetListDeserializer()) .registerTypeAdapter(mountListType, new MountListDeserializer()) .registerTypeAdapter(petMapType, new PetMapDeserializer()) @@ -128,6 +119,7 @@ public class GSonFactoryCreator { .registerTypeAdapter(challengeListType, new ChallengeListDeserializer()) .registerTypeAdapter(challengeRealmListType, new ChallengeListDeserializer()) .registerTypeAdapter(questDropItemListType, new QuestDropItemsListSerialization()) + .registerTypeAdapter(ownedItemListType, new OwnedItemListDeserializer()) .registerTypeAdapter(Quest.class, new QuestDeserializer()) .registerTypeAdapter(Member.class, new MemberSerialization()) .registerTypeAdapter(WorldState.class, new WorldStateSerialization()) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/InventoryRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/InventoryRepository.kt index 8f3e2e36e..e9caca92d 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/InventoryRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/InventoryRepository.kt @@ -14,6 +14,7 @@ import com.habitrpg.android.habitica.models.responses.FeedResponse import com.habitrpg.android.habitica.models.shops.Shop import com.habitrpg.android.habitica.models.shops.ShopItem import com.habitrpg.android.habitica.models.user.Items +import com.habitrpg.android.habitica.models.user.OwnedItem import com.habitrpg.android.habitica.models.user.User import io.reactivex.Flowable @@ -36,13 +37,13 @@ interface InventoryRepository : ContentRepository { fun getOwnedPets(): Flowable> fun getQuestContent(key: String): Flowable - fun getItems(searchedKeys: List): Flowable> + fun getEquipment(searchedKeys: List): Flowable> fun retrieveInAppRewards(): Flowable> fun getOwnedEquipment(type: String): Flowable> - fun getOwnedItems(itemClass: Class, user: User?): Flowable> - fun getOwnedItems(user: User): Flowable> + fun getOwnedItems(itemType: String): Flowable> + fun getOwnedItems(user: User): Flowable> fun getEquipment(key: String): Flowable @@ -84,4 +85,5 @@ interface InventoryRepository : ContentRepository { fun purchaseItem(purchaseType: String, key: String): Flowable fun togglePinnedItem(item: ShopItem): Flowable> + fun getItems(itemClass: Class, keys: Array, user: User?): Flowable> } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/InventoryRepositoryImpl.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/InventoryRepositoryImpl.kt index 495be05f9..51ad3db91 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/InventoryRepositoryImpl.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/InventoryRepositoryImpl.kt @@ -10,6 +10,7 @@ import com.habitrpg.android.habitica.models.responses.FeedResponse import com.habitrpg.android.habitica.models.shops.Shop import com.habitrpg.android.habitica.models.shops.ShopItem import com.habitrpg.android.habitica.models.user.Items +import com.habitrpg.android.habitica.models.user.OwnedItem import com.habitrpg.android.habitica.models.user.User import io.reactivex.Flowable import io.realm.RealmResults @@ -20,7 +21,7 @@ class InventoryRepositoryImpl(localRepository: InventoryLocalRepository, apiClie return localRepository.getQuestContent(key) } - override fun getItems(searchedKeys: List): Flowable> { + override fun getEquipment(searchedKeys: List): Flowable> { return localRepository.getEquipment(searchedKeys) } @@ -44,14 +45,18 @@ class InventoryRepositoryImpl(localRepository: InventoryLocalRepository, apiClie return localRepository.getOwnedEquipment() } - override fun getOwnedItems(itemClass: Class, user: User?): Flowable> { - return localRepository.getOwnedItems(itemClass, user) + override fun getOwnedItems(itemType: String): Flowable> { + return localRepository.getOwnedItems(itemType, userID) } - override fun getOwnedItems(user: User): Flowable> { + override fun getOwnedItems(user: User): Flowable> { return localRepository.getOwnedItems(user) } + override fun getItems(itemClass: Class, keys: Array, user: User?): Flowable> { + return localRepository.getItems(itemClass, keys, user) + } + override fun getEquipment(key: String): Flowable { return localRepository.getEquipment(key) } @@ -105,7 +110,7 @@ class InventoryRepositoryImpl(localRepository: InventoryLocalRepository, apiClie } override fun changeOwnedCount(type: String, key: String, amountToAdd: Int) { - localRepository.changeOwnedCount(type, key, amountToAdd) + localRepository.changeOwnedCount(type, key, userID, amountToAdd) } override fun sellItem(user: User?, type: String, key: String): Flowable { @@ -124,7 +129,7 @@ class InventoryRepositoryImpl(localRepository: InventoryLocalRepository, apiClie val newItems = realm.copyToRealmOrUpdate(items) user.items = newItems } else { - item.owned = item.owned - 1 + //item.owned = item.owned - 1 } val stats = user1.stats if (stats != null) { @@ -173,12 +178,12 @@ class InventoryRepositoryImpl(localRepository: InventoryLocalRepository, apiClie return@doOnNext } localRepository.executeTransaction { - val newEquipped = items.gear.equipped + val newEquipped = items.gear?.equipped val oldEquipped = user.items?.gear?.equipped - val newCostume = items.gear.costume + val newCostume = items.gear?.costume val oldCostume = user.items?.gear?.costume - oldEquipped?.updateWith(newEquipped) - oldCostume?.updateWith(newCostume) + newEquipped?.let { equipped -> oldEquipped?.updateWith(equipped) } + newCostume?.let { costume -> oldCostume?.updateWith(costume) } user.items?.currentMount = items.currentMount user.items?.currentPet = items.currentPet user.balance = user.balance @@ -189,7 +194,7 @@ class InventoryRepositoryImpl(localRepository: InventoryLocalRepository, apiClie override fun feedPet(pet: Pet, food: Food): Flowable { return apiClient.feedPet(pet.key, food.key) .doOnNext { feedResponse -> - localRepository.changeOwnedCount(food, -1) + localRepository.changeOwnedCount("food", food.key, userID, -1) localRepository.executeTransaction { pet.trained = feedResponse.value } } } @@ -197,15 +202,15 @@ class InventoryRepositoryImpl(localRepository: InventoryLocalRepository, apiClie override fun hatchPet(egg: Egg, hatchingPotion: HatchingPotion): Flowable { return apiClient.hatchPet(egg.key, hatchingPotion.key) .doOnNext { - localRepository.changeOwnedCount(egg, -1) - localRepository.changeOwnedCount(hatchingPotion, -1) + localRepository.changeOwnedCount("egg", egg.key, userID, -1) + localRepository.changeOwnedCount("hatchingPotions", hatchingPotion.key, userID, -1) localRepository.changePetFeedStatus(egg.key+"-"+hatchingPotion.key, 5) } } override fun inviteToQuest(quest: QuestContent): Flowable { return apiClient.inviteToQuest("party", quest.key) - .doOnNext { localRepository.changeOwnedCount(quest, -1) } + .doOnNext { localRepository.changeOwnedCount("quests", quest.key, userID, -1) } } override fun buyItem(user: User?, id: String, value: Double): Flowable { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/InventoryLocalRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/InventoryLocalRepository.kt index b6b9410d2..b00764575 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/InventoryLocalRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/InventoryLocalRepository.kt @@ -2,6 +2,7 @@ package com.habitrpg.android.habitica.data.local import com.habitrpg.android.habitica.models.inventory.* import com.habitrpg.android.habitica.models.shops.ShopItem +import com.habitrpg.android.habitica.models.user.OwnedItem import com.habitrpg.android.habitica.models.user.User import io.reactivex.Flowable import io.realm.RealmResults @@ -26,8 +27,9 @@ interface InventoryLocalRepository : ContentLocalRepository { fun getOwnedEquipment(type: String): Flowable> - fun getOwnedItems(itemClass: Class, user: User?): Flowable> - fun getOwnedItems(user: User): Flowable> + fun getItems(itemClass: Class, keys: Array, user: User?): Flowable> + fun getOwnedItems(itemType: String, userID: String): Flowable> + fun getOwnedItems(user: User): Flowable> fun getEquipment(key: String): Flowable fun getMounts(type: String, group: String): Flowable> @@ -37,8 +39,8 @@ interface InventoryLocalRepository : ContentLocalRepository { fun updateOwnedEquipment(user: User) - fun changeOwnedCount(type: String, key: String, amountToAdd: Int) - fun changeOwnedCount(item: Item, amountToAdd: Int?) + fun changeOwnedCount(type: String, key: String, userID: String, amountToAdd: Int) + fun changeOwnedCount(item: OwnedItem, amountToAdd: Int?) fun getItem(type: String, key: String): Flowable diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmInventoryLocalRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmInventoryLocalRepository.kt index cd45362c2..ee18d1c37 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmInventoryLocalRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmInventoryLocalRepository.kt @@ -6,6 +6,7 @@ import com.habitrpg.android.habitica.extensions.notNull import com.habitrpg.android.habitica.helpers.RxErrorHandler import com.habitrpg.android.habitica.models.inventory.* import com.habitrpg.android.habitica.models.shops.ShopItem +import com.habitrpg.android.habitica.models.user.OwnedItem import com.habitrpg.android.habitica.models.user.User import io.reactivex.Flowable import io.reactivex.functions.Consumer @@ -62,44 +63,39 @@ class RealmInventoryLocalRepository(realm: Realm, private val context: Context) .filter { it.isLoaded } } - override fun getOwnedItems(itemClass: Class, user: User?): Flowable> { - var query = realm.where(itemClass) - if (SpecialItem::class.java.isAssignableFrom(itemClass)) { - if (user?.purchased?.plan != null) { - val mysticItem: SpecialItem = if (query.count() == 0L) { - SpecialItem.makeMysteryItem(context) - } else { - getUnmanagedCopy((query.findFirst() as SpecialItem?)!!) - } - mysticItem.owned = user.purchased?.plan?.mysteryItemCount - this.save(mysticItem) - } - } else { - query = query.greaterThan("owned", 0) - } - return query.findAllAsync().asFlowable() + override fun getOwnedItems(itemType: String, userID: String): Flowable> { + return realm.where(OwnedItem::class.java) + .equalTo("itemType", itemType) + .equalTo("userID", userID) + .findAll() + .asFlowable() .filter { it.isLoaded } } - override fun getOwnedItems(user: User): Flowable> { + override fun getItems(itemClass: Class, keys: Array, user: User?): Flowable> { + return realm.where(itemClass).`in`("key", keys).findAllAsync().asFlowable() + .filter { it.isLoaded } + } + + override fun getOwnedItems(user: User): Flowable> { return Flowable.combineLatest( - getOwnedItems(Egg::class.java, user), - getOwnedItems(HatchingPotion::class.java, user), - getOwnedItems(Food::class.java, user), - getOwnedItems(QuestContent::class.java, user), + getOwnedItems("eggs", user.id ?: ""), + getOwnedItems("hatchingPotions", user.id ?: ""), + getOwnedItems("food", user.id ?: ""), + getOwnedItems("questContent", user.id ?: ""), Function4 { eggs, hatchingPotions, food, quests -> - val items = HashMap() + val items = HashMap() for (item in eggs) { - items[item.key + "-" + item.type] = item + items[item.key + "-" + item.itemType] = item } for (item in hatchingPotions) { - items[item.key + "-" + item.type] = item + items[item.key + "-" + item.itemType] = item } for (item in food) { - items[item.key + "-" + item.type] = item + items[item.key + "-" + item.itemType] = item } for (item in quests) { - items[item.key + "-" + item.type] = item + items[item.key + "-" + item.itemType] = item } items } @@ -196,16 +192,26 @@ class RealmInventoryLocalRepository(realm: Realm, private val context: Context) } - override fun changeOwnedCount(type: String, key: String, amountToAdd: Int) { - getItem(type, key).firstElement().subscribe( Consumer { changeOwnedCount(it, amountToAdd)}, RxErrorHandler.handleEmptyError()) + override fun changeOwnedCount(type: String, key: String, userID: String, amountToAdd: Int) { + getOwnedItem(type, key, userID).firstElement().subscribe( Consumer { changeOwnedCount(it, amountToAdd)}, RxErrorHandler.handleEmptyError()) } - override fun changeOwnedCount(item: Item, amountToAdd: Int?) { + override fun changeOwnedCount(item: OwnedItem, amountToAdd: Int?) { amountToAdd.notNull { amount -> - realm.executeTransaction { item.owned = item.owned + amount } + realm.executeTransaction { item.numberOwned = item.numberOwned + amount } } } + fun getOwnedItem(type: String, key: String, userID: String): Flowable { + return realm.where(OwnedItem::class.java) + .equalTo("itemType", type) + .equalTo("key", key) + .equalTo("userID", userID) + .findFirstAsync() + .asFlowable() + .filter { realmObject -> realmObject.isLoaded } + } + override fun getItem(type: String, key: String): Flowable { val itemClass: Class = when (type) { "eggs" -> Egg::class.java @@ -226,7 +232,7 @@ class RealmInventoryLocalRepository(realm: Realm, private val context: Context) val item = realm.where(SpecialItem::class.java).equalTo("isMysteryItem", true).findFirst() realm.executeTransaction { if (item != null && item.isValid) { - item.owned = item.owned - 1 + //item.owned = item.owned - 1 } if (user.isValid) { user.purchased?.plan?.mysteryItemCount = (user.purchased?.plan?.mysteryItemCount ?: 0) - 1 diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Egg.java b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Egg.java index a6ff35765..2c41352f2 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Egg.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Egg.java @@ -8,7 +8,7 @@ public class Egg extends RealmObject implements Item { @PrimaryKey String key; String text, notes; - Integer value, owned; + Integer value; String adjective, mountText; Integer stableOwned, stableTotal; @@ -57,20 +57,10 @@ public class Egg extends RealmObject implements Item { return key; } - @Override - public void setOwned(int size) { - owned = size; - } - public String getText() { return text; } - @Override - public Integer getOwned() { - return owned; - } - @Override public Integer getValue() { return value; diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Food.java b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Food.java index c7b89aa14..936adc6b2 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Food.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Food.java @@ -8,7 +8,7 @@ public class Food extends RealmObject implements Item { @PrimaryKey String key; String text, notes; - Integer value, owned; + Integer value; String target, article; Boolean canDrop; @@ -45,20 +45,11 @@ public class Food extends RealmObject implements Item { return key; } - @Override - public void setOwned(int size) { - owned = size; - } - @Override public String getText() { return text; } - public Integer getOwned() { - return owned; - } - @Override public Integer getValue() { return value; diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/HatchingPotion.java b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/HatchingPotion.java index 091f758c9..4d42ca4cd 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/HatchingPotion.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/HatchingPotion.java @@ -8,7 +8,8 @@ public class HatchingPotion extends RealmObject implements Item { @PrimaryKey String key; String text, notes; - Integer value, owned; Boolean limited, premium; + Integer value; + Boolean limited, premium; public Boolean getLimited() { return limited; @@ -36,20 +37,10 @@ public class HatchingPotion extends RealmObject implements Item { return key; } - @Override - public void setOwned(int size) { - owned = size; - } - public String getText() { return text; } - @Override - public Integer getOwned() { - return owned; - } - @Override public Integer getValue() { return value; diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Item.java b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Item.java index 321c919d5..da0f3e08a 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Item.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Item.java @@ -8,11 +8,7 @@ public interface Item extends RealmModel { String getKey(); - void setOwned(int size); - String getText(); - Integer getOwned(); - Integer getValue(); } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/QuestContent.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/QuestContent.kt index 11fddeefa..ec0b42bf8 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/QuestContent.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/QuestContent.kt @@ -19,7 +19,6 @@ open class QuestContent : RealmObject(), Item { internal var text: String = "" var notes: String = "" internal var value: Int = 0 - internal var owned: Int = 0 var previous: String? = null var lvl: Int = 0 var isCanBuy: Boolean = false @@ -59,18 +58,10 @@ open class QuestContent : RealmObject(), Item { return key } - override fun setOwned(size: Int) { - owned = size - } - override fun getText(): String { return text } - override fun getOwned(): Int? { - return owned - } - override fun getValue(): Int? { return value } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/SpecialItem.java b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/SpecialItem.java index 44054e7a5..827ebad68 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/SpecialItem.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/SpecialItem.java @@ -17,7 +17,7 @@ public class SpecialItem extends RealmObject implements Item { @PrimaryKey String key; String text, notes; - Integer value, owned; + Integer value; public boolean isMysteryItem; public static SpecialItem makeMysteryItem(Context context) { @@ -41,21 +41,11 @@ public class SpecialItem extends RealmObject implements Item { return key; } - @Override - public void setOwned(int size) { - owned = size; - } - @Override public String getText() { return text; } - @Override - public Integer getOwned() { - return owned; - } - @Override public Integer getValue() { return value; diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Items.java b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Items.java deleted file mode 100644 index d5feabe87..000000000 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Items.java +++ /dev/null @@ -1,155 +0,0 @@ -package com.habitrpg.android.habitica.models.user; - -import com.habitrpg.android.habitica.models.inventory.Egg; -import com.habitrpg.android.habitica.models.inventory.Food; -import com.habitrpg.android.habitica.models.inventory.HatchingPotion; -import com.habitrpg.android.habitica.models.inventory.Mount; -import com.habitrpg.android.habitica.models.inventory.Pet; -import com.habitrpg.android.habitica.models.inventory.QuestContent; - -import java.util.Date; - -import io.realm.RealmList; -import io.realm.RealmObject; -import io.realm.annotations.PrimaryKey; - -public class Items extends RealmObject { - - @PrimaryKey - private String userId; - public RealmList eggs; - public RealmList food; - public RealmList hatchingPotions; - public RealmList quests; - User user; - RealmList pets; - RealmList mounts; - private String currentMount; - private String currentPet; - private int lastDrop_count; - private Date lastDrop_date; - - //private QuestContent quest; - private Gear gear; - private SpecialItems special; - - public Items(String currentMount, String currentPet, int lastDrop_count, Date lastDrop_date) { - this.currentMount = currentMount; - this.currentPet = currentPet; - this.lastDrop_count = lastDrop_count; - this.lastDrop_date = lastDrop_date; - } - - public Items() { - } - - public String getCurrentMount() { - return currentMount; - } - - public void setCurrentMount(String currentMount) { - this.currentMount = currentMount; - } - - public String getCurrentPet() { - return currentPet; - } - - public void setCurrentPet(String currentPet) { - this.currentPet = currentPet; - } - - public int getLastDrop_count() { - return lastDrop_count; - } - - public void setLastDrop_count(int lastDrop_count) { - this.lastDrop_count = lastDrop_count; - } - - public Date getLastDrop_date() { - return lastDrop_date; - } - - public void setLastDrop_date(Date lastDrop_date) { - this.lastDrop_date = lastDrop_date; - } - - public Gear getGear() { - return gear; - } - - public void setGear(Gear gear) { - this.gear = gear; - } - - public SpecialItems getSpecial() { - return special; - } - - public void setSpecial(SpecialItems specialItems) { - this.special = specialItems; - } - - public RealmList getEggs() { - return eggs; - } - - public void setEggs(RealmList eggs) { - this.eggs = eggs; - } - - public RealmList getFood() { - return food; - } - - public void setFood(RealmList food) { - this.food = food; - } - - public RealmList getHatchingPotions() { - return hatchingPotions; - } - - public void setHatchingPotions(RealmList hatchingPotions) { - this.hatchingPotions = hatchingPotions; - } - - public RealmList getQuests() { - return quests; - } - - public void setQuests(RealmList quests) { - this.quests = quests; - } - - public RealmList getPets() { - return pets; - } - - public void setPets(RealmList pets) { - this.pets = pets; - } - - public RealmList getMounts() { - return mounts; - } - - public void setMounts(RealmList mounts) { - this.mounts = mounts; - } - - public String getUserId() { - return userId; - } - - public void setUserId(String userId) { - this.userId = userId; - if (gear != null && !gear.isManaged()) { - gear.setUserId(userId); - } - if (special != null && !special.isManaged()) { - special.setUserId(userId); - } - } -} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Items.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Items.kt new file mode 100644 index 000000000..97c8aa428 --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Items.kt @@ -0,0 +1,76 @@ +package com.habitrpg.android.habitica.models.user + +import com.habitrpg.android.habitica.models.inventory.Egg +import com.habitrpg.android.habitica.models.inventory.Food +import com.habitrpg.android.habitica.models.inventory.HatchingPotion +import com.habitrpg.android.habitica.models.inventory.Mount +import com.habitrpg.android.habitica.models.inventory.Pet +import com.habitrpg.android.habitica.models.inventory.QuestContent + +import java.util.Date + +import io.realm.RealmList +import io.realm.RealmObject +import io.realm.annotations.PrimaryKey + +open class Items : RealmObject { + + @PrimaryKey + var userId: String? = null + set(userId) { + field = userId + if (gear != null && gear?.isManaged == false) { + gear?.userId = userId + } + if (special != null && special?.isManaged == false) { + special?.userId = userId + } + eggs?.forEach { + if (!it.isManaged) { + it.userID = userId + it.itemType = "eggs" + } + } + food?.forEach { + if (!it.isManaged) { + it.userID = userId + it.itemType = "food" + } + } + hatchingPotions?.forEach { + if (!it.isManaged) { + it.userID = userId + it.itemType = "hatchingPotions" + } + } + quests?.forEach { + if (!it.isManaged) { + it.userID = userId + it.itemType = "quests" + } + } + } + var eggs: RealmList? = null + var food: RealmList? = null + var hatchingPotions: RealmList? = null + var quests: RealmList? = null + var pets: RealmList? = null + var mounts: RealmList? = null + var currentMount: String? = null + var currentPet: String? = null + var lastDrop_count: Int = 0 + var lastDrop_date: Date? = null + + //private QuestContent quest; + var gear: Gear? = null + var special: SpecialItems? = null + + constructor(currentMount: String, currentPet: String, lastDrop_count: Int, lastDrop_date: Date) { + this.currentMount = currentMount + this.currentPet = currentPet + this.lastDrop_count = lastDrop_count + this.lastDrop_date = lastDrop_date + } + + constructor() +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/OwnedItem.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/OwnedItem.kt new file mode 100644 index 000000000..6929c92fa --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/OwnedItem.kt @@ -0,0 +1,23 @@ +package com.habitrpg.android.habitica.models.user + +import io.realm.RealmObject +import io.realm.annotations.PrimaryKey + +open class OwnedItem : RealmObject() { + + @PrimaryKey + var combinedKey: String? = null + var userID: String? = null + set(value) { + field = value + combinedKey = field + key + } + var key: String? = null + set(value) { + field = value + combinedKey = field + key + } + + var itemType: String? = null + var numberOwned = 0 +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/User.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/User.kt index f4583a3f6..bf9ab3912 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/User.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/User.kt @@ -143,10 +143,10 @@ open class User : RealmObject(), Avatar { var streakCount: Int = 0 val petsFoundCount: Int - get() = this.items?.getPets()?.size ?: 0 + get() = this.items?.pets?.size ?: 0 val mountsTamedCount: Int - get() = this.items?.getMounts()?.size ?: 0 + get() = this.items?.mounts?.size ?: 0 val contributorColor: Int get() = this.contributor?.contributorColor ?: android.R.color.black diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FullProfileActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FullProfileActivity.kt index 603bcf9b2..5a78dbb2a 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FullProfileActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FullProfileActivity.kt @@ -1,7 +1,6 @@ package com.habitrpg.android.habitica.ui.activities import android.content.Context -import android.content.Intent import android.graphics.Typeface import android.os.Bundle import androidx.core.content.ContextCompat @@ -338,7 +337,7 @@ class FullProfileActivity : BaseActivity() { outfitList.add(outfit.shield) outfitList.add(outfit.weapon) } - return inventoryRepository.getItems(outfitList) + return inventoryRepository.getEquipment(outfitList) } private fun gotGear(equipmentList: List, user: Member) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/ItemRecyclerAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/ItemRecyclerAdapter.kt index 55be31feb..b43a406a7 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/ItemRecyclerAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/ItemRecyclerAdapter.kt @@ -14,6 +14,7 @@ import com.habitrpg.android.habitica.events.commands.HatchingCommand import com.habitrpg.android.habitica.extensions.inflate import com.habitrpg.android.habitica.extensions.notNull import com.habitrpg.android.habitica.models.inventory.* +import com.habitrpg.android.habitica.models.user.OwnedItem import com.habitrpg.android.habitica.ui.fragments.inventory.items.ItemRecyclerFragment import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils import com.habitrpg.android.habitica.ui.helpers.bindView @@ -27,7 +28,7 @@ import io.realm.RealmRecyclerViewAdapter import io.realm.RealmResults import org.greenrobot.eventbus.EventBus -class ItemRecyclerAdapter(data: OrderedRealmCollection?, autoUpdate: Boolean) : RealmRecyclerViewAdapter(data, autoUpdate) { +class ItemRecyclerAdapter(data: OrderedRealmCollection?, autoUpdate: Boolean) : RealmRecyclerViewAdapter(data, autoUpdate) { var isHatching: Boolean = false var isFeeding: Boolean = false @@ -36,6 +37,11 @@ class ItemRecyclerAdapter(data: OrderedRealmCollection?, autoUpdate: Boole var fragment: ItemRecyclerFragment? = null private var ownedPets: RealmResults? = null var context: Context? = null + var items: Map? = null + set(value) { + field = value + notifyDataSetChanged() + } private val sellItemEvents = PublishSubject.create() private val questInvitationEvents = PublishSubject.create() @@ -53,7 +59,10 @@ class ItemRecyclerAdapter(data: OrderedRealmCollection?, autoUpdate: Boole } override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - data.notNull { holder.bind(it[position]) } + data.notNull { + val ownedItem = it[position] + holder.bind(ownedItem, items?.get(ownedItem.key)) + } } fun setOwnedPets(pets: RealmResults) { @@ -62,6 +71,7 @@ class ItemRecyclerAdapter(data: OrderedRealmCollection?, autoUpdate: Boole inner class ItemViewHolder(itemView: View) : androidx.recyclerview.widget.RecyclerView.ViewHolder(itemView), View.OnClickListener { + var ownedItem: OwnedItem? = null var item: Item? = null private val titleTextView: TextView by bindView(R.id.titleTextView) @@ -84,10 +94,11 @@ class ItemRecyclerAdapter(data: OrderedRealmCollection?, autoUpdate: Boole itemView.setOnClickListener(this) } - fun bind(item: Item) { + fun bind(ownedItem: OwnedItem, item: Item?) { + this.ownedItem = ownedItem this.item = item - titleTextView.text = item.text - ownedTextView.text = item.owned.toString() + titleTextView.text = item?.text + ownedTextView.text = ownedItem.numberOwned.toString() var disabled = false val imageName: String? @@ -102,7 +113,7 @@ class ItemRecyclerAdapter(data: OrderedRealmCollection?, autoUpdate: Boole is HatchingPotion -> "HatchingPotion" else -> "" } - imageName = "Pet_" + type + "_" + item.key + imageName = "Pet_" + type + "_" + item?.key if (isHatching) { disabled = this.isPetOwned ?: false @@ -133,7 +144,7 @@ class ItemRecyclerAdapter(data: OrderedRealmCollection?, autoUpdate: Boole menu.addMenuItem(BottomSheetMenuItem(resources.getString(R.string.invite_party))) } else if (item is SpecialItem) { val specialItem = item as SpecialItem - if (specialItem.isMysteryItem && specialItem.owned > 0) { + if (specialItem.isMysteryItem && ownedItem?.numberOwned ?: 0 > 0) { menu.addMenuItem(BottomSheetMenuItem(resources.getString(R.string.open))) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/ShopRecyclerAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/ShopRecyclerAdapter.kt index 0bb6de38c..7669980ab 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/ShopRecyclerAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/ShopRecyclerAdapter.kt @@ -16,6 +16,7 @@ import com.habitrpg.android.habitica.models.inventory.Item import com.habitrpg.android.habitica.models.shops.Shop import com.habitrpg.android.habitica.models.shops.ShopCategory import com.habitrpg.android.habitica.models.shops.ShopItem +import com.habitrpg.android.habitica.models.user.OwnedItem import com.habitrpg.android.habitica.models.user.User import com.habitrpg.android.habitica.ui.viewHolders.SectionViewHolder import com.habitrpg.android.habitica.ui.viewHolders.ShopItemViewHolder @@ -26,7 +27,7 @@ class ShopRecyclerAdapter : androidx.recyclerview.widget.RecyclerView.Adapter = ArrayList() private var shopIdentifier: String? = null - private var ownedItems: Map = HashMap() + private var ownedItems: Map = HashMap() var shopSpriteSuffix: String = "" @@ -140,7 +141,7 @@ class ShopRecyclerAdapter : androidx.recyclerview.widget.RecyclerView.Adapter) { + fun setOwnedItems(ownedItems: Map) { this.ownedItems = ownedItems this.notifyDataSetChanged() } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/StatsFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/StatsFragment.kt index 1103fa030..7a09b89cf 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/StatsFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/StatsFragment.kt @@ -245,7 +245,7 @@ class StatsFragment: BaseMainFragment() { outfitList.add(thisOutfit.weapon) } - compositeSubscription.add(inventoryRepository.getItems(outfitList).firstElement() + compositeSubscription.add(inventoryRepository.getEquipment(outfitList).firstElement() .retry(1) .subscribe(Consumer { val userStatComputer = UserStatComputer() diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemRecyclerFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemRecyclerFragment.kt index 0e64b07dc..ffae902b4 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemRecyclerFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemRecyclerFragment.kt @@ -171,11 +171,26 @@ class ItemRecyclerFragment : BaseFragment() { "special" -> SpecialItem::class.java else -> Egg::class.java } - compositeSubscription.add(inventoryRepository.getOwnedItems(itemClass, user).firstElement().subscribe(Consumer { items -> - if (items.size > 0) { - adapter?.updateData(items as? OrderedRealmCollection) - } - }, RxErrorHandler.handleEmptyError())) + itemType?.let { type -> + compositeSubscription.add(inventoryRepository.getOwnedItems(type) + .doOnNext { items -> + if (items.size > 0) { + adapter?.updateData(items) + } + } + .map { items -> items.mapNotNull { it.key } } + .flatMap { inventoryRepository.getItems(itemClass, it.toTypedArray(), user) } + .map { + val itemMap = mutableMapOf() + for (item in it) { + itemMap[item.key] = item + } + itemMap + } + .subscribe(Consumer { items -> + adapter?.items = items + }, RxErrorHandler.handleEmptyError())) + } compositeSubscription.add(inventoryRepository.getOwnedPets().subscribe(Consumer { adapter?.setOwnedPets(it) }, RxErrorHandler.handleEmptyError())) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/utils/ContentDeserializer.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/utils/ContentDeserializer.kt index 5667c5da3..bcf5b10ab 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/utils/ContentDeserializer.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/utils/ContentDeserializer.kt @@ -41,10 +41,22 @@ class ContentDeserializer : JsonDeserializer { result.armoire = context.deserialize(obj.get("armoire"), Equipment::class.java) result.gear = context.deserialize(obj.get("gear"), ContentGear::class.java) - result.quests = context.deserialize(obj.get("quests"), object : TypeToken>() {}.type) - result.eggs = context.deserialize(obj.get("eggs"), object : TypeToken>() {}.type) - result.food = context.deserialize(obj.get("food"), object : TypeToken>() {}.type) - result.hatchingPotions = context.deserialize(obj.get("hatchingPotions"), object : TypeToken>() {}.type) + result.quests = RealmList() + for (entry in obj.get("quests").asJsonObject.entrySet()) { + result.quests.add(context.deserialize(entry.value, QuestContent::class.java)) + } + result.eggs = RealmList() + for (entry in obj.get("eggs").asJsonObject.entrySet()) { + result.eggs.add(context.deserialize(entry.value, Egg::class.java)) + } + result.food = RealmList() + for (entry in obj.get("food").asJsonObject.entrySet()) { + result.food.add(context.deserialize(entry.value, Food::class.java)) + } + result.hatchingPotions = RealmList() + for (entry in obj.get("hatchingPotions").asJsonObject.entrySet()) { + result.hatchingPotions.add(context.deserialize(entry.value, HatchingPotion::class.java)) + } result.pets = RealmList() for (key in obj.getAsJsonObject("petInfo").keySet()) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/utils/EggListDeserializer.java b/Habitica/src/main/java/com/habitrpg/android/habitica/utils/EggListDeserializer.java deleted file mode 100644 index dbc5c751d..000000000 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/utils/EggListDeserializer.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.habitrpg.android.habitica.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.habitrpg.android.habitica.models.inventory.Egg; - -import java.lang.reflect.Type; -import java.util.List; -import java.util.Map; - -import io.realm.Realm; -import io.realm.RealmList; - -public class EggListDeserializer implements JsonDeserializer> { - @Override - public List deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { - RealmList vals = new RealmList<>(); - if (json.isJsonObject()) { - JsonObject object = json.getAsJsonObject(); - - Realm realm = Realm.getDefaultInstance(); - List existingItems = realm.copyFromRealm(realm.where(Egg.class).findAll()); - realm.close(); - - for (Egg item : existingItems) { - if (object.has(item.getKey())) { - JsonElement itemObject = object.get(item.getKey()); - - if (itemObject.isJsonObject()) { - Egg parsedItem = context.deserialize(itemObject.getAsJsonObject(), Egg.class); - item.setText(parsedItem.getText()); - item.setNotes(parsedItem.getNotes()); - item.setValue(parsedItem.getValue()); - item.setAdjective(parsedItem.getAdjective()); - item.setMountText(parsedItem.getMountText()); - } else { - item.setOwned(itemObject.getAsInt()); - } - vals.add(item); - object.remove(item.getKey()); - } - } - - for (Map.Entry entry : json.getAsJsonObject().entrySet()) { - Egg item; - if (entry.getValue().isJsonObject()) { - item = context.deserialize(entry.getValue(), Egg.class); - } else { - item = new Egg(); - item.setKey(entry.getKey()); - if (entry.getValue().isJsonNull()) { - item.setOwned(0); - } else { - item.setOwned(entry.getValue().getAsInt()); - } - } - vals.add(item); - } - } else { - for (JsonElement item : json.getAsJsonArray()) { - vals.add(context.deserialize(item.getAsJsonObject(), Egg.class)); - } - } - - return vals; - } -} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/utils/FoodListDeserializer.java b/Habitica/src/main/java/com/habitrpg/android/habitica/utils/FoodListDeserializer.java deleted file mode 100644 index 673cec035..000000000 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/utils/FoodListDeserializer.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.habitrpg.android.habitica.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.habitrpg.android.habitica.models.inventory.Food; - -import java.lang.reflect.Type; -import java.util.List; -import java.util.Map; - -import io.realm.Realm; -import io.realm.RealmList; - -public class FoodListDeserializer implements JsonDeserializer> { - @Override - public List deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { - RealmList vals = new RealmList<>(); - if (json.isJsonObject()) { - JsonObject object = json.getAsJsonObject(); - - Realm realm = Realm.getDefaultInstance(); - List existingItems = realm.copyFromRealm(realm.where(Food.class).findAll()); - realm.close(); - - for (Food item : existingItems) { - if (object.has(item.getKey())) { - JsonElement itemObject = object.get(item.getKey()); - - if (itemObject.isJsonObject()) { - Food parsedItem = context.deserialize(itemObject.getAsJsonObject(), Food.class); - item.setText(parsedItem.getText()); - item.setNotes(parsedItem.getNotes()); - item.setValue(parsedItem.getValue()); - item.setArticle(parsedItem.getArticle()); - item.setCanDrop(parsedItem.getCanDrop()); - item.setTarget(parsedItem.getTarget()); - } else { - item.setOwned(itemObject.getAsInt()); - } - vals.add(item); - object.remove(item.getKey()); - } - } - - for (Map.Entry entry : json.getAsJsonObject().entrySet()) { - Food item; - if (entry.getValue().isJsonObject()) { - item = context.deserialize(entry.getValue(), Food.class); - } else { - item = new Food(); - item.setKey(entry.getKey()); - if (entry.getValue().isJsonNull()) { - item.setOwned(0); - } else { - item.setOwned(entry.getValue().getAsInt()); - } - } - vals.add(item); - } - } else { - for (JsonElement item : json.getAsJsonArray()) { - vals.add(context.deserialize(item.getAsJsonObject(), Food.class)); - } - } - - return vals; - } -} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/utils/HatchingPotionListDeserializer.java b/Habitica/src/main/java/com/habitrpg/android/habitica/utils/HatchingPotionListDeserializer.java deleted file mode 100644 index 64c755d11..000000000 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/utils/HatchingPotionListDeserializer.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.habitrpg.android.habitica.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.habitrpg.android.habitica.models.inventory.HatchingPotion; - -import java.lang.reflect.Type; -import java.util.List; -import java.util.Map; - -import io.realm.Realm; -import io.realm.RealmList; - -public class HatchingPotionListDeserializer implements JsonDeserializer> { - @Override - public List deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { - RealmList vals = new RealmList<>(); - if (json.isJsonObject()) { - JsonObject object = json.getAsJsonObject(); - - Realm realm = Realm.getDefaultInstance(); - List existingItems = realm.copyFromRealm(realm.where(HatchingPotion.class).findAll()); - realm.close(); - - for (HatchingPotion item : existingItems) { - if (object.has(item.getKey())) { - JsonElement itemObject = object.get(item.getKey()); - - if (itemObject.isJsonObject()) { - HatchingPotion parsedItem = context.deserialize(itemObject.getAsJsonObject(), HatchingPotion.class); - item.setText(parsedItem.getText()); - item.setNotes(parsedItem.getNotes()); - item.setValue(parsedItem.getValue()); - item.setLimited(parsedItem.getLimited()); - item.setPremium(parsedItem.getPremium()); - } else { - item.setOwned(itemObject.getAsInt()); - } - vals.add(item); - object.remove(item.getKey()); - } - } - - for (Map.Entry entry : json.getAsJsonObject().entrySet()) { - HatchingPotion item; - if (entry.getValue().isJsonObject()) { - item = context.deserialize(entry.getValue(), HatchingPotion.class); - } else { - item = new HatchingPotion(); - item.setKey(entry.getKey()); - if (entry.getValue().isJsonNull()) { - item.setOwned(0); - } else { - item.setOwned(entry.getValue().getAsInt()); - } - } - vals.add(item); - } - } else { - for (JsonElement item : json.getAsJsonArray()) { - vals.add(context.deserialize(item.getAsJsonObject(), HatchingPotion.class)); - } - } - - return vals; - } -} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/utils/OwnedItemListDeserializer.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/utils/OwnedItemListDeserializer.kt new file mode 100644 index 000000000..ec3fb5af3 --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/utils/OwnedItemListDeserializer.kt @@ -0,0 +1,24 @@ +package com.habitrpg.android.habitica.utils + +import com.google.gson.JsonDeserializationContext +import com.google.gson.JsonDeserializer +import com.google.gson.JsonElement +import com.habitrpg.android.habitica.models.user.OwnedItem +import io.realm.RealmList +import java.lang.reflect.Type + +class OwnedItemListDeserializer: JsonDeserializer> { + override fun deserialize(json: JsonElement?, typeOfT: Type?, context: JsonDeserializationContext?): List { + val ownedItems = RealmList() + val entrySet = json?.asJsonObject?.entrySet() + if (entrySet != null) { + for (entry in entrySet) { + val item = OwnedItem() + item.key = entry.key + item.numberOwned = entry.value.asInt + ownedItems.add(item) + } + } + return ownedItems + } +} \ No newline at end of file diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/utils/QuestListDeserializer.java b/Habitica/src/main/java/com/habitrpg/android/habitica/utils/QuestListDeserializer.java deleted file mode 100644 index 1f373e909..000000000 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/utils/QuestListDeserializer.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.habitrpg.android.habitica.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.habitrpg.android.habitica.models.inventory.QuestContent; - -import java.lang.reflect.Type; -import java.util.List; -import java.util.Map; - -import io.realm.Realm; -import io.realm.RealmList; - -public class QuestListDeserializer implements JsonDeserializer> { - @Override - public List deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { - RealmList vals = new RealmList<>(); - if (json.isJsonObject()) { - JsonObject object = json.getAsJsonObject(); - - Realm realm = Realm.getDefaultInstance(); - List existingItems = realm.copyFromRealm(realm.where(QuestContent.class).findAll()); - realm.close(); - - for (QuestContent item : existingItems) { - if (object.has(item.getKey())) { - JsonElement itemObject = object.get(item.getKey()); - - if (itemObject.isJsonObject()) { - QuestContent parsedItem = context.deserialize(itemObject.getAsJsonObject(), QuestContent.class); - item.setText(parsedItem.getText()); - item.setNotes(parsedItem.getNotes()); - item.setValue(parsedItem.getValue()); - item.setPrevious(parsedItem.getPrevious()); - item.setCanBuy(parsedItem.isCanBuy()); - item.setBoss(parsedItem.getBoss()); - item.setDrop(parsedItem.getDrop()); - item.setCategory(parsedItem.getCategory()); - item.setCollect(parsedItem.getCollect()); - item.setLvl(parsedItem.getLvl()); - } else { - item.setOwned(itemObject.getAsInt()); - } - vals.add(item); - object.remove(item.getKey()); - } - } - - for (Map.Entry entry : json.getAsJsonObject().entrySet()) { - QuestContent item; - if (entry.getValue().isJsonObject()) { - item = context.deserialize(entry.getValue(), QuestContent.class); - //Make sure keys are set - item.setBoss(item.getBoss()); - item.setDrop(item.getDrop()); - } else { - item = new QuestContent(); - item.setKey(entry.getKey()); - if (entry.getValue().isJsonNull()) { - item.setOwned(0); - } else { - item.setOwned(entry.getValue().getAsInt()); - } - } - vals.add(item); - } - } else { - for (JsonElement item : json.getAsJsonArray()) { - vals.add(context.deserialize(item.getAsJsonObject(), QuestContent.class)); - } - } - - return vals; - } -} diff --git a/Habitica/src/test/java/com/habitrpg/android/habitica/data/implementation/UserRepositoryImplTest.java b/Habitica/src/test/java/com/habitrpg/android/habitica/data/implementation/UserRepositoryImplTest.java index 24037f944..0eff8f0f4 100644 --- a/Habitica/src/test/java/com/habitrpg/android/habitica/data/implementation/UserRepositoryImplTest.java +++ b/Habitica/src/test/java/com/habitrpg/android/habitica/data/implementation/UserRepositoryImplTest.java @@ -64,7 +64,7 @@ // updateData.put("preferences.timezoneOffset", 2); // verify(mockedApiClient).updateUser(updateData); // verify(mockedLocalRepository).saveUser(testUser); -// assertEquals(testUser.getItems(), newUser.getItems()); +// assertEquals(testUser.getEquipment(), newUser.getEquipment()); // assertEquals(testUser.getPreferences(), newUser.getPreferences()); // assertEquals(testUser.getFlags(), newUser.getFlags()); // }