diff --git a/Android/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditLanguageFragment.java b/Android/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditLanguageFragment.java index bc39d8d..3039241 100644 --- a/Android/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditLanguageFragment.java +++ b/Android/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditLanguageFragment.java @@ -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; @@ -44,11 +44,14 @@ public class EditLanguageFragment extends MCFragment { @Nullable @Override - public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) { 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); mHolder.name.setText(mViewModel.getName().getValue()); @@ -70,17 +73,11 @@ public class EditLanguageFragment extends MCFragment { return root; } - @Override - public void onStart() { - super.onStart(); - mHolder.name.requestFocus(); - } - private static class ViewHolder { EditText name; - SwitchCompat canSpeak; + CheckBox canSpeak; - ViewHolder(@NonNull View root) { + ViewHolder(View root) { name = root.findViewById(R.id.name); canSpeak = root.findViewById(R.id.canSpeak); } diff --git a/Android/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditLanguageViewModel.java b/Android/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditLanguageViewModel.java index 1b38692..4a8632e 100644 --- a/Android/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditLanguageViewModel.java +++ b/Android/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditLanguageViewModel.java @@ -1,6 +1,5 @@ package com.majinnaibu.monstercards.ui.editmonster; -import androidx.annotation.NonNull; import androidx.lifecycle.LiveData; import com.majinnaibu.monstercards.models.Language; @@ -19,7 +18,7 @@ public class EditLanguageViewModel extends ChangeTrackedViewModel { mLanguage = new ChangeTrackedLiveData<>(makeLanguage(), this::makeDirty); } - public void copyFromLanguage(@NonNull Language language) { + public void copyFromLanguage(Language language) { mName.resetValue(language.getName()); mCanSpeak.resetValue(language.getSpeaks()); makeClean(); @@ -59,10 +58,9 @@ public class EditLanguageViewModel extends ChangeTrackedViewModel { return getCanSpeakValue(false); } - @NonNull private Language makeLanguage() { Boolean boxedValue = mCanSpeak.getValue(); boolean canSpeak = boxedValue != null && boxedValue; return new Language(mName.getValue(), canSpeak); } -} +} \ No newline at end of file diff --git a/Android/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditLanguagesFragment.java b/Android/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditLanguagesFragment.java index de9d70c..53740f9 100644 --- a/Android/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditLanguagesFragment.java +++ b/Android/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditLanguagesFragment.java @@ -26,22 +26,23 @@ import com.majinnaibu.monstercards.utils.Logger; import com.majinnaibu.monstercards.utils.TextChangedListener; public class EditLanguagesFragment extends MCFragment { - // TODO: Make the swipe to delete not happen for the header private EditMonsterViewModel mViewModel; private ViewHolder mHolder; - private void navigateToEditLanguage(@NonNull Language language) { + private void navigateToEditLanguage(Language language) { NavDirections action = EditLanguagesFragmentDirections.actionEditLanguagesFragmentToEditLanguageFragment(language.getName(), language.getSpeaks()); Navigation.findNavController(requireView()).navigate(action); } @Override - public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, + 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); + View root = inflater.inflate(R.layout.fragment_edit_languages_list, container, false); + mHolder = new ViewHolder(root); setupRecyclerView(mHolder.list); setupAddLanguageButton(mHolder.addLanguage); @@ -74,11 +75,7 @@ public class EditLanguagesFragment extends MCFragment { DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(context, layoutManager.getOrientation()); recyclerView.addItemDecoration(dividerItemDecoration); - ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new SwipeToDeleteCallback(context, (position, direction) -> { - if (position > 0) { - mViewModel.removeLanguage(position - 1); - } - }, null)); + ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new SwipeToDeleteCallback(context, mViewModel::removeLanguage)); itemTouchHelper.attachToRecyclerView(recyclerView); } @@ -93,9 +90,9 @@ public class EditLanguagesFragment extends MCFragment { RecyclerView list; FloatingActionButton addLanguage; - ViewHolder(@NonNull View root) { + ViewHolder(View root) { this.list = root.findViewById(R.id.list); this.addLanguage = root.findViewById(R.id.add_language); } } -} +} \ No newline at end of file diff --git a/Android/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditLanguagesRecyclerViewAdapter.java b/Android/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditLanguagesRecyclerViewAdapter.java index e9163c6..8a98b14 100644 --- a/Android/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditLanguagesRecyclerViewAdapter.java +++ b/Android/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditLanguagesRecyclerViewAdapter.java @@ -6,7 +6,6 @@ import android.view.ViewGroup; import android.widget.EditText; import android.widget.TextView; -import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import com.majinnaibu.monstercards.databinding.FragmentEditLanguagesListHeaderBinding; @@ -14,8 +13,9 @@ import com.majinnaibu.monstercards.databinding.FragmentEditLanguagesListItemBind import com.majinnaibu.monstercards.models.Language; import com.majinnaibu.monstercards.ui.components.Stepper; +import org.jetbrains.annotations.NotNull; + import java.util.List; -import java.util.Locale; public class EditLanguagesRecyclerViewAdapter extends RecyclerView.Adapter { private final List mValues; @@ -29,18 +29,18 @@ public class EditLanguagesRecyclerViewAdapter extends RecyclerView.Adapter items, ItemCallback onClick, int telepathyRange, Stepper.OnValueChangeListener telepathyRangeChangedListener, String understandsBut, TextWatcher understandsButChangedListener) { + public EditLanguagesRecyclerViewAdapter(List items, ItemCallback onClick, int telepathyRange, Stepper.OnValueChangeListener telepathyRangeChangedListener, String undderstandsBut, TextWatcher understandsButChangedListener) { mValues = items; mOnClick = onClick; mTelepathyRange = telepathyRange; mOnTelepathyRangeChanged = telepathyRangeChangedListener; - mUnderstandsBut = understandsBut; + mUnderstandsBut = undderstandsBut; mOnUnderstandsButChanged = understandsButChangedListener; } - @NonNull + @NotNull @Override - public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + public RecyclerView.ViewHolder onCreateViewHolder(@NotNull ViewGroup parent, int viewType) { if (viewType == HEADER_VIEW_TYPE) { return new HeaderViewHolder(FragmentEditLanguagesListHeaderBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); } @@ -48,17 +48,17 @@ public class EditLanguagesRecyclerViewAdapter extends RecyclerView.Adapter String.format(Locale.getDefault(), DISTANCE_IN_FEET_FORMAT, value)); + headerViewHolder.telepathy.setOnFormatValueCallback(value -> String.format(DISTANCE_IN_FEET_FORMAT, value)); headerViewHolder.telepathy.setValue(mTelepathyRange); headerViewHolder.telepathy.setOnValueChangeListener(mOnTelepathyRangeChanged); headerViewHolder.understandsBut.setText(mUnderstandsBut); headerViewHolder.understandsBut.addTextChangedListener(mOnUnderstandsButChanged); - } else if (holder instanceof ItemViewHolder) { - ItemViewHolder itemViewHolder = (ItemViewHolder) holder; - itemViewHolder.mItem = mValues.get(position - 1); + } else if(holder instanceof ItemViewHolder) { + ItemViewHolder itemViewHolder = (ItemViewHolder)holder; + itemViewHolder.mItem = mValues.get(position-1); itemViewHolder.mContentView.setText(itemViewHolder.mItem.getName()); itemViewHolder.itemView.setOnClickListener(view -> { if (mOnClick != null) { @@ -70,7 +70,7 @@ public class EditLanguagesRecyclerViewAdapter extends RecyclerView.Adapter { + NavDirections action = EditMonsterFragmentDirections.actionEditMonsterFragmentToEditSensesFragment(); + Navigation.findNavController(requireView()).navigate(action); + }); + + mHolder.conditionImmunities.setOnClickListener(v -> { + NavDirections action = EditMonsterFragmentDirections.actionEditMonsterFragmentToEditConditionImmunitiesFragment(); + Navigation.findNavController(requireView()).navigate(action); + }); + + mHolder.damageImmunities.setOnClickListener(v -> { + NavDirections action = EditMonsterFragmentDirections.actionEditMonsterFragmentToEditDamageImmunitiesFragment(); + Navigation.findNavController(requireView()).navigate(action); + }); + + mHolder.damageResistances.setOnClickListener(v -> { + NavDirections action = EditMonsterFragmentDirections.actionEditMonsterFragmentToEditDamageResistancesFragment(); + Navigation.findNavController(requireView()).navigate(action); + }); + + mHolder.damageVulnerabilities.setOnClickListener(v -> { + NavDirections action = EditMonsterFragmentDirections.actionEditMonsterFragmentToEditDamageVulnerabilitiesFragment(); + Navigation.findNavController(requireView()).navigate(action); + }); + + mHolder.languages.setOnClickListener(v -> { + NavDirections action = EditMonsterFragmentDirections.actionEditMonsterFragmentToEditLanguagesFragment(); + Navigation.findNavController(requireView()).navigate(action); + }); + requireActivity().getOnBackPressedDispatcher().addCallback(getViewLifecycleOwner(), new OnBackPressedCallback(true) { @Override public void handleOnBackPressed() { diff --git a/Android/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditMonsterViewModel.java b/Android/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditMonsterViewModel.java index 1af08b7..faf3f09 100644 --- a/Android/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditMonsterViewModel.java +++ b/Android/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditMonsterViewModel.java @@ -740,6 +740,10 @@ public class EditMonsterViewModel extends ChangeTrackedViewModel { return mTelepathyRange; } + public int getTelepathyRangeUnboxed() { + return Helpers.unboxInteger(mTelepathyRange.getValue(), 0); + } + public void setTelepathyRange(int telepathyRange) { mTelepathyRange.setValue(telepathyRange); } @@ -1189,5 +1193,12 @@ public class EditMonsterViewModel extends ChangeTrackedViewModel { static void replaceItemInList(MutableLiveData> listData, T oldItem, T newItem) { replaceItemInList(listData, oldItem, newItem, null); } + + static int unboxInteger(Integer value, int defaultIfNull) { + if (value == null) { + return defaultIfNull; + } + return value; + } } } diff --git a/Android/app/src/main/res/layout/fragment_edit_language.xml b/Android/app/src/main/res/layout/fragment_edit_language.xml index b6675bf..8d4e30a 100644 --- a/Android/app/src/main/res/layout/fragment_edit_language.xml +++ b/Android/app/src/main/res/layout/fragment_edit_language.xml @@ -25,12 +25,11 @@ tools:text="Medicine" /> - + android:text="@string/label_can_speak_language" /> + diff --git a/Android/app/src/main/res/layout/fragment_edit_languages_list_header.xml b/Android/app/src/main/res/layout/fragment_edit_languages_list_header.xml index d75977c..f6775d6 100644 --- a/Android/app/src/main/res/layout/fragment_edit_languages_list_header.xml +++ b/Android/app/src/main/res/layout/fragment_edit_languages_list_header.xml @@ -3,7 +3,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" - android:layout_height="wrap_content" + android:layout_height="match_parent" android:orientation="vertical"> @@ -33,4 +33,4 @@ app:maxValue="1000" app:minValue="0" app:stepAmount="5" /> - + \ No newline at end of file diff --git a/Android/app/src/main/res/layout/fragment_edit_languages_list_item.xml b/Android/app/src/main/res/layout/fragment_edit_languages_list_item.xml index ea0dc65..6e9049a 100644 --- a/Android/app/src/main/res/layout/fragment_edit_languages_list_item.xml +++ b/Android/app/src/main/res/layout/fragment_edit_languages_list_item.xml @@ -6,8 +6,8 @@ - + \ No newline at end of file diff --git a/Android/app/src/main/res/navigation/mobile_navigation.xml b/Android/app/src/main/res/navigation/mobile_navigation.xml index 4ddc3c9..64226ac 100644 --- a/Android/app/src/main/res/navigation/mobile_navigation.xml +++ b/Android/app/src/main/res/navigation/mobile_navigation.xml @@ -93,6 +93,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Android/app/src/main/res/values/strings.xml b/Android/app/src/main/res/values/strings.xml index c1c0db3..9230d5e 100644 --- a/Android/app/src/main/res/values/strings.xml +++ b/Android/app/src/main/res/values/strings.xml @@ -1,6 +1,9 @@ Add monster + Add Sense Add Skill + Add Language + Add Condition Edit Actions MonsterCards @@ -50,6 +53,7 @@ Legendary Actions Natural Armor Bonus Name + Understands But Proficiency Expertise None @@ -66,6 +70,7 @@ Strength Subtype Swim Speed + Telepathy Type Wisdom section divider @@ -78,4 +83,8 @@ Library Search WIS + Description + Damage Type + Add Damage Type + Can Speak \ No newline at end of file