Correctly load members items. Fixes #1141

This commit is contained in:
Phillip Thelen 2019-08-08 12:54:28 +02:00
parent 01ea0f6841
commit 3b87c4453c
5 changed files with 84 additions and 114 deletions

View file

@ -101,9 +101,9 @@ open class Member : RealmObject(), Avatar {
val petsFoundCount: Int
get() = this.items?.pets?.size ?: 0
val mountsTamedCount: Int
get() = this.items?.mounts?.size ?: 0
val username: String?
get() = authentication?.localAuthentication?.username
val formattedUsername: String?

View file

@ -27,13 +27,13 @@ import com.habitrpg.android.habitica.models.user.Stats
import com.habitrpg.android.habitica.ui.AvatarView
import com.habitrpg.android.habitica.ui.AvatarWithBarsViewModel
import com.habitrpg.android.habitica.ui.adapter.social.AchievementProfileAdapter
import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils
import com.habitrpg.android.habitica.ui.helpers.MarkdownParser
import com.habitrpg.android.habitica.ui.helpers.bindView
import com.habitrpg.android.habitica.ui.helpers.dismissKeyboard
import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog
import com.habitrpg.android.habitica.ui.helpers.loadImage
import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar
import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar.SnackbarDisplayType
import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog
import io.reactivex.Flowable
import io.reactivex.functions.Consumer
import io.realm.RealmResults
@ -213,8 +213,8 @@ class FullProfileActivity : BaseActivity() {
petsFoundCount.text = user.petsFoundCount.toString()
mountsTamedCount.text = user.mountsTamedCount.toString()
DataBindingUtils.loadImage(this.currentPetDrawee, "Pet-" + user.currentPet)
DataBindingUtils.loadImage(this.currentMountDrawee, "Mount_Icon_" + user.currentMount)
currentPetDrawee.loadImage("Pet-" + user.currentPet)
currentMountDrawee.loadImage("Mount_Icon_" + user.currentMount)
}
// endregion

View file

@ -2,13 +2,13 @@ package com.habitrpg.android.habitica.ui.helpers
import android.graphics.Bitmap
import android.graphics.PorterDuff
import androidx.core.content.ContextCompat
import androidx.core.content.res.ResourcesCompat
import android.view.View
import android.view.animation.Animation
import android.view.animation.Transformation
import android.widget.LinearLayout
import android.widget.TextView
import androidx.core.content.ContextCompat
import androidx.core.content.res.ResourcesCompat
import androidx.core.net.toUri
import com.facebook.common.executors.CallerThreadExecutor
import com.facebook.common.references.CloseableReference
@ -20,6 +20,11 @@ import com.facebook.imagepipeline.image.CloseableImage
import com.facebook.imagepipeline.request.ImageRequestBuilder
import com.habitrpg.android.habitica.R
fun SimpleDraweeView.loadImage(imageName: String, imageFormat: String = "png") {
DataBindingUtils.loadImage(this, imageName, imageFormat)
}
object DataBindingUtils {
fun loadImage(view: SimpleDraweeView?, imageName: String) {

View file

@ -1,107 +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.Quest;
import com.habitrpg.android.habitica.models.members.Member;
import com.habitrpg.android.habitica.models.members.MemberPreferences;
import com.habitrpg.android.habitica.models.social.UserParty;
import com.habitrpg.android.habitica.models.user.Authentication;
import com.habitrpg.android.habitica.models.user.ContributorInfo;
import com.habitrpg.android.habitica.models.user.Inbox;
import com.habitrpg.android.habitica.models.user.Items;
import com.habitrpg.android.habitica.models.user.Outfit;
import com.habitrpg.android.habitica.models.user.Profile;
import com.habitrpg.android.habitica.models.user.Stats;
import java.lang.reflect.Type;
import io.realm.Realm;
public class MemberSerialization implements JsonDeserializer<Member> {
@Override
public Member deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
JsonObject obj = json.getAsJsonObject();
String id = obj.get("_id").getAsString();
Realm realm = Realm.getDefaultInstance();
Member member = realm.where(Member.class).equalTo("id", id).findFirst();
if (member == null) {
member = new Member();
member.setId(id);
} else {
member = realm.copyFromRealm(member);
}
if (obj.has("stats")) {
member.setStats(context.deserialize(obj.get("stats"), Stats.class));
}
if (obj.has("inbox")) {
member.setInbox(context.deserialize(obj.get("inbox"), Inbox.class));
}
if (obj.has("preferences")) {
member.setPreferences(context.deserialize(obj.get("preferences"), MemberPreferences.class));
}
if (obj.has("profile")) {
member.setProfile(context.deserialize(obj.get("profile"), Profile.class));
}
if (obj.has("party")) {
member.setParty(context.deserialize(obj.get("party"), UserParty.class));
if (member.getParty() != null && member.getParty().getQuest() != null) {
member.getParty().getQuest().setId(member.getId());
if (!obj.get("party").getAsJsonObject().get("quest").getAsJsonObject().has("RSVPNeeded")) {
Quest quest = realm.where(Quest.class).equalTo("id", member.getId()).findFirst();
if (quest != null && quest.isValid()) {
member.getParty().getQuest().setRSVPNeeded(quest.getRSVPNeeded());
}
}
}
}
if (obj.has("items")) {
JsonObject items = obj.getAsJsonObject("items");
if (items.has("currentMount") && items.get("currentMount").isJsonPrimitive()) {
member.setCurrentMount(items.get("currentMount").getAsString());
}
if (items.has("currentPet") && items.get("currentPet").isJsonPrimitive()) {
member.setCurrentPet(items.get("currentPet").getAsString());
}
if (items.has("gear")) {
JsonObject gear = items.getAsJsonObject("gear");
if (gear.has("costume")) {
member.setCostume(context.deserialize(gear.get("costume"), Outfit.class));
}
if (gear.has("equipped")) {
member.setEquipped(context.deserialize(gear.get("equipped"), Outfit.class));
}
}
}
if (obj.has("contributor")) {
member.setContributor(context.deserialize(obj.get("contributor"), ContributorInfo.class));
}
if (obj.has("auth")) {
member.setAuthentication(context.deserialize(obj.get("auth"), Authentication.class));
}
if (obj.has("loginIncentives")) {
member.setLoginIncentives(obj.get("loginIncentives").getAsInt());
}
/*
TODO: Fix ownership storage
Right now ownership is a boolean field on the item/pet/mount/equipment itself.
Storing this data for the user can overwrite the ownership for the logged in user. The fix
is to properly store ownership of these things in a different object, similar to how the
iOS app handles it.
if (obj.has("items")) {
member.setItems(context.deserialize(obj.get("items"), Items.class));
}
*/
member.setId(member.getId());
realm.close();
return member;
}
}

View file

@ -0,0 +1,72 @@
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.JsonParseException
import com.habitrpg.android.habitica.models.inventory.Quest
import com.habitrpg.android.habitica.models.members.Member
import com.habitrpg.android.habitica.models.members.MemberPreferences
import com.habitrpg.android.habitica.models.social.UserParty
import com.habitrpg.android.habitica.models.user.*
import io.realm.Realm
import java.lang.reflect.Type
class MemberSerialization : JsonDeserializer<Member> {
@Throws(JsonParseException::class)
override fun deserialize(json: JsonElement, typeOfT: Type, context: JsonDeserializationContext): Member {
val obj = json.asJsonObject
val id = obj.get("_id").asString
val realm = Realm.getDefaultInstance()
var member = realm.where(Member::class.java).equalTo("id", id).findFirst() ?: Member()
if (member.id == null) {
member.id = id
} else {
member = realm.copyFromRealm(member)
}
if (obj.has("stats")) {
member.stats = context.deserialize<Stats>(obj.get("stats"), Stats::class.java)
}
if (obj.has("inbox")) {
member.inbox = context.deserialize<Inbox>(obj.get("inbox"), Inbox::class.java)
}
if (obj.has("preferences")) {
member.preferences = context.deserialize<MemberPreferences>(obj.get("preferences"), MemberPreferences::class.java)
}
if (obj.has("profile")) {
member.profile = context.deserialize<Profile>(obj.get("profile"), Profile::class.java)
}
if (obj.has("party")) {
member.party = context.deserialize<UserParty>(obj.get("party"), UserParty::class.java)
if (member.party != null && member.party?.quest != null) {
member.party?.quest?.id = member.id
if (!obj.get("party").asJsonObject.get("quest").asJsonObject.has("RSVPNeeded")) {
val quest = realm.where(Quest::class.java).equalTo("id", member.id).findFirst()
if (quest != null && quest.isValid) {
member.party?.quest?.RSVPNeeded = quest.RSVPNeeded
}
}
}
}
if (obj.has("items")) {
member.items = context.deserialize(obj.get("items"), Items::class.java)
}
if (obj.has("contributor")) {
member.contributor = context.deserialize<ContributorInfo>(obj.get("contributor"), ContributorInfo::class.java)
}
if (obj.has("auth")) {
member.authentication = context.deserialize<Authentication>(obj.get("auth"), Authentication::class.java)
}
if (obj.has("loginIncentives")) {
member.loginIncentives = obj.get("loginIncentives").asInt
}
member.id = member.id
realm.close()
return member
}
}