From a6cced2ccf557b9bf715f973dbeedef62de2d3f0 Mon Sep 17 00:00:00 2001 From: Tom Hicks Date: Mon, 31 May 2021 14:34:42 -0700 Subject: [PATCH] Adds better change tracking to know if a monster needs to be saved. --- .../ui/editmonster/EditMonsterViewModel.java | 449 +++++++----------- .../utils/ChangeTrackedLiveData.java | 64 +++ 2 files changed, 226 insertions(+), 287 deletions(-) create mode 100644 app/src/main/java/com/majinnaibu/monstercards/utils/ChangeTrackedLiveData.java diff --git a/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditMonsterViewModel.java b/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditMonsterViewModel.java index 5f9b7b2..fb24062 100644 --- a/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditMonsterViewModel.java +++ b/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditMonsterViewModel.java @@ -10,150 +10,147 @@ import com.majinnaibu.monstercards.data.enums.ArmorType; import com.majinnaibu.monstercards.data.enums.ProficiencyType; import com.majinnaibu.monstercards.helpers.StringHelper; import com.majinnaibu.monstercards.models.Monster; -import com.majinnaibu.monstercards.utils.Logger; +import com.majinnaibu.monstercards.utils.ChangeTrackedLiveData; -import java.util.Objects; import java.util.UUID; @SuppressWarnings({"ConstantConditions", "unused"}) public class EditMonsterViewModel extends ViewModel { - private final MutableLiveData mMonsterId; + private final ChangeTrackedLiveData mMonsterId; private final MutableLiveData mHasError; private final MutableLiveData mHasLoaded; private final MutableLiveData mHasChanges; - private final MutableLiveData mHasCustomHitPoints; - private final MutableLiveData mHasShield; - private final MutableLiveData mCanHover; - private final MutableLiveData mHasCustomSpeed; - private final MutableLiveData mArmorType; - private final MutableLiveData mStrengthProficiency; - private final MutableLiveData mStrengthAdvantage; - private final MutableLiveData mDexterityProficiency; - private final MutableLiveData mDexterityAdvantage; - private final MutableLiveData mConstitutionProficiency; - private final MutableLiveData mConstitutionAdvantage; - private final MutableLiveData mIntelligenceProficiency; - private final MutableLiveData mIntelligenceAdvantage; - private final MutableLiveData mWisdomProficiency; - private final MutableLiveData mWisdomAdvantage; - private final MutableLiveData mCharismaProficiency; - private final MutableLiveData mCharismaAdvantage; - private final MutableLiveData mHitDice; - private final MutableLiveData mNaturalArmorBonus; - private final MutableLiveData mShieldBonus; - private final MutableLiveData mWalkSpeed; - private final MutableLiveData mBurrowSpeed; - private final MutableLiveData mClimbSpeed; - private final MutableLiveData mFlySpeed; - private final MutableLiveData mSwimSpeed; - private final MutableLiveData mStrength; - private final MutableLiveData mDexterity; - private final MutableLiveData mConstitution; - private final MutableLiveData mIntelligence; - private final MutableLiveData mWisdom; - private final MutableLiveData mCharisma; - private final MutableLiveData mName; + private final ChangeTrackedLiveData mHasCustomHitPoints; + private final ChangeTrackedLiveData mHasShield; + private final ChangeTrackedLiveData mCanHover; + private final ChangeTrackedLiveData mHasCustomSpeed; + private final ChangeTrackedLiveData mArmorType; + private final ChangeTrackedLiveData mStrengthProficiency; + private final ChangeTrackedLiveData mStrengthAdvantage; + private final ChangeTrackedLiveData mDexterityProficiency; + private final ChangeTrackedLiveData mDexterityAdvantage; + private final ChangeTrackedLiveData mConstitutionProficiency; + private final ChangeTrackedLiveData mConstitutionAdvantage; + private final ChangeTrackedLiveData mIntelligenceProficiency; + private final ChangeTrackedLiveData mIntelligenceAdvantage; + private final ChangeTrackedLiveData mWisdomProficiency; + private final ChangeTrackedLiveData mWisdomAdvantage; + private final ChangeTrackedLiveData mCharismaProficiency; + private final ChangeTrackedLiveData mCharismaAdvantage; + private final ChangeTrackedLiveData mHitDice; + private final ChangeTrackedLiveData mNaturalArmorBonus; + private final ChangeTrackedLiveData mShieldBonus; + private final ChangeTrackedLiveData mWalkSpeed; + private final ChangeTrackedLiveData mBurrowSpeed; + private final ChangeTrackedLiveData mClimbSpeed; + private final ChangeTrackedLiveData mFlySpeed; + private final ChangeTrackedLiveData mSwimSpeed; + private final ChangeTrackedLiveData mStrength; + private final ChangeTrackedLiveData mDexterity; + private final ChangeTrackedLiveData mConstitution; + private final ChangeTrackedLiveData mIntelligence; + private final ChangeTrackedLiveData mWisdom; + private final ChangeTrackedLiveData mCharisma; + private final ChangeTrackedLiveData mName; private final MutableLiveData mErrorMessage; - private final MutableLiveData mSize; - private final MutableLiveData mType; - private final MutableLiveData mSubtype; - private final MutableLiveData mAlignment; - private final MutableLiveData mCustomHitPoints; - private final MutableLiveData mCustomArmor; - private final MutableLiveData mCustomSpeed; + private final ChangeTrackedLiveData mSize; + private final ChangeTrackedLiveData mType; + private final ChangeTrackedLiveData mSubtype; + private final ChangeTrackedLiveData mAlignment; + private final ChangeTrackedLiveData mCustomHitPoints; + private final ChangeTrackedLiveData mCustomArmor; + private final ChangeTrackedLiveData mCustomSpeed; public EditMonsterViewModel() { - - mName = new MutableLiveData<>(""); - mMonsterId = new MutableLiveData<>(UUID.randomUUID()); mErrorMessage = new MutableLiveData<>(""); mHasError = new MutableLiveData<>(false); mHasLoaded = new MutableLiveData<>(false); - mSize = new MutableLiveData<>(""); - mType = new MutableLiveData<>(""); - mSubtype = new MutableLiveData<>(""); - mAlignment = new MutableLiveData<>(""); - mCustomHitPoints = new MutableLiveData<>(""); - mHitDice = new MutableLiveData<>(0); - mNaturalArmorBonus = new MutableLiveData<>(0); - mHasCustomHitPoints = new MutableLiveData<>(false); - mArmorType = new MutableLiveData<>(ArmorType.NONE); - mHasShield = new MutableLiveData<>(false); - mShieldBonus = new MutableLiveData<>(0); - mCustomArmor = new MutableLiveData<>(""); - mWalkSpeed = new MutableLiveData<>(0); - mBurrowSpeed = new MutableLiveData<>(0); - mClimbSpeed = new MutableLiveData<>(0); - mFlySpeed = new MutableLiveData<>(0); - mSwimSpeed = new MutableLiveData<>(0); - mCanHover = new MutableLiveData<>(false); - mHasCustomSpeed = new MutableLiveData<>(false); - mCustomSpeed = new MutableLiveData<>(""); - mStrength = new MutableLiveData<>(10); - mDexterity = new MutableLiveData<>(10); - mConstitution = new MutableLiveData<>(10); - mIntelligence = new MutableLiveData<>(10); - mWisdom = new MutableLiveData<>(10); - mCharisma = new MutableLiveData<>(10); - mStrengthProficiency = new MutableLiveData<>(ProficiencyType.NONE); - mStrengthAdvantage = new MutableLiveData<>(AdvantageType.NONE); - mDexterityProficiency = new MutableLiveData<>(ProficiencyType.NONE); - mDexterityAdvantage = new MutableLiveData<>(AdvantageType.NONE); - mConstitutionProficiency = new MutableLiveData<>(ProficiencyType.NONE); - mConstitutionAdvantage = new MutableLiveData<>(AdvantageType.NONE); - mIntelligenceProficiency = new MutableLiveData<>(ProficiencyType.NONE); - mIntelligenceAdvantage = new MutableLiveData<>(AdvantageType.NONE); - mWisdomProficiency = new MutableLiveData<>(ProficiencyType.NONE); - mWisdomAdvantage = new MutableLiveData<>(AdvantageType.NONE); - mCharismaProficiency = new MutableLiveData<>(ProficiencyType.NONE); - mCharismaAdvantage = new MutableLiveData<>(AdvantageType.NONE); - - // TODO: consider initializing this to true so all new monsters need saving mHasChanges = new MutableLiveData<>(false); + ChangeTrackedLiveData.OnValueDirtiedCallback onDirtied = () -> mHasChanges.setValue(true); + + mName = new ChangeTrackedLiveData<>("", onDirtied); + mMonsterId = new ChangeTrackedLiveData<>(UUID.randomUUID(), onDirtied); + mSize = new ChangeTrackedLiveData<>("", onDirtied); + mType = new ChangeTrackedLiveData<>("", onDirtied); + mSubtype = new ChangeTrackedLiveData<>("", onDirtied); + mAlignment = new ChangeTrackedLiveData<>("", onDirtied); + mCustomHitPoints = new ChangeTrackedLiveData<>("", onDirtied); + mHitDice = new ChangeTrackedLiveData<>(0, onDirtied); + mNaturalArmorBonus = new ChangeTrackedLiveData<>(0, onDirtied); + mHasCustomHitPoints = new ChangeTrackedLiveData<>(false, onDirtied); + mArmorType = new ChangeTrackedLiveData<>(ArmorType.NONE, onDirtied); + mHasShield = new ChangeTrackedLiveData<>(false, onDirtied); + mShieldBonus = new ChangeTrackedLiveData<>(0, onDirtied); + mCustomArmor = new ChangeTrackedLiveData<>("", onDirtied); + mWalkSpeed = new ChangeTrackedLiveData<>(0, onDirtied); + mBurrowSpeed = new ChangeTrackedLiveData<>(0, onDirtied); + mClimbSpeed = new ChangeTrackedLiveData<>(0, onDirtied); + mFlySpeed = new ChangeTrackedLiveData<>(0, onDirtied); + mSwimSpeed = new ChangeTrackedLiveData<>(0, onDirtied); + mCanHover = new ChangeTrackedLiveData<>(false, onDirtied); + mHasCustomSpeed = new ChangeTrackedLiveData<>(false, onDirtied); + mCustomSpeed = new ChangeTrackedLiveData<>("", onDirtied); + mStrength = new ChangeTrackedLiveData<>(10, onDirtied); + mDexterity = new ChangeTrackedLiveData<>(10, onDirtied); + mConstitution = new ChangeTrackedLiveData<>(10, onDirtied); + mIntelligence = new ChangeTrackedLiveData<>(10, onDirtied); + mWisdom = new ChangeTrackedLiveData<>(10, onDirtied); + mCharisma = new ChangeTrackedLiveData<>(10, onDirtied); + mStrengthProficiency = new ChangeTrackedLiveData<>(ProficiencyType.NONE, onDirtied); + mStrengthAdvantage = new ChangeTrackedLiveData<>(AdvantageType.NONE, onDirtied); + mDexterityProficiency = new ChangeTrackedLiveData<>(ProficiencyType.NONE, onDirtied); + mDexterityAdvantage = new ChangeTrackedLiveData<>(AdvantageType.NONE, onDirtied); + mConstitutionProficiency = new ChangeTrackedLiveData<>(ProficiencyType.NONE, onDirtied); + mConstitutionAdvantage = new ChangeTrackedLiveData<>(AdvantageType.NONE, onDirtied); + mIntelligenceProficiency = new ChangeTrackedLiveData<>(ProficiencyType.NONE, onDirtied); + mIntelligenceAdvantage = new ChangeTrackedLiveData<>(AdvantageType.NONE, onDirtied); + mWisdomProficiency = new ChangeTrackedLiveData<>(ProficiencyType.NONE, onDirtied); + mWisdomAdvantage = new ChangeTrackedLiveData<>(AdvantageType.NONE, onDirtied); + mCharismaProficiency = new ChangeTrackedLiveData<>(ProficiencyType.NONE, onDirtied); + mCharismaAdvantage = new ChangeTrackedLiveData<>(AdvantageType.NONE, onDirtied); } public void copyFromMonster(Monster monster) { - // TODO: copy from monster to other fields - mMonsterId.setValue(monster.id); - mName.setValue(monster.name); - mSize.setValue(monster.size); - mType.setValue(monster.type); - mSubtype.setValue(monster.subtype); - mAlignment.setValue(monster.alignment); - mCustomHitPoints.setValue(monster.customHPDescription); - mHitDice.setValue(monster.hitDice); - mNaturalArmorBonus.setValue(monster.naturalArmorBonus); - mHasCustomHitPoints.setValue(monster.hasCustomHP); - mArmorType.setValue(monster.armorType); - mHasShield.setValue(monster.shieldBonus != 0); - mShieldBonus.setValue(monster.shieldBonus); - mCustomArmor.setValue(monster.otherArmorDescription); - mWalkSpeed.setValue(monster.walkSpeed); - mBurrowSpeed.setValue(monster.burrowSpeed); - mClimbSpeed.setValue(monster.climbSpeed); - mFlySpeed.setValue(monster.flySpeed); - mSwimSpeed.setValue(monster.swimSpeed); - mCanHover.setValue(monster.canHover); - mHasCustomSpeed.setValue(monster.hasCustomSpeed); - mCustomSpeed.setValue(monster.customSpeedDescription); - mStrength.setValue(monster.strengthScore); - mDexterity.setValue(monster.dexterityScore); - mConstitution.setValue(monster.constitutionScore); - mIntelligence.setValue(monster.intelligenceScore); - mWisdom.setValue(monster.wisdomScore); - mCharisma.setValue(monster.charismaScore); - mStrengthProficiency.setValue(monster.strengthSavingThrowProficiency); - mStrengthAdvantage.setValue(monster.strengthSavingThrowAdvantage); - mDexterityProficiency.setValue(monster.dexteritySavingThrowProficiency); - mDexterityAdvantage.setValue(monster.dexteritySavingThrowAdvantage); - mConstitutionProficiency.setValue(monster.constitutionSavingThrowProficiency); - mConstitutionAdvantage.setValue(monster.constitutionSavingThrowAdvantage); - mIntelligenceProficiency.setValue(monster.intelligenceSavingThrowProficiency); - mIntelligenceAdvantage.setValue(monster.intelligenceSavingThrowAdvantage); - mWisdomProficiency.setValue(monster.wisdomSavingThrowProficiency); - mWisdomAdvantage.setValue(monster.wisdomSavingThrowAdvantage); - mCharismaProficiency.setValue(monster.charismaSavingThrowProficiency); - mCharismaAdvantage.setValue(monster.charismaSavingThrowAdvantage); + mMonsterId.resetValue(monster.id); + mName.resetValue(monster.name); + mSize.resetValue(monster.size); + mType.resetValue(monster.type); + mSubtype.resetValue(monster.subtype); + mAlignment.resetValue(monster.alignment); + mCustomHitPoints.resetValue(monster.customHPDescription); + mHitDice.resetValue(monster.hitDice); + mNaturalArmorBonus.resetValue(monster.naturalArmorBonus); + mHasCustomHitPoints.resetValue(monster.hasCustomHP); + mArmorType.resetValue(monster.armorType); + mHasShield.resetValue(monster.shieldBonus != 0); + mShieldBonus.resetValue(monster.shieldBonus); + mCustomArmor.resetValue(monster.otherArmorDescription); + mWalkSpeed.resetValue(monster.walkSpeed); + mBurrowSpeed.resetValue(monster.burrowSpeed); + mClimbSpeed.resetValue(monster.climbSpeed); + mFlySpeed.resetValue(monster.flySpeed); + mSwimSpeed.resetValue(monster.swimSpeed); + mCanHover.resetValue(monster.canHover); + mHasCustomSpeed.resetValue(monster.hasCustomSpeed); + mCustomSpeed.resetValue(monster.customSpeedDescription); + mStrength.resetValue(monster.strengthScore); + mDexterity.resetValue(monster.dexterityScore); + mConstitution.resetValue(monster.constitutionScore); + mIntelligence.resetValue(monster.intelligenceScore); + mWisdom.resetValue(monster.wisdomScore); + mCharisma.resetValue(monster.charismaScore); + mStrengthProficiency.resetValue(monster.strengthSavingThrowProficiency); + mStrengthAdvantage.resetValue(monster.strengthSavingThrowAdvantage); + mDexterityProficiency.resetValue(monster.dexteritySavingThrowProficiency); + mDexterityAdvantage.resetValue(monster.dexteritySavingThrowAdvantage); + mConstitutionProficiency.resetValue(monster.constitutionSavingThrowProficiency); + mConstitutionAdvantage.resetValue(monster.constitutionSavingThrowAdvantage); + mIntelligenceProficiency.resetValue(monster.intelligenceSavingThrowProficiency); + mIntelligenceAdvantage.resetValue(monster.intelligenceSavingThrowAdvantage); + mWisdomProficiency.resetValue(monster.wisdomSavingThrowProficiency); + mWisdomAdvantage.resetValue(monster.wisdomSavingThrowAdvantage); + mCharismaProficiency.resetValue(monster.charismaSavingThrowProficiency); + mCharismaAdvantage.resetValue(monster.charismaSavingThrowAdvantage); mHasChanges.setValue(false); } @@ -163,10 +160,7 @@ public class EditMonsterViewModel extends ViewModel { } public void setName(@NonNull String name) { - if (!Objects.equals(mName.getValue(), name)) { - mName.setValue(name); - mHasChanges.setValue(true); - } + mName.setValue(name); } public LiveData getMonsterId() { @@ -210,10 +204,7 @@ public class EditMonsterViewModel extends ViewModel { } public void setSize(@NonNull String size) { - if (!Objects.equals(mSize.getValue(), size)) { - mSize.setValue(size); - mHasChanges.setValue(true); - } + mSize.setValue(size); } public LiveData getType() { @@ -221,10 +212,7 @@ public class EditMonsterViewModel extends ViewModel { } public void setType(@NonNull String type) { - if (!Objects.equals(mType.getValue(), type)) { - mType.setValue(type); - mHasChanges.setValue(true); - } + mType.setValue(type); } public LiveData getSubtype() { @@ -232,10 +220,7 @@ public class EditMonsterViewModel extends ViewModel { } public void setSubtype(@NonNull String subtype) { - if (!Objects.equals(mSubtype.getValue(), subtype)) { - mSubtype.setValue(subtype); - mHasChanges.setValue(true); - } + mSubtype.setValue(subtype); } public LiveData getAlignment() { @@ -243,10 +228,7 @@ public class EditMonsterViewModel extends ViewModel { } public void setAlignment(@NonNull String alignment) { - if (!Objects.equals(mAlignment.getValue(), alignment)) { - mAlignment.setValue(alignment); - mHasChanges.setValue(true); - } + mAlignment.setValue(alignment); } public LiveData getCustomHitPoints() { @@ -254,20 +236,13 @@ public class EditMonsterViewModel extends ViewModel { } public void setCustomHitPoints(String customHitPoints) { - if (!Objects.equals(mCustomHitPoints.getValue(), customHitPoints)) { - mCustomHitPoints.setValue(customHitPoints); - mHasChanges.setValue(true); - } + mCustomHitPoints.setValue(customHitPoints); } public LiveData getHasChanges() { return mHasChanges; } - public void setHasChanges(boolean hasChanges) { - mHasChanges.setValue(hasChanges); - } - public boolean hasChanges() { return mHasChanges.getValue(); } @@ -277,10 +252,7 @@ public class EditMonsterViewModel extends ViewModel { } public void setHitDice(int hitDice) { - if (!Objects.equals(mHitDice.getValue(), hitDice)) { - mHitDice.setValue(hitDice); - mHasChanges.setValue(true); - } + mHitDice.setValue(hitDice); } public void setHitDice(String hitDice) { @@ -297,10 +269,7 @@ public class EditMonsterViewModel extends ViewModel { } public void setNaturalArmorBonus(int naturalArmorBonus) { - if (!Objects.equals(mNaturalArmorBonus.getValue(), naturalArmorBonus)) { - mNaturalArmorBonus.setValue(naturalArmorBonus); - mHasChanges.setValue(true); - } + mNaturalArmorBonus.setValue(naturalArmorBonus); } public void setNaturalArmorBonus(String naturalArmorBonus) { @@ -317,10 +286,7 @@ public class EditMonsterViewModel extends ViewModel { } public void setHasCustomHitPoints(boolean hasCustomHitPoints) { - if (!Objects.equals(mHasCustomHitPoints.getValue(), hasCustomHitPoints)) { - mHasCustomHitPoints.setValue(hasCustomHitPoints); - mHasChanges.setValue(true); - } + mHasCustomHitPoints.setValue(hasCustomHitPoints); } public boolean getHasCustomHitPointsValueAsBoolean() { @@ -332,11 +298,7 @@ public class EditMonsterViewModel extends ViewModel { } public void setArmorType(ArmorType armorType) { - Logger.logDebug(String.format("Setting ArmorType to %s", armorType.displayName)); - if (!Objects.equals(mArmorType.getValue(), armorType)) { - mArmorType.setValue(armorType); - mHasChanges.setValue(true); - } + mArmorType.setValue(armorType); } public LiveData getHasShield() { @@ -344,10 +306,7 @@ public class EditMonsterViewModel extends ViewModel { } public void setHasShield(boolean hasShield) { - if (!Objects.equals(mHasShield.getValue(), hasShield)) { - mHasShield.setValue(hasShield); - mHasChanges.setValue(true); - } + mHasShield.setValue(hasShield); } public boolean getHasShieldValueAsBoolean() { @@ -359,10 +318,7 @@ public class EditMonsterViewModel extends ViewModel { } public void setShieldBonus(int shieldBonus) { - if (!Objects.equals(mShieldBonus.getValue(), shieldBonus)) { - mShieldBonus.setValue(shieldBonus); - mHasChanges.setValue(true); - } + mShieldBonus.setValue(shieldBonus); } public void setShieldBonus(String shieldBonus) { @@ -375,10 +331,7 @@ public class EditMonsterViewModel extends ViewModel { } public void setCustomArmor(String customArmor) { - if (!Objects.equals(mCustomArmor.getValue(), customArmor)) { - mCustomArmor.setValue(customArmor); - mHasChanges.setValue(true); - } + mCustomArmor.setValue(customArmor); } public String getShieldBonusValueAsString() { @@ -390,10 +343,7 @@ public class EditMonsterViewModel extends ViewModel { } public void setWalkSpeed(int walkSpeed) { - if (!Objects.equals(mWalkSpeed.getValue(), walkSpeed)) { - mWalkSpeed.setValue(walkSpeed); - mHasChanges.setValue(true); - } + mWalkSpeed.setValue(walkSpeed); } public void incrementWalkSpeed() { @@ -409,10 +359,7 @@ public class EditMonsterViewModel extends ViewModel { } public void setBurrowSpeed(int burrowSpeed) { - if (!Objects.equals(mBurrowSpeed.getValue(), burrowSpeed)) { - mBurrowSpeed.setValue(burrowSpeed); - mHasChanges.setValue(true); - } + mBurrowSpeed.setValue(burrowSpeed); } public LiveData getClimbSpeed() { @@ -420,10 +367,7 @@ public class EditMonsterViewModel extends ViewModel { } public void setClimbSpeed(int climbSpeed) { - if (!Objects.equals(mClimbSpeed.getValue(), climbSpeed)) { - mClimbSpeed.setValue(climbSpeed); - mHasChanges.setValue(true); - } + mClimbSpeed.setValue(climbSpeed); } public LiveData getFlySpeed() { @@ -431,10 +375,7 @@ public class EditMonsterViewModel extends ViewModel { } public void setFlySpeed(int flySpeed) { - if (!Objects.equals(mFlySpeed.getValue(), flySpeed)) { - mFlySpeed.setValue(flySpeed); - mHasChanges.setValue(true); - } + mFlySpeed.setValue(flySpeed); } public LiveData getSwimSpeed() { @@ -442,10 +383,7 @@ public class EditMonsterViewModel extends ViewModel { } public void setSwimSpeed(int swimSpeed) { - if (!Objects.equals(mSwimSpeed.getValue(), swimSpeed)) { - mSwimSpeed.setValue(swimSpeed); - mHasChanges.setValue(true); - } + mSwimSpeed.setValue(swimSpeed); } public LiveData getCanHover() { @@ -453,10 +391,7 @@ public class EditMonsterViewModel extends ViewModel { } public void setCanHover(boolean canHover) { - if (!Objects.equals(mCanHover.getValue(), canHover)) { - mCanHover.setValue(canHover); - mHasChanges.setValue(true); - } + mCanHover.setValue(canHover); } public LiveData getHasCustomSpeed() { @@ -464,10 +399,7 @@ public class EditMonsterViewModel extends ViewModel { } public void setHasCustomSpeed(boolean hasCustomSpeed) { - if (!Objects.equals(mHasCustomSpeed.getValue(), hasCustomSpeed)) { - mHasCustomSpeed.setValue(hasCustomSpeed); - mHasChanges.setValue(true); - } + mHasCustomSpeed.setValue(hasCustomSpeed); } public LiveData getCustomSpeed() { @@ -475,10 +407,7 @@ public class EditMonsterViewModel extends ViewModel { } public void setCustomSpeed(String customSpeed) { - if (!Objects.equals(mCustomSpeed.getValue(), customSpeed)) { - mCustomSpeed.setValue(customSpeed); - mHasChanges.setValue(true); - } + mCustomSpeed.setValue(customSpeed); } public void incrementBurrowSpeed() { @@ -518,10 +447,7 @@ public class EditMonsterViewModel extends ViewModel { } public void setStrength(int strength) { - if (!Objects.equals(mStrength.getValue(), strength)) { - mStrength.setValue(strength); - mHasChanges.setValue(true); - } + mStrength.setValue(strength); } public void incrementStrength() { @@ -537,10 +463,7 @@ public class EditMonsterViewModel extends ViewModel { } public void setDexterity(int dexterity) { - if (!Objects.equals(mDexterity.getValue(), dexterity)) { - mDexterity.setValue(dexterity); - mHasChanges.setValue(true); - } + mDexterity.setValue(dexterity); } public void incrementDexterity() { @@ -556,10 +479,7 @@ public class EditMonsterViewModel extends ViewModel { } public void setConstitution(int constitution) { - if (!Objects.equals(mConstitution.getValue(), constitution)) { - mConstitution.setValue(constitution); - mHasChanges.setValue(true); - } + mConstitution.setValue(constitution); } public void incrementConstitution() { @@ -575,10 +495,7 @@ public class EditMonsterViewModel extends ViewModel { } public void setIntelligence(int intelligence) { - if (!Objects.equals(mIntelligence.getValue(), intelligence)) { - mIntelligence.setValue(intelligence); - mHasChanges.setValue(true); - } + mIntelligence.setValue(intelligence); } public void incrementIntelligence() { @@ -594,10 +511,7 @@ public class EditMonsterViewModel extends ViewModel { } public void setWisdom(int wisdom) { - if (!Objects.equals(mWisdom.getValue(), wisdom)) { - mWisdom.setValue(wisdom); - mHasChanges.setValue(true); - } + mWisdom.setValue(wisdom); } public void incrementWisdom() { @@ -613,10 +527,7 @@ public class EditMonsterViewModel extends ViewModel { } public void setCharisma(int charisma) { - if (!Objects.equals(mCharisma.getValue(), charisma)) { - mCharisma.setValue(charisma); - mHasChanges.setValue(true); - } + mCharisma.setValue(charisma); } public void incrementCharisma() { @@ -632,10 +543,7 @@ public class EditMonsterViewModel extends ViewModel { } public void setStrengthProficiency(ProficiencyType proficiency) { - if (!Objects.equals(mStrengthProficiency.getValue(), proficiency)) { - mStrengthProficiency.setValue(proficiency); - mHasChanges.setValue(true); - } + mStrengthProficiency.setValue(proficiency); } public LiveData getStrengthAdvantage() { @@ -643,10 +551,7 @@ public class EditMonsterViewModel extends ViewModel { } public void setStrengthAdvantage(AdvantageType advantage) { - if (!Objects.equals(mStrengthAdvantage.getValue(), advantage)) { - mStrengthAdvantage.setValue(advantage); - mHasChanges.setValue(true); - } + mStrengthAdvantage.setValue(advantage); } public LiveData getDexterityProficiency() { @@ -654,10 +559,7 @@ public class EditMonsterViewModel extends ViewModel { } public void setDexterityProficiency(ProficiencyType proficiency) { - if (!Objects.equals(mDexterityProficiency.getValue(), proficiency)) { - mDexterityProficiency.setValue(proficiency); - mHasChanges.setValue(true); - } + mDexterityProficiency.setValue(proficiency); } public LiveData getDexterityAdvantage() { @@ -665,10 +567,7 @@ public class EditMonsterViewModel extends ViewModel { } public void setDexterityAdvantage(AdvantageType advantage) { - if (!Objects.equals(mDexterityAdvantage.getValue(), advantage)) { - mDexterityAdvantage.setValue(advantage); - mHasChanges.setValue(true); - } + mDexterityAdvantage.setValue(advantage); } public LiveData getConstitutionProficiency() { @@ -676,10 +575,7 @@ public class EditMonsterViewModel extends ViewModel { } public void setConstitutionProficiency(ProficiencyType proficiency) { - if (!Objects.equals(mConstitutionProficiency.getValue(), proficiency)) { - mConstitutionProficiency.setValue(proficiency); - mHasChanges.setValue(true); - } + mConstitutionProficiency.setValue(proficiency); } public LiveData getConstitutionAdvantage() { @@ -687,10 +583,7 @@ public class EditMonsterViewModel extends ViewModel { } public void setConstitutionAdvantage(AdvantageType advantage) { - if (!Objects.equals(mConstitutionAdvantage.getValue(), advantage)) { - mConstitutionAdvantage.setValue(advantage); - mHasChanges.setValue(true); - } + mConstitutionAdvantage.setValue(advantage); } public LiveData getIntelligenceProficiency() { @@ -698,10 +591,7 @@ public class EditMonsterViewModel extends ViewModel { } public void setIntelligenceProficiency(ProficiencyType proficiency) { - if (!Objects.equals(mIntelligenceProficiency.getValue(), proficiency)) { - mIntelligenceProficiency.setValue(proficiency); - mHasChanges.setValue(true); - } + mIntelligenceProficiency.setValue(proficiency); } public LiveData getIntelligenceAdvantage() { @@ -709,10 +599,7 @@ public class EditMonsterViewModel extends ViewModel { } public void setIntelligenceAdvantage(AdvantageType advantage) { - if (!Objects.equals(mIntelligenceAdvantage.getValue(), advantage)) { - mIntelligenceAdvantage.setValue(advantage); - mHasChanges.setValue(true); - } + mIntelligenceAdvantage.setValue(advantage); } public LiveData getWisdomProficiency() { @@ -720,10 +607,7 @@ public class EditMonsterViewModel extends ViewModel { } public void setWisdomProficiency(ProficiencyType proficiency) { - if (!Objects.equals(mWisdomProficiency.getValue(), proficiency)) { - mWisdomProficiency.setValue(proficiency); - mHasChanges.setValue(true); - } + mWisdomProficiency.setValue(proficiency); } public LiveData getWisdomAdvantage() { @@ -731,10 +615,7 @@ public class EditMonsterViewModel extends ViewModel { } public void setWisdomAdvantage(AdvantageType advantage) { - if (!Objects.equals(mWisdomAdvantage.getValue(), advantage)) { - mWisdomAdvantage.setValue(advantage); - mHasChanges.setValue(true); - } + mWisdomAdvantage.setValue(advantage); } public LiveData getCharismaProficiency() { @@ -742,10 +623,7 @@ public class EditMonsterViewModel extends ViewModel { } public void setCharismaProficiency(ProficiencyType proficiency) { - if (!Objects.equals(mCharismaProficiency.getValue(), proficiency)) { - mCharismaProficiency.setValue(proficiency); - mHasChanges.setValue(true); - } + mCharismaProficiency.setValue(proficiency); } public LiveData getCharismaAdvantage() { @@ -753,10 +631,7 @@ public class EditMonsterViewModel extends ViewModel { } public void setCharismaAdvantage(AdvantageType advantage) { - if (!Objects.equals(mCharismaAdvantage.getValue(), advantage)) { - mCharismaAdvantage.setValue(advantage); - mHasChanges.setValue(true); - } + mCharismaAdvantage.setValue(advantage); } public Monster buildMonster() { diff --git a/app/src/main/java/com/majinnaibu/monstercards/utils/ChangeTrackedLiveData.java b/app/src/main/java/com/majinnaibu/monstercards/utils/ChangeTrackedLiveData.java new file mode 100644 index 0000000..d9440bd --- /dev/null +++ b/app/src/main/java/com/majinnaibu/monstercards/utils/ChangeTrackedLiveData.java @@ -0,0 +1,64 @@ +package com.majinnaibu.monstercards.utils; + +import androidx.lifecycle.MutableLiveData; + +import java.util.Objects; + +public class ChangeTrackedLiveData extends MutableLiveData { + private final OnValueChangedCallback mOnValueChangedCallback; + private final OnValueDirtiedCallback mOnValueDirtiedCallback; + private T mReferenceValue; + + public ChangeTrackedLiveData(T initialValue, OnValueChangedCallback onValueChanged, OnValueDirtiedCallback onValueDirtied) { + super(initialValue); + mReferenceValue = initialValue; + mOnValueChangedCallback = onValueChanged; + if (mOnValueChangedCallback != null) { + mOnValueChangedCallback.onValueChanged(initialValue); + } + mOnValueDirtiedCallback = onValueDirtied; + } + + public ChangeTrackedLiveData(T initialValue, OnValueChangedCallback callback) { + this(initialValue, callback, null); + } + + public ChangeTrackedLiveData(T initialValue, OnValueDirtiedCallback callback) { + this(initialValue, null, callback); + } + + public void setReferenceValue(T referenceValue) { + mReferenceValue = referenceValue; + } + + public void setCurrentValueAsReference() { + mReferenceValue = getValue(); + } + + public void resetValue(T value) { + mReferenceValue = value; + setValue(value); + } + + @Override + public void setValue(T value) { + if (!Objects.equals(getValue(), value)) { + super.setValue(value); + + if (mOnValueChangedCallback != null) { + mOnValueChangedCallback.onValueChanged(value); + } + if (!Objects.equals(mReferenceValue, value) && mOnValueDirtiedCallback != null) { + mOnValueDirtiedCallback.onValueDirtied(); + } + } + } + + public interface OnValueDirtiedCallback { + void onValueDirtied(); + } + + public interface OnValueChangedCallback { + void onValueChanged(T value); + } +}