From 826fcd6d1f20073b4a6a09766e37ae37d2394a20 Mon Sep 17 00:00:00 2001 From: Tom Hicks Date: Sun, 27 Jun 2021 01:31:13 -0700 Subject: [PATCH] Adds other traits to the monster detail fragment. Cleans up the monster detail fragment to work like the other fragments. --- .../ui/monster/MonsterDetailFragment.java | 242 ++++++++---------- .../ui/monster/MonsterDetailViewModel.java | 100 ++++---- app/src/main/res/layout/fragment_monster.xml | 10 + app/src/main/res/values/strings.xml | 2 + 4 files changed, 174 insertions(+), 180 deletions(-) diff --git a/app/src/main/java/com/majinnaibu/monstercards/ui/monster/MonsterDetailFragment.java b/app/src/main/java/com/majinnaibu/monstercards/ui/monster/MonsterDetailFragment.java index 0301d29..52a254c 100644 --- a/app/src/main/java/com/majinnaibu/monstercards/ui/monster/MonsterDetailFragment.java +++ b/app/src/main/java/com/majinnaibu/monstercards/ui/monster/MonsterDetailFragment.java @@ -13,6 +13,7 @@ import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; +import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; @@ -29,6 +30,7 @@ import com.majinnaibu.monstercards.models.Monster; import com.majinnaibu.monstercards.ui.shared.MCFragment; import com.majinnaibu.monstercards.utils.Logger; +import java.util.List; import java.util.UUID; import io.reactivex.rxjava3.observers.DisposableSingleObserver; @@ -36,7 +38,7 @@ import io.reactivex.rxjava3.observers.DisposableSingleObserver; public class MonsterDetailFragment extends MCFragment { private ViewHolder mHolder; - private MonsterDetailViewModel monsterDetailViewModel; + private MonsterDetailViewModel mViewModel; public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -45,18 +47,13 @@ public class MonsterDetailFragment extends MCFragment { assert arguments != null; UUID monsterId = UUID.fromString(MonsterDetailFragmentArgs.fromBundle(arguments).getMonsterId()); setHasOptionsMenu(true); - - monsterDetailViewModel = new ViewModelProvider(this).get(MonsterDetailViewModel.class); - View root = inflater.inflate(R.layout.fragment_monster, container, false); - - mHolder = new ViewHolder(root); - + mViewModel = new ViewModelProvider(this).get(MonsterDetailViewModel.class); repository.getMonster(monsterId).toObservable() .firstOrError() .subscribe(new DisposableSingleObserver() { @Override public void onSuccess(@io.reactivex.rxjava3.annotations.NonNull Monster monster) { - monsterDetailViewModel.setMonster(monster); + mViewModel.setMonster(monster); dispose(); } @@ -66,134 +63,95 @@ public class MonsterDetailFragment extends MCFragment { dispose(); } }); + View root = inflater.inflate(R.layout.fragment_monster, container, false); + mHolder = new ViewHolder(root); - monsterDetailViewModel.getName().observe(getViewLifecycleOwner(), mHolder.name::setText); - monsterDetailViewModel.getMeta().observe(getViewLifecycleOwner(), mHolder.meta::setText); - monsterDetailViewModel.getArmorClass().observe(getViewLifecycleOwner(), armorText -> mHolder.armorClass.setText(Html.fromHtml("Armor Class " + armorText))); - monsterDetailViewModel.getHitPoints().observe(getViewLifecycleOwner(), hitPoints -> mHolder.hitPoints.setText(Html.fromHtml("Hit Points " + hitPoints))); - monsterDetailViewModel.getSpeed().observe(getViewLifecycleOwner(), speed -> mHolder.speed.setText(Html.fromHtml("Speed " + speed))); - monsterDetailViewModel.getStrength().observe(getViewLifecycleOwner(), mHolder.strength::setText); - monsterDetailViewModel.getDexterity().observe(getViewLifecycleOwner(), mHolder.dexterity::setText); - monsterDetailViewModel.getConstitution().observe(getViewLifecycleOwner(), mHolder.constitution::setText); - monsterDetailViewModel.getIntelligence().observe(getViewLifecycleOwner(), mHolder.intelligence::setText); - monsterDetailViewModel.getWisdom().observe(getViewLifecycleOwner(), mHolder.wisdom::setText); - monsterDetailViewModel.getCharisma().observe(getViewLifecycleOwner(), mHolder.charisma::setText); - monsterDetailViewModel.getSavingThrows().observe(getViewLifecycleOwner(), savingThrows -> { - if (StringHelper.isNullOrEmpty(savingThrows)) { - mHolder.savingThrows.setVisibility(View.GONE); - } else { - mHolder.savingThrows.setVisibility(View.VISIBLE); - } - mHolder.savingThrows.setText(Html.fromHtml("Saving Throws " + savingThrows)); - }); - monsterDetailViewModel.getSkills().observe(getViewLifecycleOwner(), skills -> { - if (StringHelper.isNullOrEmpty(skills)) { - mHolder.skills.setVisibility(View.GONE); - } else { - mHolder.skills.setVisibility(View.VISIBLE); - } - mHolder.skills.setText(Html.fromHtml("Skills " + skills)); - }); - monsterDetailViewModel.getDamageVulnerabilities().observe(getViewLifecycleOwner(), damageType -> { - if (StringHelper.isNullOrEmpty(damageType)) { - mHolder.damageVulnerabilities.setVisibility(View.GONE); - } else { - mHolder.damageVulnerabilities.setVisibility(View.VISIBLE); - } - mHolder.damageVulnerabilities.setText(Html.fromHtml("Damage Vulnerabilities " + damageType)); - }); - monsterDetailViewModel.getDamageResistances().observe(getViewLifecycleOwner(), damageType -> { - if (StringHelper.isNullOrEmpty(damageType)) { - mHolder.damageResistances.setVisibility(View.GONE); - } else { - mHolder.damageResistances.setVisibility(View.VISIBLE); - } - mHolder.damageResistances.setText(Html.fromHtml("Damage Resistances " + damageType)); - }); - monsterDetailViewModel.getDamageImmunities().observe(getViewLifecycleOwner(), damageType -> { - if (StringHelper.isNullOrEmpty(damageType)) { - mHolder.damageImmunities.setVisibility(View.GONE); - } else { - mHolder.damageImmunities.setVisibility(View.VISIBLE); - } - mHolder.damageImmunities.setText(Html.fromHtml("Damage Immunities " + damageType)); - }); - monsterDetailViewModel.getConditionImmunities().observe(getViewLifecycleOwner(), conditionImmunities -> { - if (StringHelper.isNullOrEmpty(conditionImmunities)) { - mHolder.conditionImmunities.setVisibility(View.GONE); - } else { - mHolder.conditionImmunities.setVisibility(View.VISIBLE); - } - mHolder.conditionImmunities.setText(Html.fromHtml("Condition Immunities " + conditionImmunities)); - }); - monsterDetailViewModel.getSenses().observe(getViewLifecycleOwner(), senses -> { - if (StringHelper.isNullOrEmpty(senses)) { - mHolder.senses.setVisibility(View.GONE); - } else { - mHolder.senses.setVisibility(View.VISIBLE); - } - mHolder.senses.setText(Html.fromHtml("Senses " + senses)); - }); - monsterDetailViewModel.getLanguages().observe(getViewLifecycleOwner(), languages -> { - if (StringHelper.isNullOrEmpty(languages)) { - mHolder.languages.setVisibility(View.GONE); - } else { - mHolder.languages.setVisibility(View.VISIBLE); - } - mHolder.languages.setText(Html.fromHtml("Languages " + languages)); - }); - monsterDetailViewModel.getChallenge().observe(getViewLifecycleOwner(), challengeRating -> mHolder.challenge.setText(Html.fromHtml("Challenge " + challengeRating))); - monsterDetailViewModel.getAbilities().observe(getViewLifecycleOwner(), abilities -> { - Context context = getContext(); - DisplayMetrics displayMetrics = null; - if (context != null) { - Resources resources = context.getResources(); - if (resources != null) { - displayMetrics = resources.getDisplayMetrics(); - } - } - mHolder.abilities.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); - mHolder.abilities.addView(tvAbility); - } - } - }); - monsterDetailViewModel.getActions().observe(getViewLifecycleOwner(), actions -> { - Context context = getContext(); - DisplayMetrics displayMetrics = null; - if (context != null) { - Resources resources = context.getResources(); - if (resources != null) { - displayMetrics = resources.getDisplayMetrics(); - } - } - mHolder.actions.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); - mHolder.actions.addView(tvAction); - } - } - }); - - // TODO: add lair actions, legendary actions, reactions, and regional actions + mViewModel.getName().observe(getViewLifecycleOwner(), mHolder.name::setText); + 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; } + private void setupLabeledTextView(TextView view, String text, int titleId) { + String title = getString(titleId); + String fullText = String.format("%s %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 { + root.setVisibility(View.VISIBLE); + } + Spanned formatted; + if (StringHelper.isNullOrEmpty(title)) { + formatted = Html.fromHtml(text); + } else { + formatted = Html.fromHtml(String.format("%s %s", title, text)); + } + root.setText(formatted); + } + + private void setupTraitList(@NonNull LinearLayout root, @NonNull List traits) { + setupTraitList(root, traits, null, null); + } + + private void setupTraitList(@NonNull LinearLayout root, @NonNull List traits, View label, View divider) { + int visibility = traits.size() > 0 ? View.VISIBLE : View.GONE; + Context context = getContext(); + DisplayMetrics displayMetrics = null; + if (context != null) { + Resources resources = context.getResources(); + if (resources != null) { + displayMetrics = resources.getDisplayMetrics(); + } + } + root.removeAllViews(); + for (String action : traits) { + TextView tvAction = new TextView(getContext()); + // 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 + 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); + root.addView(tvAction); + } + root.setVisibility(visibility); + if (label != null) { + label.setVisibility(visibility); + } + if (divider != null) { + divider.setVisibility(visibility); + } + } + @Override public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { inflater.inflate(R.menu.monster_detail_menu, menu); @@ -203,7 +161,7 @@ public class MonsterDetailFragment extends MCFragment { @Override public boolean onOptionsItemSelected(@NonNull MenuItem item) { if (item.getItemId() == R.id.menu_action_edit_monster) { - UUID monsterId = monsterDetailViewModel.getId().getValue(); + UUID monsterId = mViewModel.getId().getValue(); if (monsterId != null) { NavDirections action = MonsterDetailFragmentDirections.actionNavigationMonsterToEditMonsterFragment(monsterId.toString()); Navigation.findNavController(requireView()).navigate(action); @@ -238,10 +196,20 @@ public class MonsterDetailFragment extends MCFragment { 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(View root) { name = root.findViewById(R.id.name); @@ -266,10 +234,20 @@ public class MonsterDetailFragment extends MCFragment { 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); } } } diff --git a/app/src/main/java/com/majinnaibu/monstercards/ui/monster/MonsterDetailViewModel.java b/app/src/main/java/com/majinnaibu/monstercards/ui/monster/MonsterDetailViewModel.java index 26bed24..a91a5f9 100644 --- a/app/src/main/java/com/majinnaibu/monstercards/ui/monster/MonsterDetailViewModel.java +++ b/app/src/main/java/com/majinnaibu/monstercards/ui/monster/MonsterDetailViewModel.java @@ -25,9 +25,13 @@ public class MonsterDetailViewModel extends ViewModel { private final MutableLiveData mDexterity; private final MutableLiveData mHitPoints; private final MutableLiveData mIntelligence; + private final MutableLiveData> mLairActions; private final MutableLiveData mLanguages; + private final MutableLiveData> mLegendaryActions; private final MutableLiveData mMeta; private final MutableLiveData mName; + private final MutableLiveData> mReactions; + private final MutableLiveData> mRegionalEffects; private final MutableLiveData mSavingThrows; private final MutableLiveData mSenses; private final MutableLiveData mSkills; @@ -39,52 +43,33 @@ public class MonsterDetailViewModel extends ViewModel { public MonsterDetailViewModel() { mMonster = null; - mAbilities = new MutableLiveData<>(); - mAbilities.setValue(new ArrayList<>()); - mActions = new MutableLiveData<>(); - mActions.setValue(new ArrayList<>()); - 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(""); - mMonsterId = new MutableLiveData<>(); - mMonsterId.setValue(UUID.fromString("00000000-0000-0000-0000-000000000000")); + mAbilities = new MutableLiveData<>(new ArrayList<>()); + mActions = new MutableLiveData<>(new ArrayList<>()); + mArmorClass = new MutableLiveData<>(""); + mChallenge = new MutableLiveData<>(""); + mCharisma = new MutableLiveData<>(""); + mConditionImmunities = new MutableLiveData<>(""); + mConstitution = new MutableLiveData<>(""); + mDamageImmunities = new MutableLiveData<>(""); + mDamageResistances = new MutableLiveData<>(""); + mDamageVulnerabilities = new MutableLiveData<>(""); + mDexterity = new MutableLiveData<>(""); + mHitPoints = new MutableLiveData<>(""); + mIntelligence = new MutableLiveData<>(""); + mLairActions = new MutableLiveData<>(new ArrayList<>()); + mLanguages = new MutableLiveData<>(""); + mLegendaryActions = new MutableLiveData<>(new ArrayList<>()); + mMeta = new MutableLiveData<>(""); + mName = new MutableLiveData<>(""); + mReactions = new MutableLiveData<>(new ArrayList<>()); + mRegionalEffects = new MutableLiveData<>(new ArrayList<>()); + mSavingThrows = new MutableLiveData<>(""); + mSenses = new MutableLiveData<>(""); + mSkills = new MutableLiveData<>(""); + mSpeed = new MutableLiveData<>(""); + mStrength = new MutableLiveData<>(""); + mWisdom = new MutableLiveData<>(""); + mMonsterId = new MutableLiveData<>(UUID.fromString("00000000-0000-0000-0000-000000000000")); } public LiveData> getAbilities() { @@ -95,6 +80,22 @@ public class MonsterDetailViewModel extends ViewModel { return mActions; } + public LiveData> getReactions() { + return mReactions; + } + + public LiveData> getLegendaryActions() { + return mLegendaryActions; + } + + public LiveData> getLairActions() { + return mLairActions; + } + + public LiveData> getRegionalEffects() { + return mRegionalEffects; + } + public LiveData getArmorClass() { return mArmorClass; } @@ -181,7 +182,6 @@ public class MonsterDetailViewModel extends ViewModel { public void setMonster(Monster monster) { mMonster = monster; - mAbilities.setValue(mMonster.getAbilityDescriptions()); mActions.setValue(mMonster.getActionDescriptions()); mArmorClass.setValue(mMonster.getArmorClass()); @@ -195,10 +195,14 @@ public class MonsterDetailViewModel extends ViewModel { mDexterity.setValue(monster.getDexterityDescription()); mHitPoints.setValue(mMonster.getHitPoints()); mIntelligence.setValue(monster.getIntelligenceDescription()); + mLairActions.setValue(mMonster.getLairActionDescriptions()); mLanguages.setValue(mMonster.getLanguagesDescription()); + mLegendaryActions.setValue(mMonster.getLegendaryActionDescriptions()); mMeta.setValue(mMonster.getMeta()); mMonsterId.setValue(mMonster.id); mName.setValue(mMonster.name); + mReactions.setValue(monster.getReactionDescriptions()); + mRegionalEffects.setValue(monster.getRegionalActionDescriptions()); mSavingThrows.setValue(monster.getSavingThrowsDescription()); mSenses.setValue(monster.getSensesDescription()); mSkills.setValue(monster.getSkillsDescription()); @@ -206,4 +210,4 @@ public class MonsterDetailViewModel extends ViewModel { mStrength.setValue(monster.getStrengthDescription()); mWisdom.setValue(monster.getWisdomDescription()); } -} \ No newline at end of file +} diff --git a/app/src/main/res/layout/fragment_monster.xml b/app/src/main/res/layout/fragment_monster.xml index af40099..fdde335 100644 --- a/app/src/main/res/layout/fragment_monster.xml +++ b/app/src/main/res/layout/fragment_monster.xml @@ -445,6 +445,8 @@ android:layout_marginEnd="8dp" android:layout_marginBottom="8dp" android:text="@string/label_actions" + android:textAppearance="@android:style/TextAppearance.Material.Title" + android:textColor="@color/colorPrimaryDark" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/abilities" /> @@ -488,6 +490,8 @@ android:layout_marginEnd="8dp" android:layout_marginBottom="8dp" android:text="@string/label_reactions" + android:textAppearance="@android:style/TextAppearance.Material.Title" + android:textColor="@color/colorPrimaryDark" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/actions" /> @@ -531,6 +535,8 @@ android:layout_marginEnd="8dp" android:layout_marginBottom="8dp" android:text="@string/label_legendary_actions" + android:textAppearance="@android:style/TextAppearance.Material.Title" + android:textColor="@color/colorPrimaryDark" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/reactions" /> @@ -574,6 +580,8 @@ android:layout_marginEnd="8dp" android:layout_marginBottom="8dp" android:text="@string/label_lair_actions" + android:textAppearance="@android:style/TextAppearance.Material.Title" + android:textColor="@color/colorPrimaryDark" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/legendaryActions" /> @@ -617,6 +625,8 @@ android:layout_marginEnd="8dp" android:layout_marginBottom="8dp" android:text="@string/label_regional_effects" + android:textAppearance="@android:style/TextAppearance.Material.Title" + android:textColor="@color/colorPrimaryDark" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/lairActions" /> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 21805ee..1042774 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -25,6 +25,7 @@ None Alignment Armor + Armor Class Base Speed Basic Info Burrow Speed @@ -52,6 +53,7 @@ Has Custom Speed Has a Shield Hit Dice + Hit Points + Intelligence Lair Actions