Renames MonsterFragment to MonsterDetailFragment to better explain its use.
This commit is contained in:
@@ -35,9 +35,6 @@ import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
|
|||||||
import io.reactivex.rxjava3.schedulers.Schedulers;
|
import io.reactivex.rxjava3.schedulers.Schedulers;
|
||||||
|
|
||||||
public class LibraryFragment extends MCFragment {
|
public class LibraryFragment extends MCFragment {
|
||||||
// TODO: TOM: rename MonsterFragment MonsterDetailFragment
|
|
||||||
|
|
||||||
private LibraryViewModel libraryViewModel;
|
|
||||||
|
|
||||||
public View onCreateView(@NonNull LayoutInflater inflater,
|
public View onCreateView(@NonNull LayoutInflater inflater,
|
||||||
ViewGroup container, Bundle savedInstanceState) {
|
ViewGroup container, Bundle savedInstanceState) {
|
||||||
|
|||||||
@@ -8,52 +8,159 @@ import android.text.Spanned;
|
|||||||
import android.util.DisplayMetrics;
|
import android.util.DisplayMetrics;
|
||||||
import android.util.TypedValue;
|
import android.util.TypedValue;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.Menu;
|
|
||||||
import android.view.MenuInflater;
|
|
||||||
import android.view.MenuItem;
|
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.ImageView;
|
|
||||||
import android.widget.LinearLayout;
|
import android.widget.LinearLayout;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.fragment.app.Fragment;
|
||||||
import androidx.lifecycle.ViewModelProvider;
|
import androidx.lifecycle.ViewModelProvider;
|
||||||
import androidx.navigation.NavDirections;
|
|
||||||
import androidx.navigation.Navigation;
|
|
||||||
|
|
||||||
import com.majinnaibu.monstercards.R;
|
import com.majinnaibu.monstercards.R;
|
||||||
import com.majinnaibu.monstercards.data.MonsterRepository;
|
import com.majinnaibu.monstercards.data.enums.AbilityScore;
|
||||||
|
import com.majinnaibu.monstercards.data.enums.AdvantageType;
|
||||||
|
import com.majinnaibu.monstercards.data.enums.ArmorType;
|
||||||
|
import com.majinnaibu.monstercards.data.enums.ChallengeRating;
|
||||||
|
import com.majinnaibu.monstercards.data.enums.ProficiencyType;
|
||||||
import com.majinnaibu.monstercards.helpers.CommonMarkHelper;
|
import com.majinnaibu.monstercards.helpers.CommonMarkHelper;
|
||||||
import com.majinnaibu.monstercards.helpers.StringHelper;
|
import com.majinnaibu.monstercards.helpers.StringHelper;
|
||||||
|
import com.majinnaibu.monstercards.models.Language;
|
||||||
import com.majinnaibu.monstercards.models.Monster;
|
import com.majinnaibu.monstercards.models.Monster;
|
||||||
import com.majinnaibu.monstercards.ui.shared.MCFragment;
|
import com.majinnaibu.monstercards.models.Skill;
|
||||||
import com.majinnaibu.monstercards.utils.Logger;
|
import com.majinnaibu.monstercards.models.Trait;
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
import io.reactivex.rxjava3.observers.DisposableSingleObserver;
|
|
||||||
|
|
||||||
|
<<<<<<<< HEAD:Android/app/src/main/java/com/majinnaibu/monstercards/ui/monster/MonsterFragment.java
|
||||||
|
@SuppressWarnings("FieldCanBeLocal")
|
||||||
|
public class MonsterFragment extends Fragment {
|
||||||
|
========
|
||||||
public class MonsterDetailFragment extends MCFragment {
|
public class MonsterDetailFragment extends MCFragment {
|
||||||
private ViewHolder mHolder;
|
>>>>>>>> d78280b (Renames MonsterFragment to MonsterDetailFragment to better explain its use.):Android/app/src/main/java/com/majinnaibu/monstercards/ui/monster/MonsterDetailFragment.java
|
||||||
|
|
||||||
private MonsterDetailViewModel mViewModel;
|
private MonsterDetailViewModel monsterDetailViewModel;
|
||||||
|
|
||||||
public View onCreateView(@NonNull LayoutInflater inflater,
|
public View onCreateView(@NonNull LayoutInflater inflater,
|
||||||
ViewGroup container, Bundle savedInstanceState) {
|
ViewGroup container, Bundle savedInstanceState) {
|
||||||
|
<<<<<<<< HEAD:Android/app/src/main/java/com/majinnaibu/monstercards/ui/monster/MonsterFragment.java
|
||||||
|
|
||||||
|
// TODO: remove this block make the monster ID a parameter to the view and get the monster from saved data (sqlite)
|
||||||
|
Monster monster = new Monster();
|
||||||
|
// Name
|
||||||
|
monster.name = "Pixie";
|
||||||
|
// Meta
|
||||||
|
monster.size = "tiny";
|
||||||
|
monster.type = "fey";
|
||||||
|
monster.subtype = "";
|
||||||
|
monster.alignment = "neutral good";
|
||||||
|
monster.armorType = ArmorType.NONE;
|
||||||
|
// Armor & Armor Class
|
||||||
|
monster.shieldBonus = 0;
|
||||||
|
monster.naturalArmorBonus = 7;
|
||||||
|
monster.otherArmorDescription = "14";
|
||||||
|
// Hit Points
|
||||||
|
monster.hitDice = 1;
|
||||||
|
monster.hasCustomHP = false;
|
||||||
|
monster.customHPDescription = "11 (2d8 + 2)";
|
||||||
|
monster.walkSpeed = 10;
|
||||||
|
monster.burrowSpeed = 0;
|
||||||
|
monster.climbSpeed = 0;
|
||||||
|
monster.flySpeed = 30;
|
||||||
|
monster.canHover = false;
|
||||||
|
monster.swimSpeed = 0;
|
||||||
|
monster.hasCustomSpeed = false;
|
||||||
|
monster.customSpeedDescription = "30 ft., swim 30 ft.";
|
||||||
|
// Ability Scores
|
||||||
|
monster.strengthScore = Integer.parseInt("2");
|
||||||
|
monster.dexterityScore = Integer.parseInt("20");
|
||||||
|
monster.constitutionScore = Integer.parseInt("8");
|
||||||
|
monster.intelligenceScore = Integer.parseInt("10");
|
||||||
|
monster.wisdomScore = Integer.parseInt("14");
|
||||||
|
monster.charismaScore = Integer.parseInt("15");
|
||||||
|
// monster.strengthScore = 10;
|
||||||
|
// monster.dexterityScore = 10;
|
||||||
|
// monster.constitutionScore = 10;
|
||||||
|
// monster.intelligenceScore = 10;
|
||||||
|
// monster.wisdomScore = 10;
|
||||||
|
// monster.charismaScore = 10;
|
||||||
|
|
||||||
|
// Saving Throws
|
||||||
|
monster.strengthSavingThrowAdvantage = AdvantageType.NONE;
|
||||||
|
monster.strengthSavingThrowProficiency = ProficiencyType.NONE;
|
||||||
|
monster.dexteritySavingThrowAdvantage = AdvantageType.ADVANTAGE;
|
||||||
|
monster.dexteritySavingThrowProficiency = ProficiencyType.PROFICIENT;
|
||||||
|
monster.constitutionSavingThrowAdvantage = AdvantageType.DISADVANTAGE;
|
||||||
|
monster.constitutionSavingThrowProficiency = ProficiencyType.EXPERTISE;
|
||||||
|
monster.intelligenceSavingThrowAdvantage = AdvantageType.NONE;
|
||||||
|
monster.intelligenceSavingThrowProficiency = ProficiencyType.EXPERTISE;
|
||||||
|
monster.wisdomSavingThrowAdvantage = AdvantageType.ADVANTAGE;
|
||||||
|
monster.wisdomSavingThrowProficiency = ProficiencyType.PROFICIENT;
|
||||||
|
monster.charismaSavingThrowAdvantage = AdvantageType.DISADVANTAGE;
|
||||||
|
monster.charismaSavingThrowProficiency = ProficiencyType.NONE;
|
||||||
|
//Skills
|
||||||
|
monster.skills.add(new Skill("perception", AbilityScore.WISDOM));
|
||||||
|
monster.skills.add(new Skill("stealth", AbilityScore.DEXTERITY));
|
||||||
|
// Damage Types
|
||||||
|
monster.damageImmunities.add("force");
|
||||||
|
monster.damageImmunities.add("lightning");
|
||||||
|
monster.damageImmunities.add("poison");
|
||||||
|
monster.damageResistances.add("cold");
|
||||||
|
monster.damageResistances.add("fire");
|
||||||
|
monster.damageResistances.add("piercing");
|
||||||
|
monster.damageVulnerabilities.add("acid");
|
||||||
|
monster.damageVulnerabilities.add("bludgeoning");
|
||||||
|
monster.damageVulnerabilities.add("necrotic");
|
||||||
|
// Condition Immunities
|
||||||
|
monster.conditionImmunities.add("blinded");
|
||||||
|
// Senses
|
||||||
|
monster.blindsightRange = 10;
|
||||||
|
monster.isBlindBeyondBlindsightRange = true;
|
||||||
|
monster.darkvisionRange = 20;
|
||||||
|
monster.tremorsenseRange = 30;
|
||||||
|
monster.truesightRange = 40;
|
||||||
|
monster.telepathyRange = 20;
|
||||||
|
monster.understandsButDescription = "doesn't care";
|
||||||
|
// Languages
|
||||||
|
monster.languages.add(new Language("English", true));
|
||||||
|
monster.languages.add(new Language("Steve", false));
|
||||||
|
monster.languages.add(new Language("Spanish", true));
|
||||||
|
monster.languages.add(new Language("French", true));
|
||||||
|
monster.languages.add(new Language("Mermataur", false));
|
||||||
|
monster.languages.add(new Language("Goldfish", false));
|
||||||
|
// Challenge Rating
|
||||||
|
monster.challengeRating = ChallengeRating.CUSTOM;
|
||||||
|
monster.customChallengeRatingDescription = "Infinite (0XP)";
|
||||||
|
monster.customProficiencyBonus = 4;
|
||||||
|
// Abilities
|
||||||
|
monster.abilities.add(new Trait("Spellcasting", "The acolyte is a 1st-level spellcaster. Its spellcasting ability is Wisdom (spell save DC [WIS SAVE], [WIS ATK] to hit with spell attacks). The acolyte has following cleric spells prepared:\n\n\n> Cantrips (at will): _light, sacred flame, thaumaturgy_\n> 1st level (3 slots): _bless, cure wounds, sanctuary_"));
|
||||||
|
monster.abilities.add(new Trait("Amphibious", "The dragon can breathe air and water."));
|
||||||
|
monster.abilities.add(new Trait("Legendary Resistance (3/Day)", "If the dragon fails a saving throw, it can choose to succeed instead."));
|
||||||
|
// Actions
|
||||||
|
monster.actions.add(new Trait("Club", "_Melee Weapon Attack:_ [STR ATK] to hit, reach 5 ft., one target. _Hit:_ 2 (1d4) bludgeoning damage."));
|
||||||
|
// END remove block
|
||||||
|
monsterViewModel = new ViewModelProvider(this).get(MonsterViewModel.class);
|
||||||
|
View root = inflater.inflate(R.layout.fragment_monster, container, false);
|
||||||
|
monsterViewModel.setMonster(monster);
|
||||||
|
|
||||||
|
final TextView monsterName = root.findViewById(R.id.name);
|
||||||
|
monsterViewModel.getName().observe(getViewLifecycleOwner(), name -> monsterName.setText(name));
|
||||||
|
|
||||||
|
final TextView monsterMeta = root.findViewById(R.id.meta);
|
||||||
|
monsterViewModel.getMeta().observe(getViewLifecycleOwner(), metaText -> monsterMeta.setText(metaText));
|
||||||
|
========
|
||||||
MonsterRepository repository = getMonsterRepository();
|
MonsterRepository repository = getMonsterRepository();
|
||||||
Bundle arguments = getArguments();
|
Bundle arguments = getArguments();
|
||||||
assert arguments != null;
|
assert arguments != null;
|
||||||
UUID monsterId = UUID.fromString(MonsterDetailFragmentArgs.fromBundle(arguments).getMonsterId());
|
UUID monsterId = UUID.fromString(MonsterDetailFragmentArgs.fromBundle(arguments).getMonsterId());
|
||||||
setHasOptionsMenu(true);
|
|
||||||
mViewModel = new ViewModelProvider(this).get(MonsterDetailViewModel.class);
|
monsterDetailViewModel = new ViewModelProvider(this).get(MonsterDetailViewModel.class);
|
||||||
|
View root = inflater.inflate(R.layout.fragment_monster, container, false);
|
||||||
|
|
||||||
repository.getMonster(monsterId).toObservable()
|
repository.getMonster(monsterId).toObservable()
|
||||||
.firstOrError()
|
.firstOrError()
|
||||||
.subscribe(new DisposableSingleObserver<Monster>() {
|
.subscribe(new DisposableSingleObserver<Monster>() {
|
||||||
@Override
|
@Override
|
||||||
public void onSuccess(@io.reactivex.rxjava3.annotations.NonNull Monster monster) {
|
public void onSuccess(@io.reactivex.rxjava3.annotations.NonNull Monster monster) {
|
||||||
mViewModel.setMonster(monster);
|
monsterDetailViewModel.setMonster(monster);
|
||||||
dispose();
|
dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -63,70 +170,145 @@ public class MonsterDetailFragment extends MCFragment {
|
|||||||
dispose();
|
dispose();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
View root = inflater.inflate(R.layout.fragment_monster, container, false);
|
|
||||||
mHolder = new ViewHolder(root);
|
|
||||||
|
|
||||||
mViewModel.getName().observe(getViewLifecycleOwner(), name -> {
|
final TextView monsterName = root.findViewById(R.id.name);
|
||||||
mHolder.name.setText(name);
|
monsterDetailViewModel.getName().observe(getViewLifecycleOwner(), monsterName::setText);
|
||||||
setTitle(getString(R.string.title_monsterDetails_fmt, name));
|
|
||||||
|
final TextView monsterMeta = root.findViewById(R.id.meta);
|
||||||
|
monsterDetailViewModel.getMeta().observe(getViewLifecycleOwner(), monsterMeta::setText);
|
||||||
|
>>>>>>>> d78280b (Renames MonsterFragment to MonsterDetailFragment to better explain its use.):Android/app/src/main/java/com/majinnaibu/monstercards/ui/monster/MonsterDetailFragment.java
|
||||||
|
|
||||||
|
final TextView monsterArmorClass = root.findViewById(R.id.armor_class);
|
||||||
|
monsterDetailViewModel.getArmorClass().observe(getViewLifecycleOwner(), armorText -> monsterArmorClass.setText(Html.fromHtml("<b>Armor Class</b> " + armorText)));
|
||||||
|
|
||||||
|
final TextView monsterHitPoints = root.findViewById(R.id.hit_points);
|
||||||
|
monsterDetailViewModel.getHitPoints().observe(getViewLifecycleOwner(), hitPoints -> monsterHitPoints.setText(Html.fromHtml("<b>Hit Points</b> " + hitPoints)));
|
||||||
|
|
||||||
|
final TextView monsterSpeed = root.findViewById(R.id.speed);
|
||||||
|
monsterDetailViewModel.getSpeed().observe(getViewLifecycleOwner(), speed -> monsterSpeed.setText(Html.fromHtml("<b>Speed</b> " + speed)));
|
||||||
|
|
||||||
|
final TextView monsterStrength = root.findViewById(R.id.strength);
|
||||||
|
<<<<<<<< HEAD:Android/app/src/main/java/com/majinnaibu/monstercards/ui/monster/MonsterFragment.java
|
||||||
|
monsterViewModel.getStrength().observe(getViewLifecycleOwner(), strength -> monsterStrength.setText(strength));
|
||||||
|
|
||||||
|
final TextView monsterDexterity = root.findViewById(R.id.dexterity);
|
||||||
|
monsterViewModel.getDexterity().observe(getViewLifecycleOwner(), dexterity -> monsterDexterity.setText(dexterity));
|
||||||
|
|
||||||
|
final TextView monsterConstitution = root.findViewById(R.id.constitution);
|
||||||
|
monsterViewModel.getConstitution().observe(getViewLifecycleOwner(), constitution -> monsterConstitution.setText(constitution));
|
||||||
|
|
||||||
|
final TextView monsterIntelligence = root.findViewById(R.id.intelligence);
|
||||||
|
monsterViewModel.getIntelligence().observe(getViewLifecycleOwner(), intelligence -> monsterIntelligence.setText(intelligence));
|
||||||
|
|
||||||
|
final TextView monsterWisdom = root.findViewById(R.id.wisdom);
|
||||||
|
monsterViewModel.getWisdom().observe(getViewLifecycleOwner(), wisdom -> monsterWisdom.setText(wisdom));
|
||||||
|
|
||||||
|
final TextView monsterCharisma = root.findViewById(R.id.charisma);
|
||||||
|
monsterViewModel.getCharisma().observe(getViewLifecycleOwner(), charisma -> monsterCharisma.setText(charisma));
|
||||||
|
========
|
||||||
|
monsterDetailViewModel.getStrength().observe(getViewLifecycleOwner(), monsterStrength::setText);
|
||||||
|
|
||||||
|
final TextView monsterDexterity = root.findViewById(R.id.dexterity);
|
||||||
|
monsterDetailViewModel.getDexterity().observe(getViewLifecycleOwner(), monsterDexterity::setText);
|
||||||
|
|
||||||
|
final TextView monsterConstitution = root.findViewById(R.id.constitution);
|
||||||
|
monsterDetailViewModel.getConstitution().observe(getViewLifecycleOwner(), monsterConstitution::setText);
|
||||||
|
|
||||||
|
final TextView monsterIntelligence = root.findViewById(R.id.intelligence);
|
||||||
|
monsterDetailViewModel.getIntelligence().observe(getViewLifecycleOwner(), monsterIntelligence::setText);
|
||||||
|
|
||||||
|
final TextView monsterWisdom = root.findViewById(R.id.wisdom);
|
||||||
|
monsterDetailViewModel.getWisdom().observe(getViewLifecycleOwner(), monsterWisdom::setText);
|
||||||
|
|
||||||
|
final TextView monsterCharisma = root.findViewById(R.id.charisma);
|
||||||
|
monsterDetailViewModel.getCharisma().observe(getViewLifecycleOwner(), monsterCharisma::setText);
|
||||||
|
>>>>>>>> d78280b (Renames MonsterFragment to MonsterDetailFragment to better explain its use.):Android/app/src/main/java/com/majinnaibu/monstercards/ui/monster/MonsterDetailFragment.java
|
||||||
|
|
||||||
|
final TextView monsterSavingThrows = root.findViewById(R.id.saving_throws);
|
||||||
|
monsterDetailViewModel.getSavingThrows().observe(getViewLifecycleOwner(), savingThrows -> {
|
||||||
|
if (StringHelper.isNullOrEmpty(savingThrows)) {
|
||||||
|
monsterSavingThrows.setVisibility(View.GONE);
|
||||||
|
} else {
|
||||||
|
monsterSavingThrows.setVisibility(View.VISIBLE);
|
||||||
|
}
|
||||||
|
monsterSavingThrows.setText(Html.fromHtml("<b>Saving Throws</b> " + savingThrows));
|
||||||
});
|
});
|
||||||
mViewModel.getMeta().observe(getViewLifecycleOwner(), mHolder.meta::setText);
|
|
||||||
mViewModel.getArmorClass().observe(getViewLifecycleOwner(), armorText -> setupLabeledTextView(mHolder.armorClass, armorText, R.string.label_armor_class));
|
|
||||||
mViewModel.getHitPoints().observe(getViewLifecycleOwner(), hitPoints -> setupLabeledTextView(mHolder.hitPoints, hitPoints, R.string.label_hit_points));
|
|
||||||
mViewModel.getSpeed().observe(getViewLifecycleOwner(), speed -> setupLabeledTextView(mHolder.speed, speed, R.string.label_speed));
|
|
||||||
mViewModel.getStrength().observe(getViewLifecycleOwner(), mHolder.strength::setText);
|
|
||||||
mViewModel.getDexterity().observe(getViewLifecycleOwner(), mHolder.dexterity::setText);
|
|
||||||
mViewModel.getConstitution().observe(getViewLifecycleOwner(), mHolder.constitution::setText);
|
|
||||||
mViewModel.getIntelligence().observe(getViewLifecycleOwner(), mHolder.intelligence::setText);
|
|
||||||
mViewModel.getWisdom().observe(getViewLifecycleOwner(), mHolder.wisdom::setText);
|
|
||||||
mViewModel.getCharisma().observe(getViewLifecycleOwner(), mHolder.charisma::setText);
|
|
||||||
mViewModel.getSavingThrows().observe(getViewLifecycleOwner(), savingThrows -> setupOptionalTextView(mHolder.savingThrows, savingThrows, R.string.label_saving_throws));
|
|
||||||
mViewModel.getSkills().observe(getViewLifecycleOwner(), skills -> setupOptionalTextView(mHolder.skills, skills, R.string.label_skills));
|
|
||||||
mViewModel.getDamageVulnerabilities().observe(getViewLifecycleOwner(), damageTypes -> setupOptionalTextView(mHolder.damageVulnerabilities, damageTypes, R.string.label_damage_vulnerabilities));
|
|
||||||
mViewModel.getDamageResistances().observe(getViewLifecycleOwner(), damageTypes -> setupOptionalTextView(mHolder.damageResistances, damageTypes, R.string.label_damage_resistances));
|
|
||||||
mViewModel.getDamageImmunities().observe(getViewLifecycleOwner(), damageTypes -> setupOptionalTextView(mHolder.damageImmunities, damageTypes, R.string.label_damage_immunities));
|
|
||||||
mViewModel.getConditionImmunities().observe(getViewLifecycleOwner(), conditionImmunities -> setupOptionalTextView(mHolder.conditionImmunities, conditionImmunities, R.string.label_condition_immunities));
|
|
||||||
mViewModel.getSenses().observe(getViewLifecycleOwner(), senses -> setupOptionalTextView(mHolder.senses, senses, R.string.label_senses));
|
|
||||||
mViewModel.getLanguages().observe(getViewLifecycleOwner(), languages -> setupOptionalTextView(mHolder.languages, languages, R.string.label_languages));
|
|
||||||
mViewModel.getChallenge().observe(getViewLifecycleOwner(), challengeRating -> setupLabeledTextView(mHolder.challenge, challengeRating, R.string.label_challenge_rating));
|
|
||||||
mViewModel.getAbilities().observe(getViewLifecycleOwner(), abilities -> setupTraitList(mHolder.abilities, abilities));
|
|
||||||
mViewModel.getActions().observe(getViewLifecycleOwner(), actions -> setupTraitList(mHolder.actions, actions, mHolder.actions_label, mHolder.actions_divider));
|
|
||||||
mViewModel.getReactions().observe(getViewLifecycleOwner(), reactions -> setupTraitList(mHolder.reactions, reactions, mHolder.reactions_label, mHolder.reactions_divider));
|
|
||||||
mViewModel.getRegionalEffects().observe(getViewLifecycleOwner(), regionalEffects -> setupTraitList(mHolder.regionalEffects, regionalEffects, mHolder.regionalEffects_label, mHolder.regionalEffects_divider));
|
|
||||||
mViewModel.getLairActions().observe(getViewLifecycleOwner(), lairActions -> setupTraitList(mHolder.lairActions, lairActions, mHolder.lairActions_label, mHolder.lairActions_divider));
|
|
||||||
mViewModel.getLegendaryActions().observe(getViewLifecycleOwner(), legendaryActions -> setupTraitList(mHolder.legendaryActions, legendaryActions, mHolder.legendaryActions_label, mHolder.legendaryActions_divider));
|
|
||||||
|
|
||||||
return root;
|
final TextView monsterSkills = root.findViewById(R.id.skills);
|
||||||
}
|
monsterDetailViewModel.getSkills().observe(getViewLifecycleOwner(), skills -> {
|
||||||
|
if (StringHelper.isNullOrEmpty(skills)) {
|
||||||
private void setupLabeledTextView(@NonNull TextView view, String text, int titleId) {
|
monsterSkills.setVisibility(View.GONE);
|
||||||
String title = getString(titleId);
|
|
||||||
String fullText = String.format("<b>%s</b> %s", title, text);
|
|
||||||
view.setText(Html.fromHtml(fullText));
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setupOptionalTextView(TextView root, String text, int titleId) {
|
|
||||||
String title = getString(titleId);
|
|
||||||
if (StringHelper.isNullOrEmpty(text)) {
|
|
||||||
root.setVisibility(View.GONE);
|
|
||||||
} else {
|
} else {
|
||||||
root.setVisibility(View.VISIBLE);
|
monsterSkills.setVisibility(View.VISIBLE);
|
||||||
}
|
}
|
||||||
Spanned formatted;
|
monsterSkills.setText(Html.fromHtml("<b>Skills</b> " + skills));
|
||||||
if (StringHelper.isNullOrEmpty(title)) {
|
});
|
||||||
formatted = Html.fromHtml(text);
|
|
||||||
|
final TextView monsterDamageVulnerabilities = root.findViewById(R.id.damage_vulnerabilities);
|
||||||
|
monsterDetailViewModel.getDamageVulnerabilities().observe(getViewLifecycleOwner(), damageType -> {
|
||||||
|
if (StringHelper.isNullOrEmpty(damageType)) {
|
||||||
|
monsterDamageVulnerabilities.setVisibility(View.GONE);
|
||||||
} else {
|
} else {
|
||||||
formatted = Html.fromHtml(String.format("<b>%s</b> %s", title, text));
|
monsterDamageVulnerabilities.setVisibility(View.VISIBLE);
|
||||||
}
|
|
||||||
root.setText(formatted);
|
|
||||||
}
|
}
|
||||||
|
monsterDamageVulnerabilities.setText(Html.fromHtml("<b>Damage Vulnerabilities</b> " + damageType));
|
||||||
|
});
|
||||||
|
|
||||||
private void setupTraitList(@NonNull LinearLayout root, @NonNull List<String> traits) {
|
final TextView monsterDamageResistances = root.findViewById(R.id.damage_resistances);
|
||||||
setupTraitList(root, traits, null, null);
|
monsterDetailViewModel.getDamageResistances().observe(getViewLifecycleOwner(), damageType -> {
|
||||||
|
if (StringHelper.isNullOrEmpty(damageType)) {
|
||||||
|
monsterDamageResistances.setVisibility(View.GONE);
|
||||||
|
} else {
|
||||||
|
monsterDamageResistances.setVisibility(View.VISIBLE);
|
||||||
}
|
}
|
||||||
|
monsterDamageResistances.setText(Html.fromHtml("<b>Damage Resistances</b> " + damageType));
|
||||||
|
});
|
||||||
|
|
||||||
private void setupTraitList(@NonNull LinearLayout root, @NonNull List<String> traits, View label, View divider) {
|
final TextView monsterDamageImmunities = root.findViewById(R.id.damage_immunities);
|
||||||
int visibility = traits.size() > 0 ? View.VISIBLE : View.GONE;
|
monsterDetailViewModel.getDamageImmunities().observe(getViewLifecycleOwner(), damageType -> {
|
||||||
|
if (StringHelper.isNullOrEmpty(damageType)) {
|
||||||
|
monsterDamageImmunities.setVisibility(View.GONE);
|
||||||
|
} else {
|
||||||
|
monsterDamageImmunities.setVisibility(View.VISIBLE);
|
||||||
|
}
|
||||||
|
monsterDamageImmunities.setText(Html.fromHtml("<b>Damage Immunities</b> " + damageType));
|
||||||
|
});
|
||||||
|
|
||||||
|
final TextView monsterConditionImmunities = root.findViewById(R.id.condition_immunities);
|
||||||
|
monsterDetailViewModel.getConditionImmunities().observe(getViewLifecycleOwner(), conditionImmunities -> {
|
||||||
|
if (StringHelper.isNullOrEmpty(conditionImmunities)) {
|
||||||
|
monsterConditionImmunities.setVisibility(View.GONE);
|
||||||
|
} else {
|
||||||
|
monsterConditionImmunities.setVisibility(View.VISIBLE);
|
||||||
|
}
|
||||||
|
monsterConditionImmunities.setText(Html.fromHtml("<b>Condition Immunities</b> " + conditionImmunities));
|
||||||
|
});
|
||||||
|
|
||||||
|
final TextView monsterSenses = root.findViewById(R.id.senses);
|
||||||
|
monsterDetailViewModel.getSenses().observe(getViewLifecycleOwner(), senses -> {
|
||||||
|
if (StringHelper.isNullOrEmpty(senses)) {
|
||||||
|
monsterSenses.setVisibility(View.GONE);
|
||||||
|
} else {
|
||||||
|
monsterSenses.setVisibility(View.VISIBLE);
|
||||||
|
}
|
||||||
|
monsterSenses.setText(Html.fromHtml("<b>Senses</b> " + senses));
|
||||||
|
});
|
||||||
|
|
||||||
|
final TextView monsterLanguages = root.findViewById(R.id.languages);
|
||||||
|
monsterDetailViewModel.getLanguages().observe(getViewLifecycleOwner(), languages -> {
|
||||||
|
if (StringHelper.isNullOrEmpty(languages)) {
|
||||||
|
monsterLanguages.setVisibility(View.GONE);
|
||||||
|
} else {
|
||||||
|
monsterLanguages.setVisibility(View.VISIBLE);
|
||||||
|
}
|
||||||
|
monsterLanguages.setText(Html.fromHtml("<b>Languages</b> " + languages));
|
||||||
|
});
|
||||||
|
|
||||||
|
final TextView monsterChallenge = root.findViewById(R.id.challenge);
|
||||||
|
monsterDetailViewModel.getChallenge().observe(getViewLifecycleOwner(), challengeRating -> monsterChallenge.setText(Html.fromHtml("<b>Challenge</b> " + challengeRating)));
|
||||||
|
|
||||||
|
final LinearLayout monsterAbilities = root.findViewById(R.id.abilities);
|
||||||
|
monsterDetailViewModel.getAbilities().observe(getViewLifecycleOwner(), abilities -> {
|
||||||
Context context = getContext();
|
Context context = getContext();
|
||||||
DisplayMetrics displayMetrics = null;
|
DisplayMetrics displayMetrics = null;
|
||||||
if (context != null) {
|
if (context != null) {
|
||||||
@@ -135,122 +317,45 @@ public class MonsterDetailFragment extends MCFragment {
|
|||||||
displayMetrics = resources.getDisplayMetrics();
|
displayMetrics = resources.getDisplayMetrics();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
root.removeAllViews();
|
monsterAbilities.removeAllViews();
|
||||||
for (String action : traits) {
|
if (abilities != null) {
|
||||||
TextView tvAction = new TextView(getContext());
|
for (String ability : abilities) {
|
||||||
|
TextView tvAbility = new TextView(context);
|
||||||
// TODO: Handle multiline block quotes specially so they stay multiline.
|
// TODO: Handle multiline block quotes specially so they stay multiline.
|
||||||
// TODO: Replace QuoteSpans in the result of fromHtml with something like this https://stackoverflow.com/questions/7717567/how-to-style-blockquotes-in-android-textviews to make them indent as expected
|
// TODO: Replace QuoteSpans in the result of fromHtml with something like this https://stackoverflow.com/questions/7717567/how-to-style-blockquotes-in-android-textviews to make them indent as expected
|
||||||
|
Spanned spannedText = Html.fromHtml(CommonMarkHelper.toHtml(ability));
|
||||||
|
tvAbility.setText(spannedText);
|
||||||
|
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
|
||||||
|
layoutParams.topMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, displayMetrics);
|
||||||
|
tvAbility.setLayoutParams(layoutParams);
|
||||||
|
monsterAbilities.addView(tvAbility);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
final LinearLayout monsterActions = root.findViewById(R.id.actions);
|
||||||
|
monsterDetailViewModel.getActions().observe(getViewLifecycleOwner(), actions -> {
|
||||||
|
Context context = getContext();
|
||||||
|
DisplayMetrics displayMetrics = null;
|
||||||
|
if (context != null) {
|
||||||
|
Resources resources = context.getResources();
|
||||||
|
if (resources != null) {
|
||||||
|
displayMetrics = resources.getDisplayMetrics();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
monsterActions.removeAllViews();
|
||||||
|
if (actions != null) {
|
||||||
|
for (String action : actions) {
|
||||||
|
TextView tvAction = new TextView(getContext());
|
||||||
tvAction.setText(Html.fromHtml(CommonMarkHelper.toHtml(action)));
|
tvAction.setText(Html.fromHtml(CommonMarkHelper.toHtml(action)));
|
||||||
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
|
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
|
||||||
layoutParams.topMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, displayMetrics);
|
layoutParams.topMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, displayMetrics);
|
||||||
tvAction.setLayoutParams(layoutParams);
|
tvAction.setLayoutParams(layoutParams);
|
||||||
root.addView(tvAction);
|
monsterActions.addView(tvAction);
|
||||||
}
|
|
||||||
root.setVisibility(visibility);
|
|
||||||
if (label != null) {
|
|
||||||
label.setVisibility(visibility);
|
|
||||||
}
|
|
||||||
if (divider != null) {
|
|
||||||
divider.setVisibility(visibility);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
});
|
||||||
|
|
||||||
@Override
|
return root;
|
||||||
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
|
|
||||||
inflater.inflate(R.menu.monster_detail_menu, menu);
|
|
||||||
super.onCreateOptionsMenu(menu, inflater);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
|
|
||||||
if (item.getItemId() == R.id.menu_action_edit_monster) {
|
|
||||||
UUID monsterId = mViewModel.getId().getValue();
|
|
||||||
if (monsterId != null) {
|
|
||||||
NavDirections action = MonsterDetailFragmentDirections.actionNavigationMonsterToEditMonsterFragment(monsterId.toString());
|
|
||||||
Navigation.findNavController(requireView()).navigate(action);
|
|
||||||
} else {
|
|
||||||
Logger.logWTF("monsterId cannot be null.");
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return super.onOptionsItemSelected(item);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static class ViewHolder {
|
|
||||||
final TextView name;
|
|
||||||
final TextView meta;
|
|
||||||
final TextView armorClass;
|
|
||||||
final TextView hitPoints;
|
|
||||||
final TextView speed;
|
|
||||||
final TextView strength;
|
|
||||||
final TextView dexterity;
|
|
||||||
final TextView constitution;
|
|
||||||
final TextView intelligence;
|
|
||||||
final TextView wisdom;
|
|
||||||
final TextView charisma;
|
|
||||||
final TextView savingThrows;
|
|
||||||
final TextView skills;
|
|
||||||
final TextView damageVulnerabilities;
|
|
||||||
final TextView damageResistances;
|
|
||||||
final TextView damageImmunities;
|
|
||||||
final TextView conditionImmunities;
|
|
||||||
final TextView senses;
|
|
||||||
final TextView languages;
|
|
||||||
final TextView challenge;
|
|
||||||
final LinearLayout abilities;
|
|
||||||
final LinearLayout actions;
|
|
||||||
final TextView actions_label;
|
|
||||||
final ImageView actions_divider;
|
|
||||||
final LinearLayout reactions;
|
|
||||||
final TextView reactions_label;
|
|
||||||
final ImageView reactions_divider;
|
|
||||||
final LinearLayout legendaryActions;
|
|
||||||
final TextView legendaryActions_label;
|
|
||||||
final ImageView legendaryActions_divider;
|
|
||||||
final LinearLayout lairActions;
|
|
||||||
final TextView lairActions_label;
|
|
||||||
final ImageView lairActions_divider;
|
|
||||||
final LinearLayout regionalEffects;
|
|
||||||
final TextView regionalEffects_label;
|
|
||||||
final ImageView regionalEffects_divider;
|
|
||||||
|
|
||||||
ViewHolder(@NonNull View root) {
|
|
||||||
name = root.findViewById(R.id.name);
|
|
||||||
meta = root.findViewById(R.id.meta);
|
|
||||||
armorClass = root.findViewById(R.id.armorClass);
|
|
||||||
hitPoints = root.findViewById(R.id.hitPoints);
|
|
||||||
speed = root.findViewById(R.id.speed);
|
|
||||||
strength = root.findViewById(R.id.strength);
|
|
||||||
dexterity = root.findViewById(R.id.dexterity);
|
|
||||||
constitution = root.findViewById(R.id.constitution);
|
|
||||||
intelligence = root.findViewById(R.id.intelligence);
|
|
||||||
wisdom = root.findViewById(R.id.wisdom);
|
|
||||||
charisma = root.findViewById(R.id.charisma);
|
|
||||||
savingThrows = root.findViewById(R.id.savingThrows);
|
|
||||||
skills = root.findViewById(R.id.skills);
|
|
||||||
damageVulnerabilities = root.findViewById(R.id.damageVulnerabilities);
|
|
||||||
damageResistances = root.findViewById(R.id.damageResistances);
|
|
||||||
damageImmunities = root.findViewById(R.id.damageImmunities);
|
|
||||||
conditionImmunities = root.findViewById(R.id.conditionImmunities);
|
|
||||||
senses = root.findViewById(R.id.senses);
|
|
||||||
languages = root.findViewById(R.id.languages);
|
|
||||||
challenge = root.findViewById(R.id.challenge);
|
|
||||||
abilities = root.findViewById(R.id.abilities);
|
|
||||||
actions = root.findViewById(R.id.actions);
|
|
||||||
actions_divider = root.findViewById(R.id.actions_divider);
|
|
||||||
actions_label = root.findViewById(R.id.actions_label);
|
|
||||||
reactions = root.findViewById(R.id.reactions);
|
|
||||||
reactions_divider = root.findViewById(R.id.reactions_divider);
|
|
||||||
reactions_label = root.findViewById(R.id.reactions_label);
|
|
||||||
legendaryActions = root.findViewById(R.id.legendaryActions);
|
|
||||||
legendaryActions_divider = root.findViewById(R.id.legendaryActions_divider);
|
|
||||||
legendaryActions_label = root.findViewById(R.id.legendaryActions_label);
|
|
||||||
lairActions = root.findViewById(R.id.lairActions);
|
|
||||||
lairActions_divider = root.findViewById(R.id.lairActions_divider);
|
|
||||||
lairActions_label = root.findViewById(R.id.lairActions_label);
|
|
||||||
regionalEffects = root.findViewById(R.id.regionalEffects);
|
|
||||||
regionalEffects_divider = root.findViewById(R.id.regionalEffects_divider);
|
|
||||||
regionalEffects_label = root.findViewById(R.id.regionalEffects_label);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
package com.majinnaibu.monstercards.ui.monster;
|
package com.majinnaibu.monstercards.ui.monster;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import androidx.lifecycle.LiveData;
|
import androidx.lifecycle.LiveData;
|
||||||
import androidx.lifecycle.MutableLiveData;
|
import androidx.lifecycle.MutableLiveData;
|
||||||
import androidx.lifecycle.ViewModel;
|
import androidx.lifecycle.ViewModel;
|
||||||
@@ -9,180 +8,150 @@ import com.majinnaibu.monstercards.models.Monster;
|
|||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
public class MonsterDetailViewModel extends ViewModel {
|
public class MonsterDetailViewModel extends ViewModel {
|
||||||
|
|
||||||
private final MutableLiveData<List<String>> mAbilities;
|
|
||||||
private final MutableLiveData<List<String>> mActions;
|
|
||||||
private final MutableLiveData<String> mArmorClass;
|
|
||||||
private final MutableLiveData<String> mChallenge;
|
|
||||||
private final MutableLiveData<String> mCharisma;
|
|
||||||
private final MutableLiveData<String> mConditionImmunities;
|
|
||||||
private final MutableLiveData<String> mConstitution;
|
|
||||||
private final MutableLiveData<String> mDamageResistances;
|
|
||||||
private final MutableLiveData<String> mDamageImmunities;
|
|
||||||
private final MutableLiveData<String> mDamageVulnerabilities;
|
|
||||||
private final MutableLiveData<String> mDexterity;
|
|
||||||
private final MutableLiveData<String> mHitPoints;
|
|
||||||
private final MutableLiveData<String> mIntelligence;
|
|
||||||
private final MutableLiveData<List<String>> mLairActions;
|
|
||||||
private final MutableLiveData<String> mLanguages;
|
|
||||||
private final MutableLiveData<List<String>> mLegendaryActions;
|
|
||||||
private final MutableLiveData<String> mMeta;
|
|
||||||
private final MutableLiveData<String> mName;
|
|
||||||
private final MutableLiveData<List<String>> mReactions;
|
|
||||||
private final MutableLiveData<List<String>> mRegionalEffects;
|
|
||||||
private final MutableLiveData<String> mSavingThrows;
|
|
||||||
private final MutableLiveData<String> mSenses;
|
|
||||||
private final MutableLiveData<String> mSkills;
|
|
||||||
private final MutableLiveData<String> mSpeed;
|
|
||||||
private final MutableLiveData<String> mStrength;
|
|
||||||
private final MutableLiveData<String> mWisdom;
|
|
||||||
private final MutableLiveData<UUID> mMonsterId;
|
|
||||||
private Monster mMonster;
|
|
||||||
|
|
||||||
public MonsterDetailViewModel() {
|
public MonsterDetailViewModel() {
|
||||||
mMonster = null;
|
mMonster = null;
|
||||||
mAbilities = new MutableLiveData<>(new ArrayList<>());
|
mAbilities = new MutableLiveData<>();
|
||||||
mActions = new MutableLiveData<>(new ArrayList<>());
|
mAbilities.setValue(new ArrayList<String>());
|
||||||
mArmorClass = new MutableLiveData<>("");
|
mActions = new MutableLiveData<>();
|
||||||
mChallenge = new MutableLiveData<>("");
|
mActions.setValue(new ArrayList<String>());
|
||||||
mCharisma = new MutableLiveData<>("");
|
mArmorClass = new MutableLiveData<>();
|
||||||
mConditionImmunities = new MutableLiveData<>("");
|
mArmorClass.setValue("");
|
||||||
mConstitution = new MutableLiveData<>("");
|
mChallenge = new MutableLiveData<>();
|
||||||
mDamageImmunities = new MutableLiveData<>("");
|
mChallenge.setValue("");
|
||||||
mDamageResistances = new MutableLiveData<>("");
|
mCharisma = new MutableLiveData<>();
|
||||||
mDamageVulnerabilities = new MutableLiveData<>("");
|
mCharisma.setValue("");
|
||||||
mDexterity = new MutableLiveData<>("");
|
mConditionImmunities = new MutableLiveData<>();
|
||||||
mHitPoints = new MutableLiveData<>("");
|
mConditionImmunities.setValue("");
|
||||||
mIntelligence = new MutableLiveData<>("");
|
mConstitution = new MutableLiveData<>();
|
||||||
mLairActions = new MutableLiveData<>(new ArrayList<>());
|
mConstitution.setValue("");
|
||||||
mLanguages = new MutableLiveData<>("");
|
mDamageImmunities = new MutableLiveData<>();
|
||||||
mLegendaryActions = new MutableLiveData<>(new ArrayList<>());
|
mDamageImmunities.setValue("");
|
||||||
mMeta = new MutableLiveData<>("");
|
mDamageResistances = new MutableLiveData<>();
|
||||||
mName = new MutableLiveData<>("");
|
mDamageResistances.setValue("");
|
||||||
mReactions = new MutableLiveData<>(new ArrayList<>());
|
mDamageVulnerabilities = new MutableLiveData<>();
|
||||||
mRegionalEffects = new MutableLiveData<>(new ArrayList<>());
|
mDamageVulnerabilities.setValue("");
|
||||||
mSavingThrows = new MutableLiveData<>("");
|
mDexterity = new MutableLiveData<>();
|
||||||
mSenses = new MutableLiveData<>("");
|
mDexterity.setValue("");
|
||||||
mSkills = new MutableLiveData<>("");
|
mHitPoints = new MutableLiveData<>();
|
||||||
mSpeed = new MutableLiveData<>("");
|
mHitPoints.setValue("");
|
||||||
mStrength = new MutableLiveData<>("");
|
mIntelligence = new MutableLiveData<>();
|
||||||
mWisdom = new MutableLiveData<>("");
|
mIntelligence.setValue("");
|
||||||
mMonsterId = new MutableLiveData<>(UUID.fromString("00000000-0000-0000-0000-000000000000"));
|
mLanguages = new MutableLiveData<>();
|
||||||
|
mLanguages.setValue("");
|
||||||
|
mMeta = new MutableLiveData<>();
|
||||||
|
mMeta.setValue("");
|
||||||
|
mName = new MutableLiveData<>();
|
||||||
|
mName.setValue("");
|
||||||
|
mSavingThrows = new MutableLiveData<>();
|
||||||
|
mSavingThrows.setValue("");
|
||||||
|
mSenses = new MutableLiveData<>();
|
||||||
|
mSenses.setValue("");
|
||||||
|
mSkills = new MutableLiveData<>();
|
||||||
|
mSkills.setValue("");
|
||||||
|
mSpeed = new MutableLiveData<>();
|
||||||
|
mSpeed.setValue("");
|
||||||
|
mStrength = new MutableLiveData<>();
|
||||||
|
mStrength.setValue("");
|
||||||
|
mWisdom = new MutableLiveData<>();
|
||||||
|
mWisdom.setValue("");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private MutableLiveData<List<String>> mAbilities;
|
||||||
public LiveData<List<String>> getAbilities() {
|
public LiveData<List<String>> getAbilities() {
|
||||||
return mAbilities;
|
return mAbilities;
|
||||||
}
|
}
|
||||||
|
private MutableLiveData<List<String>> mActions;
|
||||||
public LiveData<List<String>> getActions() {
|
public LiveData<List<String>> getActions() {
|
||||||
return mActions;
|
return mActions;
|
||||||
}
|
}
|
||||||
|
private MutableLiveData<String> mArmorClass;
|
||||||
public LiveData<List<String>> getReactions() {
|
|
||||||
return mReactions;
|
|
||||||
}
|
|
||||||
|
|
||||||
public LiveData<List<String>> getLegendaryActions() {
|
|
||||||
return mLegendaryActions;
|
|
||||||
}
|
|
||||||
|
|
||||||
public LiveData<List<String>> getLairActions() {
|
|
||||||
return mLairActions;
|
|
||||||
}
|
|
||||||
|
|
||||||
public LiveData<List<String>> getRegionalEffects() {
|
|
||||||
return mRegionalEffects;
|
|
||||||
}
|
|
||||||
|
|
||||||
public LiveData<String> getArmorClass() {
|
public LiveData<String> getArmorClass() {
|
||||||
return mArmorClass;
|
return mArmorClass;
|
||||||
}
|
}
|
||||||
|
private MutableLiveData<String> mChallenge;
|
||||||
public LiveData<String> getChallenge() {
|
public LiveData<String> getChallenge() {
|
||||||
return mChallenge;
|
return mChallenge;
|
||||||
}
|
}
|
||||||
|
private MutableLiveData<String> mCharisma;
|
||||||
public LiveData<String> getCharisma() {
|
public LiveData<String> getCharisma() {
|
||||||
return mCharisma;
|
return mCharisma;
|
||||||
}
|
}
|
||||||
|
private MutableLiveData<String> mConditionImmunities;
|
||||||
public LiveData<String> getConditionImmunities() {
|
public LiveData<String> getConditionImmunities() {
|
||||||
return mConditionImmunities;
|
return mConditionImmunities;
|
||||||
}
|
}
|
||||||
|
private MutableLiveData<String> mConstitution;
|
||||||
public LiveData<String> getConstitution() {
|
public LiveData<String> getConstitution() {
|
||||||
return mConstitution;
|
return mConstitution;
|
||||||
}
|
}
|
||||||
|
private MutableLiveData<String> mDamageResistances;
|
||||||
public LiveData<String> getDamageResistances() {
|
public LiveData<String> getDamageResistances() {
|
||||||
return mDamageResistances;
|
return mDamageResistances;
|
||||||
}
|
}
|
||||||
|
private MutableLiveData<String> mDamageImmunities;
|
||||||
public LiveData<String> getDamageImmunities() {
|
public LiveData<String> getDamageImmunities() {
|
||||||
return mDamageImmunities;
|
return mDamageImmunities;
|
||||||
}
|
}
|
||||||
|
private MutableLiveData<String> mDamageVulnerabilities;
|
||||||
public LiveData<String> getDamageVulnerabilities() {
|
public LiveData<String> getDamageVulnerabilities() {
|
||||||
return mDamageVulnerabilities;
|
return mDamageVulnerabilities;
|
||||||
}
|
}
|
||||||
|
private MutableLiveData<String> mDexterity;
|
||||||
public LiveData<String> getDexterity() {
|
public LiveData<String> getDexterity() {
|
||||||
return mDexterity;
|
return mDexterity;
|
||||||
}
|
}
|
||||||
|
private MutableLiveData<String> mHitPoints;
|
||||||
public LiveData<String> getHitPoints() {
|
public LiveData<String> getHitPoints() {
|
||||||
return mHitPoints;
|
return mHitPoints;
|
||||||
}
|
}
|
||||||
|
private MutableLiveData<String> mIntelligence;
|
||||||
public LiveData<String> getIntelligence() {
|
public LiveData<String> getIntelligence() {
|
||||||
return mIntelligence;
|
return mIntelligence;
|
||||||
}
|
}
|
||||||
|
private MutableLiveData<String> mLanguages;
|
||||||
public LiveData<String> getLanguages() {
|
public LiveData<String> getLanguages() {
|
||||||
return mLanguages;
|
return mLanguages;
|
||||||
}
|
}
|
||||||
|
private MutableLiveData<String> mMeta;
|
||||||
public LiveData<String> getMeta() {
|
public LiveData<String> getMeta() {
|
||||||
return mMeta;
|
return mMeta;
|
||||||
}
|
}
|
||||||
|
private MutableLiveData<String> mName;
|
||||||
public LiveData<String> getName() {
|
public LiveData<String> getName() {
|
||||||
return mName;
|
return mName;
|
||||||
}
|
}
|
||||||
|
private MutableLiveData<String> mSavingThrows;
|
||||||
public LiveData<String> getSavingThrows() {
|
public LiveData<String> getSavingThrows() {
|
||||||
return mSavingThrows;
|
return mSavingThrows;
|
||||||
}
|
}
|
||||||
|
private MutableLiveData<String> mSenses;
|
||||||
public LiveData<String> getSenses() {
|
public LiveData<String> getSenses() {
|
||||||
return mSenses;
|
return mSenses;
|
||||||
}
|
}
|
||||||
|
private MutableLiveData<String> mSkills;
|
||||||
public LiveData<String> getSkills() {
|
public LiveData<String> getSkills() {
|
||||||
return mSkills;
|
return mSkills;
|
||||||
}
|
}
|
||||||
|
private MutableLiveData<String> mSpeed;
|
||||||
public LiveData<String> getSpeed() {
|
public LiveData<String> getSpeed() {
|
||||||
return mSpeed;
|
return mSpeed;
|
||||||
}
|
}
|
||||||
|
private MutableLiveData<String> mStrength;
|
||||||
public LiveData<String> getStrength() {
|
public LiveData<String> getStrength() {
|
||||||
return mStrength;
|
return mStrength;
|
||||||
}
|
}
|
||||||
|
private MutableLiveData<String> mWisdom;
|
||||||
public LiveData<String> getWisdom() {
|
public LiveData<String> getWisdom() {
|
||||||
return mWisdom;
|
return mWisdom;
|
||||||
}
|
}
|
||||||
|
|
||||||
public LiveData<UUID> getId() {
|
private Monster mMonster;
|
||||||
return mMonsterId;
|
public void setMonster(Monster monster) {
|
||||||
}
|
|
||||||
|
|
||||||
public void setMonster(@NonNull Monster monster) {
|
|
||||||
mMonster = monster;
|
mMonster = monster;
|
||||||
|
|
||||||
mAbilities.setValue(mMonster.getAbilityDescriptions());
|
mAbilities.setValue(mMonster.getAbilityDescriptions());
|
||||||
mActions.setValue(mMonster.getActionDescriptions());
|
mActions.setValue(mMonster.getActionDescriptions());
|
||||||
mArmorClass.setValue(mMonster.getArmorClass());
|
mArmorClass.setValue(mMonster.getArmorClass());
|
||||||
@@ -196,14 +165,9 @@ public class MonsterDetailViewModel extends ViewModel {
|
|||||||
mDexterity.setValue(monster.getDexterityDescription());
|
mDexterity.setValue(monster.getDexterityDescription());
|
||||||
mHitPoints.setValue(mMonster.getHitPoints());
|
mHitPoints.setValue(mMonster.getHitPoints());
|
||||||
mIntelligence.setValue(monster.getIntelligenceDescription());
|
mIntelligence.setValue(monster.getIntelligenceDescription());
|
||||||
mLairActions.setValue(mMonster.getLairActionDescriptions());
|
|
||||||
mLanguages.setValue(mMonster.getLanguagesDescription());
|
mLanguages.setValue(mMonster.getLanguagesDescription());
|
||||||
mLegendaryActions.setValue(mMonster.getLegendaryActionDescriptions());
|
|
||||||
mMeta.setValue(mMonster.getMeta());
|
mMeta.setValue(mMonster.getMeta());
|
||||||
mMonsterId.setValue(mMonster.id);
|
|
||||||
mName.setValue(mMonster.name);
|
mName.setValue(mMonster.name);
|
||||||
mReactions.setValue(monster.getReactionDescriptions());
|
|
||||||
mRegionalEffects.setValue(monster.getRegionalActionDescriptions());
|
|
||||||
mSavingThrows.setValue(monster.getSavingThrowsDescription());
|
mSavingThrows.setValue(monster.getSavingThrowsDescription());
|
||||||
mSenses.setValue(monster.getSensesDescription());
|
mSenses.setValue(monster.getSensesDescription());
|
||||||
mSkills.setValue(monster.getSkillsDescription());
|
mSkills.setValue(monster.getSkillsDescription());
|
||||||
|
|||||||
@@ -1,306 +0,0 @@
|
|||||||
package com.majinnaibu.monstercards.ui.monster;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.res.Resources;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.text.Html;
|
|
||||||
import android.text.Spanned;
|
|
||||||
import android.util.DisplayMetrics;
|
|
||||||
import android.util.TypedValue;
|
|
||||||
import android.view.LayoutInflater;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.ViewGroup;
|
|
||||||
import android.widget.LinearLayout;
|
|
||||||
import android.widget.TextView;
|
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import androidx.fragment.app.Fragment;
|
|
||||||
import androidx.lifecycle.ViewModelProvider;
|
|
||||||
|
|
||||||
import com.majinnaibu.monstercards.R;
|
|
||||||
import com.majinnaibu.monstercards.data.enums.AbilityScore;
|
|
||||||
import com.majinnaibu.monstercards.data.enums.AdvantageType;
|
|
||||||
import com.majinnaibu.monstercards.data.enums.ArmorType;
|
|
||||||
import com.majinnaibu.monstercards.data.enums.ChallengeRating;
|
|
||||||
import com.majinnaibu.monstercards.data.enums.ProficiencyType;
|
|
||||||
import com.majinnaibu.monstercards.helpers.CommonMarkHelper;
|
|
||||||
import com.majinnaibu.monstercards.helpers.StringHelper;
|
|
||||||
import com.majinnaibu.monstercards.models.Language;
|
|
||||||
import com.majinnaibu.monstercards.models.Monster;
|
|
||||||
import com.majinnaibu.monstercards.models.Skill;
|
|
||||||
import com.majinnaibu.monstercards.models.Trait;
|
|
||||||
|
|
||||||
@SuppressWarnings("FieldCanBeLocal")
|
|
||||||
public class MonsterFragment extends Fragment {
|
|
||||||
|
|
||||||
private MonsterViewModel monsterViewModel;
|
|
||||||
|
|
||||||
public View onCreateView(@NonNull LayoutInflater inflater,
|
|
||||||
ViewGroup container, Bundle savedInstanceState) {
|
|
||||||
|
|
||||||
// TODO: remove this block make the monster ID a parameter to the view and get the monster from saved data (sqlite)
|
|
||||||
Monster monster = new Monster();
|
|
||||||
// Name
|
|
||||||
monster.name = "Pixie";
|
|
||||||
// Meta
|
|
||||||
monster.size = "tiny";
|
|
||||||
monster.type = "fey";
|
|
||||||
monster.subtype = "";
|
|
||||||
monster.alignment = "neutral good";
|
|
||||||
monster.armorType = ArmorType.NONE;
|
|
||||||
// Armor & Armor Class
|
|
||||||
monster.shieldBonus = 0;
|
|
||||||
monster.naturalArmorBonus = 7;
|
|
||||||
monster.otherArmorDescription = "14";
|
|
||||||
// Hit Points
|
|
||||||
monster.hitDice = 1;
|
|
||||||
monster.hasCustomHP = false;
|
|
||||||
monster.customHPDescription = "11 (2d8 + 2)";
|
|
||||||
monster.walkSpeed = 10;
|
|
||||||
monster.burrowSpeed = 0;
|
|
||||||
monster.climbSpeed = 0;
|
|
||||||
monster.flySpeed = 30;
|
|
||||||
monster.canHover = false;
|
|
||||||
monster.swimSpeed = 0;
|
|
||||||
monster.hasCustomSpeed = false;
|
|
||||||
monster.customSpeedDescription = "30 ft., swim 30 ft.";
|
|
||||||
// Ability Scores
|
|
||||||
monster.strengthScore = Integer.parseInt("2");
|
|
||||||
monster.dexterityScore = Integer.parseInt("20");
|
|
||||||
monster.constitutionScore = Integer.parseInt("8");
|
|
||||||
monster.intelligenceScore = Integer.parseInt("10");
|
|
||||||
monster.wisdomScore = Integer.parseInt("14");
|
|
||||||
monster.charismaScore = Integer.parseInt("15");
|
|
||||||
// monster.strengthScore = 10;
|
|
||||||
// monster.dexterityScore = 10;
|
|
||||||
// monster.constitutionScore = 10;
|
|
||||||
// monster.intelligenceScore = 10;
|
|
||||||
// monster.wisdomScore = 10;
|
|
||||||
// monster.charismaScore = 10;
|
|
||||||
|
|
||||||
// Saving Throws
|
|
||||||
monster.strengthSavingThrowAdvantage = AdvantageType.NONE;
|
|
||||||
monster.strengthSavingThrowProficiency = ProficiencyType.NONE;
|
|
||||||
monster.dexteritySavingThrowAdvantage = AdvantageType.ADVANTAGE;
|
|
||||||
monster.dexteritySavingThrowProficiency = ProficiencyType.PROFICIENT;
|
|
||||||
monster.constitutionSavingThrowAdvantage = AdvantageType.DISADVANTAGE;
|
|
||||||
monster.constitutionSavingThrowProficiency = ProficiencyType.EXPERTISE;
|
|
||||||
monster.intelligenceSavingThrowAdvantage = AdvantageType.NONE;
|
|
||||||
monster.intelligenceSavingThrowProficiency = ProficiencyType.EXPERTISE;
|
|
||||||
monster.wisdomSavingThrowAdvantage = AdvantageType.ADVANTAGE;
|
|
||||||
monster.wisdomSavingThrowProficiency = ProficiencyType.PROFICIENT;
|
|
||||||
monster.charismaSavingThrowAdvantage = AdvantageType.DISADVANTAGE;
|
|
||||||
monster.charismaSavingThrowProficiency = ProficiencyType.NONE;
|
|
||||||
//Skills
|
|
||||||
monster.skills.add(new Skill("perception", AbilityScore.WISDOM));
|
|
||||||
monster.skills.add(new Skill("stealth", AbilityScore.DEXTERITY));
|
|
||||||
// Damage Types
|
|
||||||
monster.damageImmunities.add("force");
|
|
||||||
monster.damageImmunities.add("lightning");
|
|
||||||
monster.damageImmunities.add("poison");
|
|
||||||
monster.damageResistances.add("cold");
|
|
||||||
monster.damageResistances.add("fire");
|
|
||||||
monster.damageResistances.add("piercing");
|
|
||||||
monster.damageVulnerabilities.add("acid");
|
|
||||||
monster.damageVulnerabilities.add("bludgeoning");
|
|
||||||
monster.damageVulnerabilities.add("necrotic");
|
|
||||||
// Condition Immunities
|
|
||||||
monster.conditionImmunities.add("blinded");
|
|
||||||
// Senses
|
|
||||||
monster.blindsightRange = 10;
|
|
||||||
monster.isBlindBeyondBlindsightRange = true;
|
|
||||||
monster.darkvisionRange = 20;
|
|
||||||
monster.tremorsenseRange = 30;
|
|
||||||
monster.truesightRange = 40;
|
|
||||||
monster.telepathyRange = 20;
|
|
||||||
monster.understandsButDescription = "doesn't care";
|
|
||||||
// Languages
|
|
||||||
monster.languages.add(new Language("English", true));
|
|
||||||
monster.languages.add(new Language("Steve", false));
|
|
||||||
monster.languages.add(new Language("Spanish", true));
|
|
||||||
monster.languages.add(new Language("French", true));
|
|
||||||
monster.languages.add(new Language("Mermataur", false));
|
|
||||||
monster.languages.add(new Language("Goldfish", false));
|
|
||||||
// Challenge Rating
|
|
||||||
monster.challengeRating = ChallengeRating.CUSTOM;
|
|
||||||
monster.customChallengeRatingDescription = "Infinite (0XP)";
|
|
||||||
monster.customProficiencyBonus = 4;
|
|
||||||
// Abilities
|
|
||||||
monster.abilities.add(new Trait("Spellcasting", "The acolyte is a 1st-level spellcaster. Its spellcasting ability is Wisdom (spell save DC [WIS SAVE], [WIS ATK] to hit with spell attacks). The acolyte has following cleric spells prepared:\n\n\n> Cantrips (at will): _light, sacred flame, thaumaturgy_\n> 1st level (3 slots): _bless, cure wounds, sanctuary_"));
|
|
||||||
monster.abilities.add(new Trait("Amphibious", "The dragon can breathe air and water."));
|
|
||||||
monster.abilities.add(new Trait("Legendary Resistance (3/Day)", "If the dragon fails a saving throw, it can choose to succeed instead."));
|
|
||||||
// Actions
|
|
||||||
monster.actions.add(new Trait("Club", "_Melee Weapon Attack:_ [STR ATK] to hit, reach 5 ft., one target. _Hit:_ 2 (1d4) bludgeoning damage."));
|
|
||||||
// END remove block
|
|
||||||
monsterViewModel = new ViewModelProvider(this).get(MonsterViewModel.class);
|
|
||||||
View root = inflater.inflate(R.layout.fragment_monster, container, false);
|
|
||||||
monsterViewModel.setMonster(monster);
|
|
||||||
|
|
||||||
final TextView monsterName = root.findViewById(R.id.name);
|
|
||||||
monsterViewModel.getName().observe(getViewLifecycleOwner(), name -> monsterName.setText(name));
|
|
||||||
|
|
||||||
final TextView monsterMeta = root.findViewById(R.id.meta);
|
|
||||||
monsterViewModel.getMeta().observe(getViewLifecycleOwner(), metaText -> monsterMeta.setText(metaText));
|
|
||||||
|
|
||||||
final TextView monsterArmorClass = root.findViewById(R.id.armor_class);
|
|
||||||
monsterViewModel.getArmorClass().observe(getViewLifecycleOwner(), armorText -> monsterArmorClass.setText(Html.fromHtml("<b>Armor Class</b> " + armorText)));
|
|
||||||
|
|
||||||
final TextView monsterHitPoints = root.findViewById(R.id.hit_points);
|
|
||||||
monsterViewModel.getHitPoints().observe(getViewLifecycleOwner(), hitPoints -> monsterHitPoints.setText(Html.fromHtml("<b>Hit Points</b> " + hitPoints)));
|
|
||||||
|
|
||||||
final TextView monsterSpeed = root.findViewById(R.id.speed);
|
|
||||||
monsterViewModel.getSpeed().observe(getViewLifecycleOwner(), speed -> monsterSpeed.setText(Html.fromHtml("<b>Speed</b> " + speed)));
|
|
||||||
|
|
||||||
final TextView monsterStrength = root.findViewById(R.id.strength);
|
|
||||||
monsterViewModel.getStrength().observe(getViewLifecycleOwner(), strength -> monsterStrength.setText(strength));
|
|
||||||
|
|
||||||
final TextView monsterDexterity = root.findViewById(R.id.dexterity);
|
|
||||||
monsterViewModel.getDexterity().observe(getViewLifecycleOwner(), dexterity -> monsterDexterity.setText(dexterity));
|
|
||||||
|
|
||||||
final TextView monsterConstitution = root.findViewById(R.id.constitution);
|
|
||||||
monsterViewModel.getConstitution().observe(getViewLifecycleOwner(), constitution -> monsterConstitution.setText(constitution));
|
|
||||||
|
|
||||||
final TextView monsterIntelligence = root.findViewById(R.id.intelligence);
|
|
||||||
monsterViewModel.getIntelligence().observe(getViewLifecycleOwner(), intelligence -> monsterIntelligence.setText(intelligence));
|
|
||||||
|
|
||||||
final TextView monsterWisdom = root.findViewById(R.id.wisdom);
|
|
||||||
monsterViewModel.getWisdom().observe(getViewLifecycleOwner(), wisdom -> monsterWisdom.setText(wisdom));
|
|
||||||
|
|
||||||
final TextView monsterCharisma = root.findViewById(R.id.charisma);
|
|
||||||
monsterViewModel.getCharisma().observe(getViewLifecycleOwner(), charisma -> monsterCharisma.setText(charisma));
|
|
||||||
|
|
||||||
final TextView monsterSavingThrows = root.findViewById(R.id.saving_throws);
|
|
||||||
monsterViewModel.getSavingThrows().observe(getViewLifecycleOwner(), savingThrows -> {
|
|
||||||
if (StringHelper.isNullOrEmpty(savingThrows)) {
|
|
||||||
monsterSavingThrows.setVisibility(View.GONE);
|
|
||||||
} else {
|
|
||||||
monsterSavingThrows.setVisibility(View.VISIBLE);
|
|
||||||
}
|
|
||||||
monsterSavingThrows.setText(Html.fromHtml("<b>Saving Throws</b> " + savingThrows));
|
|
||||||
});
|
|
||||||
|
|
||||||
final TextView monsterSkills = root.findViewById(R.id.skills);
|
|
||||||
monsterViewModel.getSkills().observe(getViewLifecycleOwner(), skills -> {
|
|
||||||
if (StringHelper.isNullOrEmpty(skills)) {
|
|
||||||
monsterSkills.setVisibility(View.GONE);
|
|
||||||
} else {
|
|
||||||
monsterSkills.setVisibility(View.VISIBLE);
|
|
||||||
}
|
|
||||||
monsterSkills.setText(Html.fromHtml("<b>Skills</b> " + skills));
|
|
||||||
});
|
|
||||||
|
|
||||||
final TextView monsterDamageVulnerabilities = root.findViewById(R.id.damage_vulnerabilities);
|
|
||||||
monsterViewModel.getDamageVulnerabilities().observe(getViewLifecycleOwner(), damageType -> {
|
|
||||||
if (StringHelper.isNullOrEmpty(damageType)) {
|
|
||||||
monsterDamageVulnerabilities.setVisibility(View.GONE);
|
|
||||||
} else {
|
|
||||||
monsterDamageVulnerabilities.setVisibility(View.VISIBLE);
|
|
||||||
}
|
|
||||||
monsterDamageVulnerabilities.setText(Html.fromHtml("<b>Damage Vulnerabilities</b> " + damageType));
|
|
||||||
});
|
|
||||||
|
|
||||||
final TextView monsterDamageResistances = root.findViewById(R.id.damage_resistances);
|
|
||||||
monsterViewModel.getDamageResistances().observe(getViewLifecycleOwner(), damageType -> {
|
|
||||||
if (StringHelper.isNullOrEmpty(damageType)) {
|
|
||||||
monsterDamageResistances.setVisibility(View.GONE);
|
|
||||||
} else {
|
|
||||||
monsterDamageResistances.setVisibility(View.VISIBLE);
|
|
||||||
}
|
|
||||||
monsterDamageResistances.setText(Html.fromHtml("<b>Damage Resistances</b> " + damageType));
|
|
||||||
});
|
|
||||||
|
|
||||||
final TextView monsterDamageImmunities = root.findViewById(R.id.damage_immunities);
|
|
||||||
monsterViewModel.getDamageImmunities().observe(getViewLifecycleOwner(), damageType -> {
|
|
||||||
if (StringHelper.isNullOrEmpty(damageType)) {
|
|
||||||
monsterDamageImmunities.setVisibility(View.GONE);
|
|
||||||
} else {
|
|
||||||
monsterDamageImmunities.setVisibility(View.VISIBLE);
|
|
||||||
}
|
|
||||||
monsterDamageImmunities.setText(Html.fromHtml("<b>Damage Immunities</b> " + damageType));
|
|
||||||
});
|
|
||||||
|
|
||||||
final TextView monsterConditionImmunities = root.findViewById(R.id.condition_immunities);
|
|
||||||
monsterViewModel.getConditionImmunities().observe(getViewLifecycleOwner(), conditionImmunities -> {
|
|
||||||
if (StringHelper.isNullOrEmpty(conditionImmunities)) {
|
|
||||||
monsterConditionImmunities.setVisibility(View.GONE);
|
|
||||||
} else {
|
|
||||||
monsterConditionImmunities.setVisibility(View.VISIBLE);
|
|
||||||
}
|
|
||||||
monsterConditionImmunities.setText(Html.fromHtml("<b>Condition Immunities</b> " + conditionImmunities));
|
|
||||||
});
|
|
||||||
|
|
||||||
final TextView monsterSenses = root.findViewById(R.id.senses);
|
|
||||||
monsterViewModel.getSenses().observe(getViewLifecycleOwner(), senses -> {
|
|
||||||
if (StringHelper.isNullOrEmpty(senses)) {
|
|
||||||
monsterSenses.setVisibility(View.GONE);
|
|
||||||
} else {
|
|
||||||
monsterSenses.setVisibility(View.VISIBLE);
|
|
||||||
}
|
|
||||||
monsterSenses.setText(Html.fromHtml("<b>Senses</b> " + senses));
|
|
||||||
});
|
|
||||||
|
|
||||||
final TextView monsterLanguages = root.findViewById(R.id.languages);
|
|
||||||
monsterViewModel.getLanguages().observe(getViewLifecycleOwner(), languages -> {
|
|
||||||
if (StringHelper.isNullOrEmpty(languages)) {
|
|
||||||
monsterLanguages.setVisibility(View.GONE);
|
|
||||||
} else {
|
|
||||||
monsterLanguages.setVisibility(View.VISIBLE);
|
|
||||||
}
|
|
||||||
monsterLanguages.setText(Html.fromHtml("<b>Languages</b> " + languages));
|
|
||||||
});
|
|
||||||
|
|
||||||
final TextView monsterChallenge = root.findViewById(R.id.challenge);
|
|
||||||
monsterViewModel.getChallenge().observe(getViewLifecycleOwner(), challengeRating -> monsterChallenge.setText(Html.fromHtml("<b>Challenge</b> " + challengeRating)));
|
|
||||||
|
|
||||||
final LinearLayout monsterAbilities = root.findViewById(R.id.abilities);
|
|
||||||
monsterViewModel.getAbilities().observe(getViewLifecycleOwner(), abilities -> {
|
|
||||||
Context context = getContext();
|
|
||||||
DisplayMetrics displayMetrics = null;
|
|
||||||
if (context != null) {
|
|
||||||
Resources resources = context.getResources();
|
|
||||||
if (resources != null) {
|
|
||||||
displayMetrics = resources.getDisplayMetrics();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
monsterAbilities.removeAllViews();
|
|
||||||
if (abilities != null) {
|
|
||||||
for (String ability : abilities) {
|
|
||||||
TextView tvAbility = new TextView(context);
|
|
||||||
// TODO: Handle multiline block quotes specially so they stay multiline.
|
|
||||||
// TODO: Replace QuoteSpans in the result of fromHtml with something like this https://stackoverflow.com/questions/7717567/how-to-style-blockquotes-in-android-textviews to make them indent as expected
|
|
||||||
Spanned spannedText = Html.fromHtml(CommonMarkHelper.toHtml(ability));
|
|
||||||
tvAbility.setText(spannedText);
|
|
||||||
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
|
|
||||||
layoutParams.topMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, displayMetrics);
|
|
||||||
tvAbility.setLayoutParams(layoutParams);
|
|
||||||
monsterAbilities.addView(tvAbility);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
final LinearLayout monsterActions = root.findViewById(R.id.actions);
|
|
||||||
monsterViewModel.getActions().observe(getViewLifecycleOwner(), actions -> {
|
|
||||||
Context context = getContext();
|
|
||||||
DisplayMetrics displayMetrics = null;
|
|
||||||
if (context != null) {
|
|
||||||
Resources resources = context.getResources();
|
|
||||||
if (resources != null) {
|
|
||||||
displayMetrics = resources.getDisplayMetrics();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
monsterActions.removeAllViews();
|
|
||||||
if (actions != null) {
|
|
||||||
for (String action : actions) {
|
|
||||||
TextView tvAction = new TextView(getContext());
|
|
||||||
tvAction.setText(Html.fromHtml(CommonMarkHelper.toHtml(action)));
|
|
||||||
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
|
|
||||||
layoutParams.topMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, displayMetrics);
|
|
||||||
tvAction.setLayoutParams(layoutParams);
|
|
||||||
monsterActions.addView(tvAction);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
return root;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,178 +0,0 @@
|
|||||||
package com.majinnaibu.monstercards.ui.monster;
|
|
||||||
|
|
||||||
import androidx.lifecycle.LiveData;
|
|
||||||
import androidx.lifecycle.MutableLiveData;
|
|
||||||
import androidx.lifecycle.ViewModel;
|
|
||||||
|
|
||||||
import com.majinnaibu.monstercards.models.Monster;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public class MonsterViewModel extends ViewModel {
|
|
||||||
|
|
||||||
public MonsterViewModel() {
|
|
||||||
mMonster = null;
|
|
||||||
mAbilities = new MutableLiveData<>();
|
|
||||||
mAbilities.setValue(new ArrayList<String>());
|
|
||||||
mActions = new MutableLiveData<>();
|
|
||||||
mActions.setValue(new ArrayList<String>());
|
|
||||||
mArmorClass = new MutableLiveData<>();
|
|
||||||
mArmorClass.setValue("");
|
|
||||||
mChallenge = new MutableLiveData<>();
|
|
||||||
mChallenge.setValue("");
|
|
||||||
mCharisma = new MutableLiveData<>();
|
|
||||||
mCharisma.setValue("");
|
|
||||||
mConditionImmunities = new MutableLiveData<>();
|
|
||||||
mConditionImmunities.setValue("");
|
|
||||||
mConstitution = new MutableLiveData<>();
|
|
||||||
mConstitution.setValue("");
|
|
||||||
mDamageImmunities = new MutableLiveData<>();
|
|
||||||
mDamageImmunities.setValue("");
|
|
||||||
mDamageResistances = new MutableLiveData<>();
|
|
||||||
mDamageResistances.setValue("");
|
|
||||||
mDamageVulnerabilities = new MutableLiveData<>();
|
|
||||||
mDamageVulnerabilities.setValue("");
|
|
||||||
mDexterity = new MutableLiveData<>();
|
|
||||||
mDexterity.setValue("");
|
|
||||||
mHitPoints = new MutableLiveData<>();
|
|
||||||
mHitPoints.setValue("");
|
|
||||||
mIntelligence = new MutableLiveData<>();
|
|
||||||
mIntelligence.setValue("");
|
|
||||||
mLanguages = new MutableLiveData<>();
|
|
||||||
mLanguages.setValue("");
|
|
||||||
mMeta = new MutableLiveData<>();
|
|
||||||
mMeta.setValue("");
|
|
||||||
mName = new MutableLiveData<>();
|
|
||||||
mName.setValue("");
|
|
||||||
mSavingThrows = new MutableLiveData<>();
|
|
||||||
mSavingThrows.setValue("");
|
|
||||||
mSenses = new MutableLiveData<>();
|
|
||||||
mSenses.setValue("");
|
|
||||||
mSkills = new MutableLiveData<>();
|
|
||||||
mSkills.setValue("");
|
|
||||||
mSpeed = new MutableLiveData<>();
|
|
||||||
mSpeed.setValue("");
|
|
||||||
mStrength = new MutableLiveData<>();
|
|
||||||
mStrength.setValue("");
|
|
||||||
mWisdom = new MutableLiveData<>();
|
|
||||||
mWisdom.setValue("");
|
|
||||||
}
|
|
||||||
|
|
||||||
private MutableLiveData<List<String>> mAbilities;
|
|
||||||
public LiveData<List<String>> getAbilities() {
|
|
||||||
return mAbilities;
|
|
||||||
}
|
|
||||||
private MutableLiveData<List<String>> mActions;
|
|
||||||
public LiveData<List<String>> getActions() {
|
|
||||||
return mActions;
|
|
||||||
}
|
|
||||||
private MutableLiveData<String> mArmorClass;
|
|
||||||
public LiveData<String> getArmorClass() {
|
|
||||||
return mArmorClass;
|
|
||||||
}
|
|
||||||
private MutableLiveData<String> mChallenge;
|
|
||||||
public LiveData<String> getChallenge() {
|
|
||||||
return mChallenge;
|
|
||||||
}
|
|
||||||
private MutableLiveData<String> mCharisma;
|
|
||||||
public LiveData<String> getCharisma() {
|
|
||||||
return mCharisma;
|
|
||||||
}
|
|
||||||
private MutableLiveData<String> mConditionImmunities;
|
|
||||||
public LiveData<String> getConditionImmunities() {
|
|
||||||
return mConditionImmunities;
|
|
||||||
}
|
|
||||||
private MutableLiveData<String> mConstitution;
|
|
||||||
public LiveData<String> getConstitution() {
|
|
||||||
return mConstitution;
|
|
||||||
}
|
|
||||||
private MutableLiveData<String> mDamageResistances;
|
|
||||||
public LiveData<String> getDamageResistances() {
|
|
||||||
return mDamageResistances;
|
|
||||||
}
|
|
||||||
private MutableLiveData<String> mDamageImmunities;
|
|
||||||
public LiveData<String> getDamageImmunities() {
|
|
||||||
return mDamageImmunities;
|
|
||||||
}
|
|
||||||
private MutableLiveData<String> mDamageVulnerabilities;
|
|
||||||
public LiveData<String> getDamageVulnerabilities() {
|
|
||||||
return mDamageVulnerabilities;
|
|
||||||
}
|
|
||||||
private MutableLiveData<String> mDexterity;
|
|
||||||
public LiveData<String> getDexterity() {
|
|
||||||
return mDexterity;
|
|
||||||
}
|
|
||||||
private MutableLiveData<String> mHitPoints;
|
|
||||||
public LiveData<String> getHitPoints() {
|
|
||||||
return mHitPoints;
|
|
||||||
}
|
|
||||||
private MutableLiveData<String> mIntelligence;
|
|
||||||
public LiveData<String> getIntelligence() {
|
|
||||||
return mIntelligence;
|
|
||||||
}
|
|
||||||
private MutableLiveData<String> mLanguages;
|
|
||||||
public LiveData<String> getLanguages() {
|
|
||||||
return mLanguages;
|
|
||||||
}
|
|
||||||
private MutableLiveData<String> mMeta;
|
|
||||||
public LiveData<String> getMeta() {
|
|
||||||
return mMeta;
|
|
||||||
}
|
|
||||||
private MutableLiveData<String> mName;
|
|
||||||
public LiveData<String> getName() {
|
|
||||||
return mName;
|
|
||||||
}
|
|
||||||
private MutableLiveData<String> mSavingThrows;
|
|
||||||
public LiveData<String> getSavingThrows() {
|
|
||||||
return mSavingThrows;
|
|
||||||
}
|
|
||||||
private MutableLiveData<String> mSenses;
|
|
||||||
public LiveData<String> getSenses() {
|
|
||||||
return mSenses;
|
|
||||||
}
|
|
||||||
private MutableLiveData<String> mSkills;
|
|
||||||
public LiveData<String> getSkills() {
|
|
||||||
return mSkills;
|
|
||||||
}
|
|
||||||
private MutableLiveData<String> mSpeed;
|
|
||||||
public LiveData<String> getSpeed() {
|
|
||||||
return mSpeed;
|
|
||||||
}
|
|
||||||
private MutableLiveData<String> mStrength;
|
|
||||||
public LiveData<String> getStrength() {
|
|
||||||
return mStrength;
|
|
||||||
}
|
|
||||||
private MutableLiveData<String> mWisdom;
|
|
||||||
public LiveData<String> getWisdom() {
|
|
||||||
return mWisdom;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Monster mMonster;
|
|
||||||
public void setMonster(Monster monster) {
|
|
||||||
mMonster = monster;
|
|
||||||
|
|
||||||
mAbilities.setValue(mMonster.getAbilityDescriptions());
|
|
||||||
mActions.setValue(mMonster.getActionDescriptions());
|
|
||||||
mArmorClass.setValue(mMonster.getArmorClass());
|
|
||||||
mChallenge.setValue(mMonster.getChallengeRatingDescription());
|
|
||||||
mCharisma.setValue(monster.getCharismaDescription());
|
|
||||||
mConditionImmunities.setValue(mMonster.getConditionImmunitiesDescription());
|
|
||||||
mConstitution.setValue(monster.getConstitutionDescription());
|
|
||||||
mDamageImmunities.setValue(mMonster.getDamageImmunitiesDescription());
|
|
||||||
mDamageResistances.setValue(mMonster.getDamageResistancesDescription());
|
|
||||||
mDamageVulnerabilities.setValue(mMonster.getDamageVulnerabilitiesDescription());
|
|
||||||
mDexterity.setValue(monster.getDexterityDescription());
|
|
||||||
mHitPoints.setValue(mMonster.getHitPoints());
|
|
||||||
mIntelligence.setValue(monster.getIntelligenceDescription());
|
|
||||||
mLanguages.setValue(mMonster.getLanguagesDescription());
|
|
||||||
mMeta.setValue(mMonster.getMeta());
|
|
||||||
mName.setValue(mMonster.name);
|
|
||||||
mSavingThrows.setValue(monster.getSavingThrowsDescription());
|
|
||||||
mSenses.setValue(monster.getSensesDescription());
|
|
||||||
mSkills.setValue(monster.getSkillsDescription());
|
|
||||||
mSpeed.setValue(mMonster.getSpeedText());
|
|
||||||
mStrength.setValue(monster.getStrengthDescription());
|
|
||||||
mWisdom.setValue(monster.getWisdomDescription());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -5,7 +5,7 @@
|
|||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
tools:context=".ui.monster.MonsterFragment">
|
tools:context=".ui.monster.MonsterDetailFragment">
|
||||||
|
|
||||||
<androidx.constraintlayout.widget.ConstraintLayout
|
<androidx.constraintlayout.widget.ConstraintLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
|
|||||||
@@ -47,7 +47,7 @@
|
|||||||
|
|
||||||
<fragment
|
<fragment
|
||||||
android:id="@+id/navigation_monster"
|
android:id="@+id/navigation_monster"
|
||||||
android:name="com.majinnaibu.monstercards.ui.monster.MonsterFragment"
|
android:name="com.majinnaibu.monstercards.ui.monster.MonsterDetailFragment"
|
||||||
android:label="Monster"
|
android:label="Monster"
|
||||||
tools:layout="@layout/fragment_monster" />
|
tools:layout="@layout/fragment_monster" />
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user