Adds getters and setters for string array properties of EditMonsterViewModel.

This commit is contained in:
2021-06-20 15:33:55 -07:00
parent 44a64b3fc4
commit a4b6b184b4
2 changed files with 211 additions and 77 deletions

View File

@@ -19,10 +19,10 @@ import com.majinnaibu.monstercards.utils.ChangeTrackedLiveData;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.Set;
import java.util.UUID; import java.util.UUID;
@SuppressWarnings({"ConstantConditions", "unused"}) @SuppressWarnings({"ConstantConditions", "unused"})
@@ -78,17 +78,17 @@ public class EditMonsterViewModel extends ViewModel {
private final ChangeTrackedLiveData<String> mUnderstandsButDescription; private final ChangeTrackedLiveData<String> mUnderstandsButDescription;
private final ChangeTrackedLiveData<List<Skill>> mSkills; private final ChangeTrackedLiveData<List<Skill>> mSkills;
private final ChangeTrackedLiveData<List<String>> mSenses; private final ChangeTrackedLiveData<List<String>> mSenses;
private final ChangeTrackedLiveData<Set<String>> mDamageImmunities; private final ChangeTrackedLiveData<List<String>> mDamageImmunities;
private final ChangeTrackedLiveData<Set<String>> mDamageResistances; private final ChangeTrackedLiveData<List<String>> mDamageResistances;
private final ChangeTrackedLiveData<Set<String>> mDamageVulnerabilities; private final ChangeTrackedLiveData<List<String>> mDamageVulnerabilities;
private final ChangeTrackedLiveData<Set<String>> mConditionImmunities; private final ChangeTrackedLiveData<List<String>> mConditionImmunities;
private final ChangeTrackedLiveData<Set<Language>> mLanguages; private final ChangeTrackedLiveData<List<Language>> mLanguages;
private final ChangeTrackedLiveData<Set<Trait>> mAbilities; private final ChangeTrackedLiveData<List<Trait>> mAbilities;
private final ChangeTrackedLiveData<Set<Trait>> mActions; private final ChangeTrackedLiveData<List<Trait>> mActions;
private final ChangeTrackedLiveData<Set<Trait>> mReactions; private final ChangeTrackedLiveData<List<Trait>> mReactions;
private final ChangeTrackedLiveData<Set<Trait>> mLairActions; private final ChangeTrackedLiveData<List<Trait>> mLairActions;
private final ChangeTrackedLiveData<Set<Trait>> mLegendaryActions; private final ChangeTrackedLiveData<List<Trait>> mLegendaryActions;
private final ChangeTrackedLiveData<Set<Trait>> mRegionalActions; private final ChangeTrackedLiveData<List<Trait>> mRegionalActions;
public EditMonsterViewModel() { public EditMonsterViewModel() {
mErrorMessage = new MutableLiveData<>(""); mErrorMessage = new MutableLiveData<>("");
@@ -144,17 +144,17 @@ public class EditMonsterViewModel extends ViewModel {
mUnderstandsButDescription = new ChangeTrackedLiveData<>("", onDirtied); mUnderstandsButDescription = new ChangeTrackedLiveData<>("", onDirtied);
mSkills = new ChangeTrackedLiveData<>(new ArrayList<>(), onDirtied); mSkills = new ChangeTrackedLiveData<>(new ArrayList<>(), onDirtied);
mSenses = new ChangeTrackedLiveData<>(new ArrayList<>(), onDirtied); mSenses = new ChangeTrackedLiveData<>(new ArrayList<>(), onDirtied);
mDamageImmunities = new ChangeTrackedLiveData<>(new HashSet<>(), onDirtied); mDamageImmunities = new ChangeTrackedLiveData<>(new ArrayList<>(), onDirtied);
mDamageResistances = new ChangeTrackedLiveData<>(new HashSet<>(), onDirtied); mDamageResistances = new ChangeTrackedLiveData<>(new ArrayList<>(), onDirtied);
mDamageVulnerabilities = new ChangeTrackedLiveData<>(new HashSet<>(), onDirtied); mDamageVulnerabilities = new ChangeTrackedLiveData<>(new ArrayList<>(), onDirtied);
mConditionImmunities = new ChangeTrackedLiveData<>(new HashSet<>(), onDirtied); mConditionImmunities = new ChangeTrackedLiveData<>(new ArrayList<>(), onDirtied);
mLanguages = new ChangeTrackedLiveData<>(new HashSet<>(), onDirtied); mLanguages = new ChangeTrackedLiveData<>(new ArrayList<>(), onDirtied);
mAbilities = new ChangeTrackedLiveData<>(new HashSet<>(), onDirtied); mAbilities = new ChangeTrackedLiveData<>(new ArrayList<>(), onDirtied);
mActions = new ChangeTrackedLiveData<>(new HashSet<>(), onDirtied); mActions = new ChangeTrackedLiveData<>(new ArrayList<>(), onDirtied);
mReactions = new ChangeTrackedLiveData<>(new HashSet<>(), onDirtied); mReactions = new ChangeTrackedLiveData<>(new ArrayList<>(), onDirtied);
mLairActions = new ChangeTrackedLiveData<>(new HashSet<>(), onDirtied); mLairActions = new ChangeTrackedLiveData<>(new ArrayList<>(), onDirtied);
mLegendaryActions = new ChangeTrackedLiveData<>(new HashSet<>(), onDirtied); mLegendaryActions = new ChangeTrackedLiveData<>(new ArrayList<>(), onDirtied);
mRegionalActions = new ChangeTrackedLiveData<>(new HashSet<>(), onDirtied); mRegionalActions = new ChangeTrackedLiveData<>(new ArrayList<>(), onDirtied);
} }
public void copyFromMonster(Monster monster) { public void copyFromMonster(Monster monster) {
@@ -210,17 +210,27 @@ public class EditMonsterViewModel extends ViewModel {
ArrayList<String> senses = new ArrayList<>(monster.senses); ArrayList<String> senses = new ArrayList<>(monster.senses);
Collections.sort(senses, String::compareToIgnoreCase); Collections.sort(senses, String::compareToIgnoreCase);
mSenses.resetValue(senses); mSenses.resetValue(senses);
mDamageImmunities.resetValue(monster.damageImmunities); ArrayList<String> damageImmunities = new ArrayList<>(monster.damageImmunities);
mDamageResistances.resetValue(monster.damageResistances); Collections.sort(damageImmunities, String::compareToIgnoreCase);
mDamageVulnerabilities.resetValue(monster.damageVulnerabilities); mDamageImmunities.resetValue(damageImmunities);
mConditionImmunities.resetValue(monster.conditionImmunities); ArrayList<String> damageResistances = new ArrayList<>(monster.damageResistances);
mLanguages.resetValue(monster.languages); Collections.sort(damageResistances, String::compareToIgnoreCase);
mAbilities.resetValue(monster.abilities); mDamageResistances.resetValue(damageResistances);
mActions.resetValue(monster.actions); ArrayList<String> damageVulnerabilities = new ArrayList<>(monster.damageVulnerabilities);
mReactions.resetValue(monster.reactions); Collections.sort(damageVulnerabilities, String::compareToIgnoreCase);
mLairActions.resetValue(monster.lairActions); mDamageVulnerabilities.resetValue(damageVulnerabilities);
mLegendaryActions.resetValue(monster.legendaryActions); ArrayList<String> conditionImmunities = new ArrayList<>(monster.conditionImmunities);
mRegionalActions.resetValue(monster.regionalActions); Collections.sort(conditionImmunities, String::compareToIgnoreCase);
mConditionImmunities.resetValue(conditionImmunities);
ArrayList<Language> languages = new ArrayList<>(monster.languages);
Collections.sort(languages, (lang1, lang2) -> lang1.getName().compareToIgnoreCase(lang2.getName()));
mLanguages.resetValue(languages);
mAbilities.resetValue(new ArrayList<>(monster.abilities));
mActions.resetValue(new ArrayList<>(monster.actions));
mReactions.resetValue(new ArrayList<>(monster.reactions));
mLairActions.resetValue(new ArrayList<>(monster.lairActions));
mLegendaryActions.resetValue(new ArrayList<>(monster.legendaryActions));
mRegionalActions.resetValue(new ArrayList<>(monster.regionalActions));
mHasChanges.setValue(false); mHasChanges.setValue(false);
} }
@@ -807,44 +817,97 @@ public class EditMonsterViewModel extends ViewModel {
} }
public String addNewSense() { public String addNewSense() {
String newSense = ""; return Helpers.addItemToList(mSenses, "", String::compareToIgnoreCase);
ArrayList<String> newSenses = new ArrayList<>(mSenses.getValue());
newSenses.add(newSense);
Collections.sort(newSenses, String::compareToIgnoreCase);
mSenses.setValue(newSenses);
return newSense;
} }
public void removeSense(int position) { public void removeSense(int position) {
List<String> senses = mSenses.getValue(); Helpers.removeFromList(mSenses, position);
ArrayList<String> newSenses = new ArrayList<>(senses);
newSenses.remove(position);
mSenses.setValue(newSenses);
} }
public void replaceSense(String newSense, String oldSense) { public void replaceSense(String oldSense, String newSense) {
List<String> oldSenses = mSenses.getValue(); Helpers.replaceItemInList(mSenses, oldSense, newSense, String::compareToIgnoreCase);
if (oldSenses == null) { }
oldSenses = new ArrayList<>();
} public LiveData<List<String>> getDamageImmunities() {
boolean hasReplaced = false; return mDamageImmunities;
ArrayList<String> newSenses = new ArrayList<>(oldSenses.size()); }
for (String sense : oldSenses) {
if (Objects.equals(sense, oldSense)) { public List<String> getDamageImmunitiesArray() {
newSenses.add(newSense); return mDamageImmunities.getValue();
hasReplaced = true; }
} else {
newSenses.add(sense); public String addNewDamageImmunity() {
} return Helpers.addStringToList("", mDamageImmunities);
} }
if (!hasReplaced) {
newSenses.add(newSense); public void removeDamageImmunity(int position) {
} Helpers.removeFromList(mDamageImmunities, position);
Collections.sort(newSenses, String::compareToIgnoreCase); }
mSenses.setValue(newSenses);
public void replaceDamageImmunity(String oldDamageType, String newDamageType) {
Helpers.replaceItemInList(mDamageImmunities, oldDamageType, newDamageType, String::compareToIgnoreCase);
}
public LiveData<List<String>> getDamageResistances() {
return mDamageResistances;
}
public List<String> getDamageResistancesArray() {
return mDamageResistances.getValue();
}
public String addNewDamageResistance() {
return Helpers.addStringToList("", mDamageResistances);
}
public void removeDamageResistance(int position) {
Helpers.removeFromList(mDamageResistances, position);
}
public void replaceDamageResistance(String oldDamageType, String newDamageType) {
Helpers.replaceItemInList(mDamageResistances, oldDamageType, newDamageType, String::compareToIgnoreCase);
}
public LiveData<List<String>> getDamageVulnerabilities() {
return mDamageVulnerabilities;
}
public List<String> getDamageVulnerabilitiesArray() {
return mDamageVulnerabilities.getValue();
}
public String addNewDamageVulnerability() {
return Helpers.addStringToList("", mDamageVulnerabilities);
}
public void removeDamageVulnerability(int position) {
Helpers.removeFromList(mDamageVulnerabilities, position);
}
public void replaceDamageVulnerability(String oldDamageType, String newDamageType) {
Helpers.replaceItemInList(mDamageVulnerabilities, oldDamageType, newDamageType, String::compareToIgnoreCase);
}
public LiveData<List<String>> getConditionImmunities() {
return mConditionImmunities;
}
public List<String> getConditionImmunitiesArray() {
return mConditionImmunities.getValue();
}
public String addNewConditionImmunity() {
return Helpers.addStringToList("", mConditionImmunities);
}
public void removeConditionImmunity(int position) {
Helpers.removeFromList(mConditionImmunities, position);
}
public void replaceConditionImmunity(String oldDamageType, String newDamageType) {
Helpers.replaceItemInList(mConditionImmunities, oldDamageType, newDamageType, String::compareToIgnoreCase);
} }
// TODO: add getters and setters for lists of strings (Senses, Damage Immunities, Damage Resistances, Damage Vulnerabilities, and Condition Immunities)
// TODO: add getters and setters for Languages // TODO: add getters and setters for Languages
// TODO: add getters and setters for traits (Abilities, Actions, Reactions, Lair Actions, Legendary Actions, and Regional Actions) // TODO: add getters and setters for traits (Abilities, Actions, Reactions, Lair Actions, Legendary Actions, and Regional Actions)
@@ -897,19 +960,90 @@ public class EditMonsterViewModel extends ViewModel {
monster.understandsButDescription = mUnderstandsButDescription.getValue(); monster.understandsButDescription = mUnderstandsButDescription.getValue();
monster.skills = new HashSet<>(mSkills.getValue()); monster.skills = new HashSet<>(mSkills.getValue());
monster.senses = new HashSet<>(mSenses.getValue()); monster.senses = new HashSet<>(mSenses.getValue());
monster.damageImmunities = mDamageImmunities.getValue(); monster.damageImmunities = new HashSet<>(mDamageImmunities.getValue());
monster.damageResistances = mDamageResistances.getValue(); monster.damageResistances = new HashSet<>(mDamageResistances.getValue());
monster.damageVulnerabilities = mDamageVulnerabilities.getValue(); monster.damageVulnerabilities = new HashSet<>(mDamageVulnerabilities.getValue());
monster.conditionImmunities = mConditionImmunities.getValue(); monster.conditionImmunities = new HashSet<>(mConditionImmunities.getValue());
monster.languages = mLanguages.getValue(); monster.languages = new HashSet<>(mLanguages.getValue());
monster.abilities = mAbilities.getValue(); monster.abilities = new HashSet<>(mAbilities.getValue());
monster.actions = mActions.getValue(); monster.actions = new HashSet<>(mActions.getValue());
monster.reactions = mReactions.getValue(); monster.reactions = new HashSet<>(mReactions.getValue());
monster.lairActions = mLairActions.getValue(); monster.lairActions = new HashSet<>(mLairActions.getValue());
monster.legendaryActions = mLegendaryActions.getValue(); monster.legendaryActions = new HashSet<>(mLegendaryActions.getValue());
monster.regionalActions = mRegionalActions.getValue(); monster.regionalActions = new HashSet<>(mRegionalActions.getValue());
return monster; return monster;
} }
private static class Helpers {
static String addStringToList(String newString, MutableLiveData<List<String>> strings) {
return addItemToList(strings, newString, String::compareToIgnoreCase);
}
static <T> T addItemToList(MutableLiveData<List<T>> listData, T newItem, Comparator<? super T> comparator) {
ArrayList<T> newList = new ArrayList<>(listData.getValue());
newList.add(newItem);
if (comparator != null) {
Collections.sort(newList, comparator);
}
listData.setValue(newList);
return newItem;
}
static <T> void removeFromList(MutableLiveData<List<T>> listData, int position) {
List<T> oldList = listData.getValue();
ArrayList<T> newList = new ArrayList<>(oldList);
newList.remove(position);
listData.setValue(newList);
}
static <T> void replaceItemInList(MutableLiveData<List<T>> listData, int position, T newItem, Comparator<? super T> comparator) {
List<T> oldList = listData.getValue();
if (oldList == null) {
oldList = new ArrayList<>();
}
int size = oldList.size();
boolean hasReplaced = false;
ArrayList<T> newList = new ArrayList<>(size);
for (int index = 0; index < size; index++) {
if (index == position) {
newList.add(newItem);
hasReplaced = true;
} else {
newList.add(oldList.get(index));
}
}
if (!hasReplaced) {
newList.add(newItem);
}
if (comparator != null) {
Collections.sort(newList, comparator);
}
listData.setValue(newList);
}
static <T> void replaceItemInList(MutableLiveData<List<T>> listData, T oldItem, T newItem, Comparator<? super T> comparator) {
List<T> oldList = listData.getValue();
if (oldList == null) {
oldList = new ArrayList<>();
}
boolean hasReplaced = false;
ArrayList<T> newList = new ArrayList<>(oldList.size());
for (T item : oldList) {
if (Objects.equals(item, oldItem)) {
newList.add(newItem);
hasReplaced = true;
} else {
newList.add(item);
}
}
if (!hasReplaced) {
newList.add(newItem);
}
if (comparator != null) {
Collections.sort(newList, comparator);
}
listData.setValue(newList);
}
}
} }

View File

@@ -57,7 +57,7 @@ public class EditSenseFragment extends MCFragment {
@Override @Override
public void handleOnBackPressed() { public void handleOnBackPressed() {
if (mViewModel.hasChanges()) { if (mViewModel.hasChanges()) {
mEditMonsterViewModel.replaceSense(mViewModel.getDescription().getValue(), mOldSense); mEditMonsterViewModel.replaceSense(mOldSense, mViewModel.getDescription().getValue());
} }
Navigation.findNavController(requireView()).navigateUp(); Navigation.findNavController(requireView()).navigateUp();
} }