View cleanup.

Makes more numeric fields Steppers.
Sets titles for fragments.
Sets focus on the first EditText on most edit pages.
Makes Checkbox be a SwitchCompat
Fixes monster list item view.
This commit is contained in:
Tom Hicks
2021-06-26 02:37:37 -07:00
parent 36c26e4c42
commit 2427f69da9
28 changed files with 258 additions and 124 deletions

View File

@@ -29,11 +29,9 @@ public class EditAbilityScoresFragment extends MCFragment {
NavController navController = Navigation.findNavController(requireActivity(), R.id.nav_host_fragment);
NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.edit_monster_navigation);
mViewModel = new ViewModelProvider(backStackEntry).get(EditMonsterViewModel.class);
// Inflate the layout for this fragment
View root = inflater.inflate(R.layout.fragment_edit_ability_scores, container, false);
mHolder = new ViewHolder(root);
setTitle(getString(R.string.title_edit_ability_scores));
mViewModel.getStrength().observe(getViewLifecycleOwner(), value -> mHolder.strength.setValue(value));
mHolder.strength.setOnValueChangeListener((newValue, oldValue) -> mViewModel.setStrength(newValue));
@@ -79,4 +77,4 @@ public class EditAbilityScoresFragment extends MCFragment {
charisma = root.findViewById(R.id.charisma);
}
}
}
}

View File

@@ -21,6 +21,7 @@ import androidx.navigation.Navigation;
import com.majinnaibu.monstercards.R;
import com.majinnaibu.monstercards.data.enums.ArmorType;
import com.majinnaibu.monstercards.helpers.ArrayHelper;
import com.majinnaibu.monstercards.ui.components.Stepper;
import com.majinnaibu.monstercards.ui.shared.MCFragment;
import com.majinnaibu.monstercards.utils.TextChangedListener;
@@ -34,11 +35,9 @@ public class EditArmorFragment extends MCFragment {
NavController navController = Navigation.findNavController(requireActivity(), R.id.nav_host_fragment);
NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.edit_monster_navigation);
mViewModel = new ViewModelProvider(backStackEntry).get(EditMonsterViewModel.class);
// Inflate the layout for this fragment
View root = inflater.inflate(R.layout.fragment_edit_armor, container, false);
mHolder = new ViewHolder(root);
setTitle(getString(R.string.title_edit_armor));
mHolder.armorType.setAdapter(new ArrayAdapter<ArmorType>(requireContext(), R.layout.dropdown_list_item, ArmorType.values()) {
@NonNull
@@ -73,14 +72,14 @@ public class EditArmorFragment extends MCFragment {
});
mHolder.armorType.setSelection(ArrayHelper.indexOf(ArmorType.values(), mViewModel.getArmorType().getValue()));
mHolder.naturalArmorBonus.setText(mViewModel.getNaturalArmorBonusValueAsString());
mHolder.naturalArmorBonus.addTextChangedListener((new TextChangedListener((TextChangedListener.OnTextChangedCallback) (s, start, before, count) -> mViewModel.setNaturalArmorBonus(s.toString()))));
mHolder.naturalArmorBonus.setValue(mViewModel.getNaturalArmorBonusUnboxed());
mHolder.naturalArmorBonus.setOnValueChangeListener((newValue, oldValue) -> mViewModel.setNaturalArmorBonus(newValue));
mHolder.hasShield.setChecked(mViewModel.getHasShieldValueAsBoolean());
mHolder.hasShield.setOnCheckedChangeListener((buttonView, isChecked) -> mViewModel.setHasShield(isChecked));
mHolder.shieldBonus.setText(mViewModel.getShieldBonusValueAsString());
mHolder.shieldBonus.addTextChangedListener((new TextChangedListener((TextChangedListener.OnTextChangedCallback) (s, start, before, count) -> mViewModel.setShieldBonus(s.toString()))));
mHolder.shieldBonus.setValue(mViewModel.getShieldBonusUnboxed());
mHolder.shieldBonus.setOnValueChangeListener((newValue, oldValue) -> mViewModel.setShieldBonus(newValue));
mHolder.customArmor.setText(mViewModel.getCustomArmor().getValue());
mHolder.customArmor.addTextChangedListener((new TextChangedListener((TextChangedListener.OnTextChangedCallback) (s, start, before, count) -> mViewModel.setCustomArmor(s.toString()))));
@@ -90,9 +89,9 @@ public class EditArmorFragment extends MCFragment {
private static class ViewHolder {
private final Spinner armorType;
private final EditText naturalArmorBonus;
private final Stepper naturalArmorBonus;
private final SwitchCompat hasShield;
private final EditText shieldBonus;
private final Stepper shieldBonus;
private final EditText customArmor;
ViewHolder(View root) {
@@ -103,4 +102,4 @@ public class EditArmorFragment extends MCFragment {
customArmor = root.findViewById(R.id.customArmor);
}
}
}
}

View File

@@ -13,6 +13,7 @@ import androidx.navigation.Navigation;
import com.google.android.material.switchmaterial.SwitchMaterial;
import com.majinnaibu.monstercards.R;
import com.majinnaibu.monstercards.ui.components.Stepper;
import com.majinnaibu.monstercards.ui.shared.MCFragment;
import com.majinnaibu.monstercards.utils.TextChangedListener;
@@ -20,17 +21,22 @@ public class EditBasicInfoFragment extends MCFragment {
private EditMonsterViewModel mViewModel;
private ViewHolder mHolder;
@Override
public void onStart() {
super.onStart();
mHolder.name.requestFocus();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
NavController navController = Navigation.findNavController(requireActivity(), R.id.nav_host_fragment);
NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.edit_monster_navigation);
mViewModel = new ViewModelProvider(backStackEntry).get(EditMonsterViewModel.class);
// Inflate the layout for this fragment
View root = inflater.inflate(R.layout.fragment_edit_basic_info, container, false);
setTitle(getString(R.string.title_edit_basic_info));
mHolder = new ViewHolder(root);
mHolder.name.setText(mViewModel.getName().getValue());
mHolder.name.addTextChangedListener(new TextChangedListener((TextChangedListener.OnTextChangedCallback) (s, start, before, count) -> mViewModel.setName(s.toString())));
@@ -49,8 +55,8 @@ public class EditBasicInfoFragment extends MCFragment {
mHolder.customHitPoints.setText(mViewModel.getCustomHitPoints().getValue());
mHolder.customHitPoints.addTextChangedListener((new TextChangedListener((TextChangedListener.OnTextChangedCallback) (s, start, before, count) -> mViewModel.setCustomHitPoints(s.toString()))));
mHolder.hitDice.setText(mViewModel.getHitDiceValueAsString());
mHolder.hitDice.addTextChangedListener((new TextChangedListener((TextChangedListener.OnTextChangedCallback) (s, start, before, count) -> mViewModel.setHitDice(s.toString()))));
mHolder.hitDice.setValue(mViewModel.getHitDiceUnboxed());
mHolder.hitDice.setOnValueChangeListener((newValue, oldValue) -> mViewModel.setHitDice(newValue));
mHolder.hasCustomHitPoints.setChecked(mViewModel.getHasCustomHitPointsValueAsBoolean());
mHolder.hasCustomHitPoints.setOnCheckedChangeListener((button, isChecked) -> mViewModel.setHasCustomHitPoints(isChecked));
@@ -65,7 +71,7 @@ public class EditBasicInfoFragment extends MCFragment {
private final EditText subtype;
private final EditText alignment;
private final EditText customHitPoints;
private final EditText hitDice;
private final Stepper hitDice;
private final SwitchMaterial hasCustomHitPoints;
ViewHolder(View root) {
@@ -79,4 +85,4 @@ public class EditBasicInfoFragment extends MCFragment {
hasCustomHitPoints = root.findViewById(R.id.hasCustomHitPoints);
}
}
}
}

View File

@@ -33,10 +33,9 @@ public class EditChallengeRatingFragment extends MCFragment {
NavController navController = Navigation.findNavController(requireActivity(), R.id.nav_host_fragment);
NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.edit_monster_navigation);
mViewModel = new ViewModelProvider(backStackEntry).get(EditMonsterViewModel.class);
// Inflate the layout for this fragment
View root = inflater.inflate(R.layout.fragment_edit_challenge_rating, container, false);
mHolder = new ViewHolder(root);
setTitle(getString(R.string.title_edit_challenge_rating));
mHolder.challengeRating.setAdapter(new ArrayAdapter<ChallengeRating>(requireContext(), R.layout.dropdown_list_item, ChallengeRating.values()) {
@NonNull
@@ -90,4 +89,4 @@ public class EditChallengeRatingFragment extends MCFragment {
customProficiencyBonus = root.findViewById(R.id.customProficiencyBonus);
}
}
}
}

View File

@@ -4,12 +4,12 @@ import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.EditText;
import androidx.activity.OnBackPressedCallback;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.SwitchCompat;
import androidx.lifecycle.ViewModelProvider;
import androidx.navigation.NavBackStackEntry;
import androidx.navigation.NavController;
@@ -48,11 +48,9 @@ public class EditLanguageFragment extends MCFragment {
NavController navController = Navigation.findNavController(requireActivity(), R.id.nav_host_fragment);
NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.edit_monster_navigation);
mEditMonsterViewModel = new ViewModelProvider(backStackEntry).get(EditMonsterViewModel.class);
View root = inflater.inflate(R.layout.fragment_edit_language, container, false);
mHolder = new ViewHolder(root);
setTitle(getString(R.string.title_edit_language));
mHolder.name.setText(mViewModel.getName().getValue());
mHolder.name.addTextChangedListener(new TextChangedListener((TextChangedListener.OnTextChangedCallback) (s, start, before, count) -> mViewModel.setName(s.toString())));
@@ -73,9 +71,15 @@ public class EditLanguageFragment extends MCFragment {
return root;
}
@Override
public void onStart() {
super.onStart();
mHolder.name.requestFocus();
}
private static class ViewHolder {
EditText name;
CheckBox canSpeak;
SwitchCompat canSpeak;
ViewHolder(View root) {
name = root.findViewById(R.id.name);

View File

@@ -41,10 +41,9 @@ public class EditLanguagesFragment extends MCFragment {
NavController navController = Navigation.findNavController(requireActivity(), R.id.nav_host_fragment);
NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.edit_monster_navigation);
mViewModel = new ViewModelProvider(backStackEntry).get(EditMonsterViewModel.class);
View root = inflater.inflate(R.layout.fragment_edit_languages_list, container, false);
mHolder = new ViewHolder(root);
setTitle(getString(R.string.title_edit_languages));
setupRecyclerView(mHolder.list);
setupAddLanguageButton(mHolder.addLanguage);

View File

@@ -332,6 +332,10 @@ public class EditMonsterViewModel extends ChangeTrackedViewModel {
this.setHitDice(parsedHitDice != null ? parsedHitDice : 0);
}
public int getHitDiceUnboxed() {
return Helpers.unboxInteger(mHitDice.getValue(), 1);
}
public String getHitDiceValueAsString() {
return mHitDice.getValue().toString();
}
@@ -349,6 +353,10 @@ public class EditMonsterViewModel extends ChangeTrackedViewModel {
this.setNaturalArmorBonus(parsedValue != null ? parsedValue : 0);
}
public int getNaturalArmorBonusUnboxed() {
return Helpers.unboxInteger(mNaturalArmorBonus.getValue(), 0);
}
public String getNaturalArmorBonusValueAsString() {
return mNaturalArmorBonus.getValue().toString();
}
@@ -398,6 +406,10 @@ public class EditMonsterViewModel extends ChangeTrackedViewModel {
this.setShieldBonus(parsedValue != null ? parsedValue : 0);
}
public int getShieldBonusUnboxed() {
return Helpers.unboxInteger(mShieldBonus.getValue(), 0);
}
public LiveData<String> getCustomArmor() {
return mCustomArmor;
}

View File

@@ -25,11 +25,10 @@ public class EditSavingThrowsFragment extends MCFragment {
NavController navController = Navigation.findNavController(requireActivity(), R.id.nav_host_fragment);
NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.edit_monster_navigation);
mViewModel = new ViewModelProvider(backStackEntry).get(EditMonsterViewModel.class);
// Inflate the layout for this fragment
View root = inflater.inflate(R.layout.fragment_edit_saving_throws, container, false);
mViewHolder = new ViewHolder(root);
setTitle(getString(R.string.title_edit_saving_throws));
mViewHolder.strengthProficiency.setValue(mViewModel.getStrengthProficiency().getValue());
mViewHolder.strengthProficiency.setOnValueChangedListener(value -> mViewModel.setStrengthProficiency(value));
mViewHolder.strengthAdvantage.setValue(mViewModel.getStrengthAdvantage().getValue());
@@ -92,4 +91,4 @@ public class EditSavingThrowsFragment extends MCFragment {
charismaProficiency = root.findViewById(R.id.charismaProficiency);
}
}
}
}

View File

@@ -24,7 +24,6 @@ import com.majinnaibu.monstercards.utils.Logger;
import com.majinnaibu.monstercards.utils.TextChangedListener;
public class EditSkillFragment extends MCFragment {
// TODO: when this view is shown select focus on the name edit text and select it's contents
private EditMonsterViewModel mEditMonsterViewModel;
private EditSkillViewModel mViewModel;
private ViewHolder mHolder;
@@ -50,11 +49,9 @@ public class EditSkillFragment extends MCFragment {
NavController navController = Navigation.findNavController(requireActivity(), R.id.nav_host_fragment);
NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.edit_monster_navigation);
mEditMonsterViewModel = new ViewModelProvider(backStackEntry).get(EditMonsterViewModel.class);
// Inflate the layout for this fragment
View root = inflater.inflate(R.layout.fragment_edit_skill, container, false);
mHolder = new ViewHolder(root);
setTitle(getString(R.string.title_edit_skill));
mHolder.abilityScore.setValue(mViewModel.getAbilityScore().getValue());
mHolder.abilityScore.setOnValueChangedListener(value -> mViewModel.setAbilityScore(value));
@@ -81,6 +78,12 @@ public class EditSkillFragment extends MCFragment {
return root;
}
@Override
public void onStart() {
super.onStart();
mHolder.name.requestFocus();
}
private static class ViewHolder {
AbilityScorePicker abilityScore;
AdvantagePicker advantage;

View File

@@ -42,10 +42,9 @@ public class EditSkillsFragment extends MCFragment {
NavController navController = Navigation.findNavController(requireActivity(), R.id.nav_host_fragment);
NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.edit_monster_navigation);
mViewModel = new ViewModelProvider(backStackEntry).get(EditMonsterViewModel.class);
View root = inflater.inflate(R.layout.fragment_edit_skills_list, container, false);
mHolder = new ViewHolder(root);
setTitle(getString(R.string.title_edit_skills));
setupRecyclerView(mHolder.list);
setupAddSkillButton(mHolder.addSkill);

View File

@@ -27,11 +27,9 @@ public class EditSpeedFragment extends MCFragment {
NavController navController = Navigation.findNavController(requireActivity(), R.id.nav_host_fragment);
NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.edit_monster_navigation);
mViewModel = new ViewModelProvider(backStackEntry).get(EditMonsterViewModel.class);
// Inflate the layout for this fragment
View root = inflater.inflate(R.layout.fragment_edit_speed, container, false);
mHolder = new ViewHolder(root);
setTitle(getString(R.string.title_edit_speed));
mHolder.baseSpeed.setOnValueChangeListener((newValue, oldValue) -> mViewModel.setWalkSpeed(newValue));
mHolder.baseSpeed.setOnFormatValueCallback(value -> String.format(getString(R.string.format_distance_in_feet), value));
@@ -89,4 +87,4 @@ public class EditSpeedFragment extends MCFragment {
}
}
}
}

View File

@@ -21,7 +21,6 @@ import com.majinnaibu.monstercards.utils.Logger;
import com.majinnaibu.monstercards.utils.TextChangedListener;
public class EditStringFragment extends MCFragment {
// TODO: when this fragment is shown focus on the edit text and select it's contents
private EditMonsterViewModel mEditMonsterViewModel;
private EditStringViewModel mViewModel;
private ViewHolder mHolder;
@@ -52,6 +51,7 @@ public class EditStringFragment extends MCFragment {
mEditMonsterViewModel = new ViewModelProvider(backStackEntry).get(EditMonsterViewModel.class);
View root = inflater.inflate(R.layout.fragment_edit_string, container, false);
mHolder = new ViewHolder(root);
setTitle(getTitleForStringType(mStringType));
mHolder.description.setText(mViewModel.getValueAsString());
mHolder.description.addTextChangedListener(new TextChangedListener((TextChangedListener.OnTextChangedCallback) (s, start, before, count) -> mViewModel.setValue(s.toString())));
@@ -69,14 +69,34 @@ public class EditStringFragment extends MCFragment {
return root;
}
private String getTitleForStringType(StringType type) {
switch (type) {
case CONDITION_IMMUNITY:
return getString(R.string.title_edit_condition_immunity);
case DAMAGE_IMMUNITY:
return getString(R.string.title_edit_damage_immunity);
case DAMAGE_RESISTANCE:
return getString(R.string.title_edit_damage_resistance);
case DAMAGE_VULNERABILITY:
return getString(R.string.title_edit_damage_vulnerability);
case SENSE:
return getString(R.string.title_edit_sense);
default:
return "";
}
}
@Override
public void onStart() {
super.onStart();
mHolder.description.requestFocus();
}
private static class ViewHolder {
EditText description;
EditText name;
ViewHolder(View root) {
description = root.findViewById(R.id.description);
name = root.findViewById(R.id.name);
}
}
}

View File

@@ -56,11 +56,29 @@ public class EditStringsFragment extends MCFragment {
mViewModel = new ViewModelProvider(backStackEntry).get(EditMonsterViewModel.class);
View root = inflater.inflate(R.layout.fragment_edit_strings_list, container, false);
mHolder = new ViewHolder(root);
setTitle(getTitleForStringType(mStringType));
setupRecyclerView(mHolder.list);
setupAddButton(mHolder.addItem);
return root;
}
private String getTitleForStringType(StringType type) {
switch (type) {
case CONDITION_IMMUNITY:
return getString(R.string.title_edit_condition_immunities);
case DAMAGE_IMMUNITY:
return getString(R.string.title_edit_damage_immunities);
case DAMAGE_RESISTANCE:
return getString(R.string.title_edit_damage_resistances);
case DAMAGE_VULNERABILITY:
return getString(R.string.title_edit_damage_vulnerabilities);
case SENSE:
return getString(R.string.title_edit_senses);
default:
return "";
}
}
private void setupRecyclerView(@NonNull RecyclerView recyclerView) {
Context context = requireContext();
LinearLayoutManager layoutManager = new LinearLayoutManager(context);

View File

@@ -52,6 +52,7 @@ public class EditTraitFragment extends MCFragment {
mEditMonsterViewModel = new ViewModelProvider(backStackEntry).get(EditMonsterViewModel.class);
View root = inflater.inflate(R.layout.fragment_edit_trait, container, false);
mHolder = new EditTraitFragment.ViewHolder(root);
setTitle(getTitleForTraitType(mTraitType));
mHolder.name.setText(mViewModel.getNameAsString());
mHolder.name.addTextChangedListener(new TextChangedListener((TextChangedListener.OnTextChangedCallback) (s, start, before, count) -> mViewModel.setName(s.toString())));
@@ -72,6 +73,31 @@ public class EditTraitFragment extends MCFragment {
return root;
}
@Override
public void onStart() {
super.onStart();
mHolder.name.requestFocus();
}
private String getTitleForTraitType(TraitType type) {
switch (type) {
case ABILITY:
return getString(R.string.title_edit_ability);
case ACTION:
return getString(R.string.title_edit_action);
case LAIR_ACTION:
return getString(R.string.title_edit_lair_action);
case LEGENDARY_ACTION:
return getString(R.string.title_edit_legendary_action);
case REACTIONS:
return getString(R.string.title_edit_reaction);
case REGIONAL_ACTION:
return getString(R.string.title_edit_regional_action);
default:
return "";
}
}
private static class ViewHolder {
EditText description;
EditText name;

View File

@@ -57,11 +57,31 @@ public class EditTraitsFragment extends MCFragment {
mViewModel = new ViewModelProvider(backStackEntry).get(EditMonsterViewModel.class);
View root = inflater.inflate(R.layout.fragment_edit_traits_list, container, false);
mHolder = new ViewHolder(root);
setTitle(getTitleForTraitType(mTraitType));
setupRecyclerView(mHolder.list);
setupAddButton(mHolder.addTrait);
return root;
}
private String getTitleForTraitType(TraitType type) {
switch (type) {
case ABILITY:
return getString(R.string.title_edit_abilities);
case ACTION:
return getString(R.string.title_edit_actions);
case LAIR_ACTION:
return getString(R.string.title_edit_lair_actions);
case LEGENDARY_ACTION:
return getString(R.string.title_edit_legendary_actions);
case REACTIONS:
return getString(R.string.title_edit_reactions);
case REGIONAL_ACTION:
return getString(R.string.title_edit_regional_actions);
default:
return "";
}
}
private void setupRecyclerView(@NonNull RecyclerView recyclerView) {
Context context = requireContext();
LinearLayoutManager layoutManager = new LinearLayoutManager(context);

View File

@@ -60,7 +60,6 @@ public class MonsterListRecyclerViewAdapter extends RecyclerView.Adapter<Monster
@Override
public void onBindViewHolder(final @NonNull ViewHolder holder, int position) {
Monster monster = mValues.get(position);
holder.mIdView.setText(monster.id.toString().substring(0, 6));
holder.mContentView.setText(monster.name);
holder.itemView.setTag(monster);
holder.itemView.setOnClickListener(mOnClickListener);
@@ -106,12 +105,10 @@ public class MonsterListRecyclerViewAdapter extends RecyclerView.Adapter<Monster
}
static class ViewHolder extends RecyclerView.ViewHolder {
final TextView mIdView;
final TextView mContentView;
ViewHolder(View view) {
super(view);
mIdView = view.findViewById(R.id.id_text);
mContentView = view.findViewById(R.id.content);
}
}

View File

@@ -63,7 +63,6 @@ public class SearchResultsRecyclerViewAdapter extends RecyclerView.Adapter<Searc
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
Monster monster = mValues.get(position);
holder.mIdView.setText(monster.id.toString().substring(0, 6));
holder.mContentView.setText(monster.name);
holder.itemView.setTag(monster);
holder.itemView.setOnClickListener(view -> {
@@ -83,12 +82,10 @@ public class SearchResultsRecyclerViewAdapter extends RecyclerView.Adapter<Searc
}
public static class ViewHolder extends RecyclerView.ViewHolder {
final TextView mIdView;
final TextView mContentView;
ViewHolder(View view) {
super(view);
mIdView = view.findViewById(R.id.id_text);
mContentView = view.findViewById(R.id.content);
}
}