Adds other traits to the monster detail fragment.
Cleans up the monster detail fragment to work like the other fragments.
This commit is contained in:
@@ -13,6 +13,7 @@ import android.view.MenuInflater;
|
|||||||
import android.view.MenuItem;
|
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;
|
||||||
|
|
||||||
@@ -29,6 +30,7 @@ import com.majinnaibu.monstercards.models.Monster;
|
|||||||
import com.majinnaibu.monstercards.ui.shared.MCFragment;
|
import com.majinnaibu.monstercards.ui.shared.MCFragment;
|
||||||
import com.majinnaibu.monstercards.utils.Logger;
|
import com.majinnaibu.monstercards.utils.Logger;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
import io.reactivex.rxjava3.observers.DisposableSingleObserver;
|
import io.reactivex.rxjava3.observers.DisposableSingleObserver;
|
||||||
@@ -36,7 +38,7 @@ import io.reactivex.rxjava3.observers.DisposableSingleObserver;
|
|||||||
public class MonsterDetailFragment extends MCFragment {
|
public class MonsterDetailFragment extends MCFragment {
|
||||||
private ViewHolder mHolder;
|
private ViewHolder mHolder;
|
||||||
|
|
||||||
private MonsterDetailViewModel monsterDetailViewModel;
|
private MonsterDetailViewModel mViewModel;
|
||||||
|
|
||||||
public View onCreateView(@NonNull LayoutInflater inflater,
|
public View onCreateView(@NonNull LayoutInflater inflater,
|
||||||
ViewGroup container, Bundle savedInstanceState) {
|
ViewGroup container, Bundle savedInstanceState) {
|
||||||
@@ -45,18 +47,13 @@ public class MonsterDetailFragment extends MCFragment {
|
|||||||
assert arguments != null;
|
assert arguments != null;
|
||||||
UUID monsterId = UUID.fromString(MonsterDetailFragmentArgs.fromBundle(arguments).getMonsterId());
|
UUID monsterId = UUID.fromString(MonsterDetailFragmentArgs.fromBundle(arguments).getMonsterId());
|
||||||
setHasOptionsMenu(true);
|
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);
|
|
||||||
|
|
||||||
mHolder = new ViewHolder(root);
|
|
||||||
|
|
||||||
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) {
|
||||||
monsterDetailViewModel.setMonster(monster);
|
mViewModel.setMonster(monster);
|
||||||
dispose();
|
dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -66,134 +63,95 @@ public class MonsterDetailFragment extends MCFragment {
|
|||||||
dispose();
|
dispose();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
View root = inflater.inflate(R.layout.fragment_monster, container, false);
|
||||||
|
mHolder = new ViewHolder(root);
|
||||||
|
|
||||||
monsterDetailViewModel.getName().observe(getViewLifecycleOwner(), mHolder.name::setText);
|
mViewModel.getName().observe(getViewLifecycleOwner(), mHolder.name::setText);
|
||||||
monsterDetailViewModel.getMeta().observe(getViewLifecycleOwner(), mHolder.meta::setText);
|
mViewModel.getMeta().observe(getViewLifecycleOwner(), mHolder.meta::setText);
|
||||||
monsterDetailViewModel.getArmorClass().observe(getViewLifecycleOwner(), armorText -> mHolder.armorClass.setText(Html.fromHtml("<b>Armor Class</b> " + armorText)));
|
mViewModel.getArmorClass().observe(getViewLifecycleOwner(), armorText -> setupLabeledTextView(mHolder.armorClass, armorText, R.string.label_armor_class));
|
||||||
monsterDetailViewModel.getHitPoints().observe(getViewLifecycleOwner(), hitPoints -> mHolder.hitPoints.setText(Html.fromHtml("<b>Hit Points</b> " + hitPoints)));
|
mViewModel.getHitPoints().observe(getViewLifecycleOwner(), hitPoints -> setupLabeledTextView(mHolder.hitPoints, hitPoints, R.string.label_hit_points));
|
||||||
monsterDetailViewModel.getSpeed().observe(getViewLifecycleOwner(), speed -> mHolder.speed.setText(Html.fromHtml("<b>Speed</b> " + speed)));
|
mViewModel.getSpeed().observe(getViewLifecycleOwner(), speed -> setupLabeledTextView(mHolder.speed, speed, R.string.label_speed));
|
||||||
monsterDetailViewModel.getStrength().observe(getViewLifecycleOwner(), mHolder.strength::setText);
|
mViewModel.getStrength().observe(getViewLifecycleOwner(), mHolder.strength::setText);
|
||||||
monsterDetailViewModel.getDexterity().observe(getViewLifecycleOwner(), mHolder.dexterity::setText);
|
mViewModel.getDexterity().observe(getViewLifecycleOwner(), mHolder.dexterity::setText);
|
||||||
monsterDetailViewModel.getConstitution().observe(getViewLifecycleOwner(), mHolder.constitution::setText);
|
mViewModel.getConstitution().observe(getViewLifecycleOwner(), mHolder.constitution::setText);
|
||||||
monsterDetailViewModel.getIntelligence().observe(getViewLifecycleOwner(), mHolder.intelligence::setText);
|
mViewModel.getIntelligence().observe(getViewLifecycleOwner(), mHolder.intelligence::setText);
|
||||||
monsterDetailViewModel.getWisdom().observe(getViewLifecycleOwner(), mHolder.wisdom::setText);
|
mViewModel.getWisdom().observe(getViewLifecycleOwner(), mHolder.wisdom::setText);
|
||||||
monsterDetailViewModel.getCharisma().observe(getViewLifecycleOwner(), mHolder.charisma::setText);
|
mViewModel.getCharisma().observe(getViewLifecycleOwner(), mHolder.charisma::setText);
|
||||||
monsterDetailViewModel.getSavingThrows().observe(getViewLifecycleOwner(), savingThrows -> {
|
mViewModel.getSavingThrows().observe(getViewLifecycleOwner(), savingThrows -> setupOptionalTextView(mHolder.savingThrows, savingThrows, R.string.label_saving_throws));
|
||||||
if (StringHelper.isNullOrEmpty(savingThrows)) {
|
mViewModel.getSkills().observe(getViewLifecycleOwner(), skills -> setupOptionalTextView(mHolder.skills, skills, R.string.label_skills));
|
||||||
mHolder.savingThrows.setVisibility(View.GONE);
|
mViewModel.getDamageVulnerabilities().observe(getViewLifecycleOwner(), damageTypes -> setupOptionalTextView(mHolder.damageVulnerabilities, damageTypes, R.string.label_damage_vulnerabilities));
|
||||||
} else {
|
mViewModel.getDamageResistances().observe(getViewLifecycleOwner(), damageTypes -> setupOptionalTextView(mHolder.damageResistances, damageTypes, R.string.label_damage_resistances));
|
||||||
mHolder.savingThrows.setVisibility(View.VISIBLE);
|
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));
|
||||||
mHolder.savingThrows.setText(Html.fromHtml("<b>Saving Throws</b> " + savingThrows));
|
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));
|
||||||
monsterDetailViewModel.getSkills().observe(getViewLifecycleOwner(), skills -> {
|
mViewModel.getChallenge().observe(getViewLifecycleOwner(), challengeRating -> setupLabeledTextView(mHolder.challenge, challengeRating, R.string.label_challenge_rating));
|
||||||
if (StringHelper.isNullOrEmpty(skills)) {
|
mViewModel.getAbilities().observe(getViewLifecycleOwner(), abilities -> setupTraitList(mHolder.abilities, abilities));
|
||||||
mHolder.skills.setVisibility(View.GONE);
|
mViewModel.getActions().observe(getViewLifecycleOwner(), actions -> setupTraitList(mHolder.actions, actions, mHolder.actions_label, mHolder.actions_divider));
|
||||||
} else {
|
mViewModel.getReactions().observe(getViewLifecycleOwner(), reactions -> setupTraitList(mHolder.reactions, reactions, mHolder.reactions_label, mHolder.reactions_divider));
|
||||||
mHolder.skills.setVisibility(View.VISIBLE);
|
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));
|
||||||
mHolder.skills.setText(Html.fromHtml("<b>Skills</b> " + skills));
|
mViewModel.getLegendaryActions().observe(getViewLifecycleOwner(), legendaryActions -> setupTraitList(mHolder.legendaryActions, legendaryActions, mHolder.legendaryActions_label, mHolder.legendaryActions_divider));
|
||||||
});
|
|
||||||
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("<b>Damage Vulnerabilities</b> " + 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("<b>Damage Resistances</b> " + 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("<b>Damage Immunities</b> " + 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("<b>Condition Immunities</b> " + 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("<b>Senses</b> " + 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("<b>Languages</b> " + languages));
|
|
||||||
});
|
|
||||||
monsterDetailViewModel.getChallenge().observe(getViewLifecycleOwner(), challengeRating -> mHolder.challenge.setText(Html.fromHtml("<b>Challenge</b> " + 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
|
|
||||||
|
|
||||||
return root;
|
return root;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void setupLabeledTextView(TextView view, String text, int titleId) {
|
||||||
|
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 {
|
||||||
|
root.setVisibility(View.VISIBLE);
|
||||||
|
}
|
||||||
|
Spanned formatted;
|
||||||
|
if (StringHelper.isNullOrEmpty(title)) {
|
||||||
|
formatted = Html.fromHtml(text);
|
||||||
|
} else {
|
||||||
|
formatted = Html.fromHtml(String.format("<b>%s</b> %s", title, text));
|
||||||
|
}
|
||||||
|
root.setText(formatted);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setupTraitList(@NonNull LinearLayout root, @NonNull List<String> traits) {
|
||||||
|
setupTraitList(root, traits, null, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setupTraitList(@NonNull LinearLayout root, @NonNull List<String> 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
|
@Override
|
||||||
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
|
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
|
||||||
inflater.inflate(R.menu.monster_detail_menu, menu);
|
inflater.inflate(R.menu.monster_detail_menu, menu);
|
||||||
@@ -203,7 +161,7 @@ public class MonsterDetailFragment extends MCFragment {
|
|||||||
@Override
|
@Override
|
||||||
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
|
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
|
||||||
if (item.getItemId() == R.id.menu_action_edit_monster) {
|
if (item.getItemId() == R.id.menu_action_edit_monster) {
|
||||||
UUID monsterId = monsterDetailViewModel.getId().getValue();
|
UUID monsterId = mViewModel.getId().getValue();
|
||||||
if (monsterId != null) {
|
if (monsterId != null) {
|
||||||
NavDirections action = MonsterDetailFragmentDirections.actionNavigationMonsterToEditMonsterFragment(monsterId.toString());
|
NavDirections action = MonsterDetailFragmentDirections.actionNavigationMonsterToEditMonsterFragment(monsterId.toString());
|
||||||
Navigation.findNavController(requireView()).navigate(action);
|
Navigation.findNavController(requireView()).navigate(action);
|
||||||
@@ -238,10 +196,20 @@ public class MonsterDetailFragment extends MCFragment {
|
|||||||
final TextView challenge;
|
final TextView challenge;
|
||||||
final LinearLayout abilities;
|
final LinearLayout abilities;
|
||||||
final LinearLayout actions;
|
final LinearLayout actions;
|
||||||
|
final TextView actions_label;
|
||||||
|
final ImageView actions_divider;
|
||||||
final LinearLayout reactions;
|
final LinearLayout reactions;
|
||||||
|
final TextView reactions_label;
|
||||||
|
final ImageView reactions_divider;
|
||||||
final LinearLayout legendaryActions;
|
final LinearLayout legendaryActions;
|
||||||
|
final TextView legendaryActions_label;
|
||||||
|
final ImageView legendaryActions_divider;
|
||||||
final LinearLayout lairActions;
|
final LinearLayout lairActions;
|
||||||
|
final TextView lairActions_label;
|
||||||
|
final ImageView lairActions_divider;
|
||||||
final LinearLayout regionalEffects;
|
final LinearLayout regionalEffects;
|
||||||
|
final TextView regionalEffects_label;
|
||||||
|
final ImageView regionalEffects_divider;
|
||||||
|
|
||||||
ViewHolder(View root) {
|
ViewHolder(View root) {
|
||||||
name = root.findViewById(R.id.name);
|
name = root.findViewById(R.id.name);
|
||||||
@@ -266,10 +234,20 @@ public class MonsterDetailFragment extends MCFragment {
|
|||||||
challenge = root.findViewById(R.id.challenge);
|
challenge = root.findViewById(R.id.challenge);
|
||||||
abilities = root.findViewById(R.id.abilities);
|
abilities = root.findViewById(R.id.abilities);
|
||||||
actions = root.findViewById(R.id.actions);
|
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 = 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 = 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 = 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 = root.findViewById(R.id.regionalEffects);
|
||||||
|
regionalEffects_divider = root.findViewById(R.id.regionalEffects_divider);
|
||||||
|
regionalEffects_label = root.findViewById(R.id.regionalEffects_label);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,9 +25,13 @@ public class MonsterDetailViewModel extends ViewModel {
|
|||||||
private final MutableLiveData<String> mDexterity;
|
private final MutableLiveData<String> mDexterity;
|
||||||
private final MutableLiveData<String> mHitPoints;
|
private final MutableLiveData<String> mHitPoints;
|
||||||
private final MutableLiveData<String> mIntelligence;
|
private final MutableLiveData<String> mIntelligence;
|
||||||
|
private final MutableLiveData<List<String>> mLairActions;
|
||||||
private final MutableLiveData<String> mLanguages;
|
private final MutableLiveData<String> mLanguages;
|
||||||
|
private final MutableLiveData<List<String>> mLegendaryActions;
|
||||||
private final MutableLiveData<String> mMeta;
|
private final MutableLiveData<String> mMeta;
|
||||||
private final MutableLiveData<String> mName;
|
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> mSavingThrows;
|
||||||
private final MutableLiveData<String> mSenses;
|
private final MutableLiveData<String> mSenses;
|
||||||
private final MutableLiveData<String> mSkills;
|
private final MutableLiveData<String> mSkills;
|
||||||
@@ -39,52 +43,33 @@ public class MonsterDetailViewModel extends ViewModel {
|
|||||||
|
|
||||||
public MonsterDetailViewModel() {
|
public MonsterDetailViewModel() {
|
||||||
mMonster = null;
|
mMonster = null;
|
||||||
mAbilities = new MutableLiveData<>();
|
mAbilities = new MutableLiveData<>(new ArrayList<>());
|
||||||
mAbilities.setValue(new ArrayList<>());
|
mActions = new MutableLiveData<>(new ArrayList<>());
|
||||||
mActions = new MutableLiveData<>();
|
mArmorClass = new MutableLiveData<>("");
|
||||||
mActions.setValue(new ArrayList<>());
|
mChallenge = new MutableLiveData<>("");
|
||||||
mArmorClass = new MutableLiveData<>();
|
mCharisma = new MutableLiveData<>("");
|
||||||
mArmorClass.setValue("");
|
mConditionImmunities = new MutableLiveData<>("");
|
||||||
mChallenge = new MutableLiveData<>();
|
mConstitution = new MutableLiveData<>("");
|
||||||
mChallenge.setValue("");
|
mDamageImmunities = new MutableLiveData<>("");
|
||||||
mCharisma = new MutableLiveData<>();
|
mDamageResistances = new MutableLiveData<>("");
|
||||||
mCharisma.setValue("");
|
mDamageVulnerabilities = new MutableLiveData<>("");
|
||||||
mConditionImmunities = new MutableLiveData<>();
|
mDexterity = new MutableLiveData<>("");
|
||||||
mConditionImmunities.setValue("");
|
mHitPoints = new MutableLiveData<>("");
|
||||||
mConstitution = new MutableLiveData<>();
|
mIntelligence = new MutableLiveData<>("");
|
||||||
mConstitution.setValue("");
|
mLairActions = new MutableLiveData<>(new ArrayList<>());
|
||||||
mDamageImmunities = new MutableLiveData<>();
|
mLanguages = new MutableLiveData<>("");
|
||||||
mDamageImmunities.setValue("");
|
mLegendaryActions = new MutableLiveData<>(new ArrayList<>());
|
||||||
mDamageResistances = new MutableLiveData<>();
|
mMeta = new MutableLiveData<>("");
|
||||||
mDamageResistances.setValue("");
|
mName = new MutableLiveData<>("");
|
||||||
mDamageVulnerabilities = new MutableLiveData<>();
|
mReactions = new MutableLiveData<>(new ArrayList<>());
|
||||||
mDamageVulnerabilities.setValue("");
|
mRegionalEffects = new MutableLiveData<>(new ArrayList<>());
|
||||||
mDexterity = new MutableLiveData<>();
|
mSavingThrows = new MutableLiveData<>("");
|
||||||
mDexterity.setValue("");
|
mSenses = new MutableLiveData<>("");
|
||||||
mHitPoints = new MutableLiveData<>();
|
mSkills = new MutableLiveData<>("");
|
||||||
mHitPoints.setValue("");
|
mSpeed = new MutableLiveData<>("");
|
||||||
mIntelligence = new MutableLiveData<>();
|
mStrength = new MutableLiveData<>("");
|
||||||
mIntelligence.setValue("");
|
mWisdom = new MutableLiveData<>("");
|
||||||
mLanguages = new MutableLiveData<>();
|
mMonsterId = new MutableLiveData<>(UUID.fromString("00000000-0000-0000-0000-000000000000"));
|
||||||
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"));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public LiveData<List<String>> getAbilities() {
|
public LiveData<List<String>> getAbilities() {
|
||||||
@@ -95,6 +80,22 @@ public class MonsterDetailViewModel extends ViewModel {
|
|||||||
return mActions;
|
return mActions;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
}
|
}
|
||||||
@@ -181,7 +182,6 @@ public class MonsterDetailViewModel extends ViewModel {
|
|||||||
|
|
||||||
public void setMonster(Monster monster) {
|
public void setMonster(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());
|
||||||
@@ -195,10 +195,14 @@ 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);
|
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());
|
||||||
|
|||||||
@@ -445,6 +445,8 @@
|
|||||||
android:layout_marginEnd="8dp"
|
android:layout_marginEnd="8dp"
|
||||||
android:layout_marginBottom="8dp"
|
android:layout_marginBottom="8dp"
|
||||||
android:text="@string/label_actions"
|
android:text="@string/label_actions"
|
||||||
|
android:textAppearance="@android:style/TextAppearance.Material.Title"
|
||||||
|
android:textColor="@color/colorPrimaryDark"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toBottomOf="@+id/abilities" />
|
app:layout_constraintTop_toBottomOf="@+id/abilities" />
|
||||||
@@ -488,6 +490,8 @@
|
|||||||
android:layout_marginEnd="8dp"
|
android:layout_marginEnd="8dp"
|
||||||
android:layout_marginBottom="8dp"
|
android:layout_marginBottom="8dp"
|
||||||
android:text="@string/label_reactions"
|
android:text="@string/label_reactions"
|
||||||
|
android:textAppearance="@android:style/TextAppearance.Material.Title"
|
||||||
|
android:textColor="@color/colorPrimaryDark"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toBottomOf="@+id/actions" />
|
app:layout_constraintTop_toBottomOf="@+id/actions" />
|
||||||
@@ -531,6 +535,8 @@
|
|||||||
android:layout_marginEnd="8dp"
|
android:layout_marginEnd="8dp"
|
||||||
android:layout_marginBottom="8dp"
|
android:layout_marginBottom="8dp"
|
||||||
android:text="@string/label_legendary_actions"
|
android:text="@string/label_legendary_actions"
|
||||||
|
android:textAppearance="@android:style/TextAppearance.Material.Title"
|
||||||
|
android:textColor="@color/colorPrimaryDark"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toBottomOf="@+id/reactions" />
|
app:layout_constraintTop_toBottomOf="@+id/reactions" />
|
||||||
@@ -574,6 +580,8 @@
|
|||||||
android:layout_marginEnd="8dp"
|
android:layout_marginEnd="8dp"
|
||||||
android:layout_marginBottom="8dp"
|
android:layout_marginBottom="8dp"
|
||||||
android:text="@string/label_lair_actions"
|
android:text="@string/label_lair_actions"
|
||||||
|
android:textAppearance="@android:style/TextAppearance.Material.Title"
|
||||||
|
android:textColor="@color/colorPrimaryDark"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toBottomOf="@+id/legendaryActions" />
|
app:layout_constraintTop_toBottomOf="@+id/legendaryActions" />
|
||||||
@@ -617,6 +625,8 @@
|
|||||||
android:layout_marginEnd="8dp"
|
android:layout_marginEnd="8dp"
|
||||||
android:layout_marginBottom="8dp"
|
android:layout_marginBottom="8dp"
|
||||||
android:text="@string/label_regional_effects"
|
android:text="@string/label_regional_effects"
|
||||||
|
android:textAppearance="@android:style/TextAppearance.Material.Title"
|
||||||
|
android:textColor="@color/colorPrimaryDark"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toBottomOf="@+id/lairActions" />
|
app:layout_constraintTop_toBottomOf="@+id/lairActions" />
|
||||||
|
|||||||
@@ -25,6 +25,7 @@
|
|||||||
<string name="label_advantage_none">None</string>
|
<string name="label_advantage_none">None</string>
|
||||||
<string name="label_alignment">Alignment</string>
|
<string name="label_alignment">Alignment</string>
|
||||||
<string name="label_armor">Armor</string>
|
<string name="label_armor">Armor</string>
|
||||||
|
<string name="label_armor_class">Armor Class</string>
|
||||||
<string name="label_base_speed">Base Speed</string>
|
<string name="label_base_speed">Base Speed</string>
|
||||||
<string name="label_basic_info">Basic Info</string>
|
<string name="label_basic_info">Basic Info</string>
|
||||||
<string name="label_burrow_speed">Burrow Speed</string>
|
<string name="label_burrow_speed">Burrow Speed</string>
|
||||||
@@ -52,6 +53,7 @@
|
|||||||
<string name="label_has_custom_speed">Has Custom Speed</string>
|
<string name="label_has_custom_speed">Has Custom Speed</string>
|
||||||
<string name="label_has_a_shield">Has a Shield</string>
|
<string name="label_has_a_shield">Has a Shield</string>
|
||||||
<string name="label_hit_dice">Hit Dice</string>
|
<string name="label_hit_dice">Hit Dice</string>
|
||||||
|
<string name="label_hit_points">Hit Points</string>
|
||||||
<string name="label_increment_field">+</string>
|
<string name="label_increment_field">+</string>
|
||||||
<string name="label_intelligence">Intelligence</string>
|
<string name="label_intelligence">Intelligence</string>
|
||||||
<string name="label_lair_actions">Lair Actions</string>
|
<string name="label_lair_actions">Lair Actions</string>
|
||||||
|
|||||||
Reference in New Issue
Block a user