mirror of
https://github.com/sudoxnym/habitica-android.git
synced 2026-07-14 02:01:56 +00:00
Correctly load members items. Fixes #1141
This commit is contained in:
parent
01ea0f6841
commit
3b87c4453c
5 changed files with 84 additions and 114 deletions
|
|
@ -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?
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
Loading…
Reference in a new issue