From 884ffdd2184ed2f5283f2f183f90239f8ccf003c Mon Sep 17 00:00:00 2001 From: Tom Hicks Date: Sun, 20 Jun 2021 19:35:16 -0700 Subject: [PATCH] Adds damage resistances to monster editor. --- .../placeholder/PlaceholderContent.java | 72 --------------- .../EditDamageResistanceFragment.java | 76 +++++++++++++++ .../EditDamageResistancesFragment.java | 92 +++++++++++++++++++ ...tDamageResistancesRecyclerViewAdapter.java | 69 ++++++++++++++ .../ui/editmonster/EditMonsterFragment.java | 5 + .../ui/editmonster/EditSenseFragment.java | 3 +- .../fragment_edit_damage_resistance.xml | 17 ++++ .../fragment_edit_damage_resistances_list.xml | 33 +++++++ ...ment_edit_damage_resistances_list_item.xml | 13 +++ .../main/res/navigation/mobile_navigation.xml | 21 +++++ app/src/main/res/values/strings.xml | 2 + 11 files changed, 329 insertions(+), 74 deletions(-) delete mode 100644 app/src/main/java/com/majinnaibu/monstercards/placeholder/PlaceholderContent.java create mode 100644 app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditDamageResistanceFragment.java create mode 100644 app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditDamageResistancesFragment.java create mode 100644 app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditDamageResistancesRecyclerViewAdapter.java create mode 100644 app/src/main/res/layout/fragment_edit_damage_resistance.xml create mode 100644 app/src/main/res/layout/fragment_edit_damage_resistances_list.xml create mode 100644 app/src/main/res/layout/fragment_edit_damage_resistances_list_item.xml diff --git a/app/src/main/java/com/majinnaibu/monstercards/placeholder/PlaceholderContent.java b/app/src/main/java/com/majinnaibu/monstercards/placeholder/PlaceholderContent.java deleted file mode 100644 index 8a7120e..0000000 --- a/app/src/main/java/com/majinnaibu/monstercards/placeholder/PlaceholderContent.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.majinnaibu.monstercards.placeholder; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * Helper class for providing sample content for user interfaces created by - * Android template wizards. - *

- * TODO: Replace all uses of this class before publishing your app. - */ -public class PlaceholderContent { - - /** - * An array of sample (placeholder) items. - */ - public static final List ITEMS = new ArrayList(); - - /** - * A map of sample (placeholder) items, by ID. - */ - public static final Map ITEM_MAP = new HashMap(); - - private static final int COUNT = 25; - - static { - // Add some sample items. - for (int i = 1; i <= COUNT; i++) { - addItem(createPlaceholderItem(i)); - } - } - - private static void addItem(PlaceholderItem item) { - ITEMS.add(item); - ITEM_MAP.put(item.id, item); - } - - private static PlaceholderItem createPlaceholderItem(int position) { - return new PlaceholderItem(String.valueOf(position), "Item " + position, makeDetails(position)); - } - - private static String makeDetails(int position) { - StringBuilder builder = new StringBuilder(); - builder.append("Details about Item: ").append(position); - for (int i = 0; i < position; i++) { - builder.append("\nMore details information here."); - } - return builder.toString(); - } - - /** - * A placeholder item representing a piece of content. - */ - public static class PlaceholderItem { - public final String id; - public final String content; - public final String details; - - public PlaceholderItem(String id, String content, String details) { - this.id = id; - this.content = content; - this.details = details; - } - - @Override - public String toString() { - return content; - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditDamageResistanceFragment.java b/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditDamageResistanceFragment.java new file mode 100644 index 0000000..59982ae --- /dev/null +++ b/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditDamageResistanceFragment.java @@ -0,0 +1,76 @@ +package com.majinnaibu.monstercards.ui.editmonster; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.EditText; + +import androidx.activity.OnBackPressedCallback; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.lifecycle.ViewModelProvider; +import androidx.navigation.NavBackStackEntry; +import androidx.navigation.NavController; +import androidx.navigation.Navigation; + +import com.majinnaibu.monstercards.R; +import com.majinnaibu.monstercards.ui.shared.MCFragment; +import com.majinnaibu.monstercards.utils.Logger; +import com.majinnaibu.monstercards.utils.TextChangedListener; + +public class EditDamageResistanceFragment extends MCFragment { + private EditMonsterViewModel mEditMonsterViewModel; + private EditStringViewModel mViewModel; + private EditDamageResistanceFragment.ViewHolder mHolder; + private String mOldDamageResistance; + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + mViewModel = new ViewModelProvider(this).get(EditStringViewModel.class); + if (getArguments() != null) { + EditDamageResistanceFragmentArgs args = EditDamageResistanceFragmentArgs.fromBundle(getArguments()); + mOldDamageResistance = args.getDamageType(); + mViewModel.resetValue(mOldDamageResistance); + } else { + Logger.logWTF("EditDamageResistanceFragment needs arguments"); + mOldDamageResistance = null; + } + super.onCreate(savedInstanceState); + } + + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, + @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_damage_resistance, container, false); + + mHolder = new EditDamageResistanceFragment.ViewHolder(root); + + mHolder.value.setText(mViewModel.getValueAsString()); + mHolder.value.addTextChangedListener(new TextChangedListener((TextChangedListener.OnTextChangedCallback) (s, start, before, count) -> mViewModel.setValue(s.toString()))); + + requireActivity().getOnBackPressedDispatcher().addCallback(getViewLifecycleOwner(), new OnBackPressedCallback(true) { + @Override + public void handleOnBackPressed() { + if (mViewModel.hasChanges()) { + mEditMonsterViewModel.replaceDamageResistance(mOldDamageResistance, mViewModel.getValueAsString()); + } + Navigation.findNavController(requireView()).navigateUp(); + } + }); + + return root; + } + + private static class ViewHolder { + EditText value; + + ViewHolder(View root) { + value = root.findViewById(R.id.value); + } + } +} diff --git a/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditDamageResistancesFragment.java b/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditDamageResistancesFragment.java new file mode 100644 index 0000000..56c2234 --- /dev/null +++ b/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditDamageResistancesFragment.java @@ -0,0 +1,92 @@ +package com.majinnaibu.monstercards.ui.editmonster; + +import android.content.Context; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.lifecycle.ViewModelProvider; +import androidx.navigation.NavBackStackEntry; +import androidx.navigation.NavController; +import androidx.navigation.NavDirections; +import androidx.navigation.Navigation; +import androidx.recyclerview.widget.DividerItemDecoration; +import androidx.recyclerview.widget.ItemTouchHelper; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.google.android.material.floatingactionbutton.FloatingActionButton; +import com.majinnaibu.monstercards.R; +import com.majinnaibu.monstercards.ui.shared.MCFragment; +import com.majinnaibu.monstercards.ui.shared.SwipeToDeleteCallback; +import com.majinnaibu.monstercards.utils.Logger; + +/** + * A fragment representing a list of Items. + */ +public class EditDamageResistancesFragment extends MCFragment { + private EditMonsterViewModel mViewModel; + private ViewHolder mHolder; + + private void navigateToEditDamageResistance(String damageResistance) { + NavDirections action = EditDamageResistancesFragmentDirections.actionEditDamageResistancesFragmentToEditDamageResistanceFragment(damageResistance); + View view = getView(); + assert view != null; + Navigation.findNavController(view).navigate(action); + } + + @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); + View root = inflater.inflate(R.layout.fragment_edit_damage_resistances_list, container, false); + mHolder = new ViewHolder(root); + setupRecyclerView(mHolder.list); + setupAddDamageResistanceButton(mHolder.addDamageResistance); + return root; + } + + private void setupRecyclerView(@NonNull RecyclerView recyclerView) { + Context context = requireContext(); + LinearLayoutManager layoutManager = new LinearLayoutManager(context); + recyclerView.setLayoutManager(layoutManager); + + mViewModel.getDamageResistances().observe(getViewLifecycleOwner(), damageResistances -> { + EditDamageResistancesRecyclerViewAdapter adapter = new EditDamageResistancesRecyclerViewAdapter(mViewModel.getDamageResistancesArray(), damageResistance -> { + if (damageResistance != null) { + navigateToEditDamageResistance(damageResistance); + } else { + Logger.logError("Can't navigate to EditDamageResistance with a null damageResistance"); + } + }); + recyclerView.setAdapter(adapter); + }); + + DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(context, layoutManager.getOrientation()); + recyclerView.addItemDecoration(dividerItemDecoration); + + ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new SwipeToDeleteCallback(context, mViewModel::removeDamageResistance)); + itemTouchHelper.attachToRecyclerView(recyclerView); + } + + private void setupAddDamageResistanceButton(@NonNull FloatingActionButton fab) { + fab.setOnClickListener(view -> { + String newDamageResistance = mViewModel.addNewDamageResistance(); + navigateToEditDamageResistance(newDamageResistance); + }); + } + + private static class ViewHolder { + RecyclerView list; + FloatingActionButton addDamageResistance; + + ViewHolder(View root) { + list = root.findViewById(R.id.list); + addDamageResistance = root.findViewById(R.id.add_damage_type); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditDamageResistancesRecyclerViewAdapter.java b/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditDamageResistancesRecyclerViewAdapter.java new file mode 100644 index 0000000..fd05efb --- /dev/null +++ b/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditDamageResistancesRecyclerViewAdapter.java @@ -0,0 +1,69 @@ +package com.majinnaibu.monstercards.ui.editmonster; + +import android.view.LayoutInflater; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.recyclerview.widget.RecyclerView; + +import com.majinnaibu.monstercards.databinding.FragmentEditDamageResistancesListItemBinding; + +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +/** + * x + * {@link RecyclerView.Adapter} that can display a {@link String}. + */ +public class EditDamageResistancesRecyclerViewAdapter extends RecyclerView.Adapter { + private final List mValues; + private final ItemCallback mOnClick; + + public EditDamageResistancesRecyclerViewAdapter(List items, ItemCallback onClick) { + mValues = items; + mOnClick = onClick; + } + + @NotNull + @Override + public ViewHolder onCreateViewHolder(@NotNull ViewGroup parent, int viewType) { + return new ViewHolder(FragmentEditDamageResistancesListItemBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); + } + + @Override + public void onBindViewHolder(final ViewHolder holder, int position) { + holder.mItem = mValues.get(position); + holder.mContentView.setText(mValues.get(position)); + holder.itemView.setOnClickListener(v -> { + if (mOnClick != null) { + mOnClick.onItemCallback(holder.mItem); + } + }); + } + + @Override + public int getItemCount() { + return mValues.size(); + } + + public interface ItemCallback { + void onItemCallback(String sense); + } + + public static class ViewHolder extends RecyclerView.ViewHolder { + public final TextView mContentView; + public String mItem; + + public ViewHolder(FragmentEditDamageResistancesListItemBinding binding) { + super(binding.getRoot()); + mContentView = binding.content; + } + + @NotNull + @Override + public String toString() { + return super.toString() + " '" + mContentView.getText() + "'"; + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditMonsterFragment.java b/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditMonsterFragment.java index fa020e8..83d50b5 100644 --- a/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditMonsterFragment.java +++ b/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditMonsterFragment.java @@ -125,6 +125,11 @@ public class EditMonsterFragment extends MCFragment { Navigation.findNavController(requireView()).navigate(action); }); + mHolder.damageResistances.setOnClickListener(v -> { + NavDirections action = EditMonsterFragmentDirections.actionEditMonsterFragmentToEditDamageResistancesFragment(); + Navigation.findNavController(requireView()).navigate(action); + }); + requireActivity().getOnBackPressedDispatcher().addCallback(getViewLifecycleOwner(), new OnBackPressedCallback(true) { @Override public void handleOnBackPressed() { diff --git a/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditSenseFragment.java b/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditSenseFragment.java index 4d99588..2f0c969 100644 --- a/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditSenseFragment.java +++ b/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditSenseFragment.java @@ -73,5 +73,4 @@ public class EditSenseFragment extends MCFragment { description = root.findViewById(R.id.name); } } - -} \ No newline at end of file +} diff --git a/app/src/main/res/layout/fragment_edit_damage_resistance.xml b/app/src/main/res/layout/fragment_edit_damage_resistance.xml new file mode 100644 index 0000000..a1456f2 --- /dev/null +++ b/app/src/main/res/layout/fragment_edit_damage_resistance.xml @@ -0,0 +1,17 @@ + + + + + diff --git a/app/src/main/res/layout/fragment_edit_damage_resistances_list.xml b/app/src/main/res/layout/fragment_edit_damage_resistances_list.xml new file mode 100644 index 0000000..26b1fbd --- /dev/null +++ b/app/src/main/res/layout/fragment_edit_damage_resistances_list.xml @@ -0,0 +1,33 @@ + + + + + + + diff --git a/app/src/main/res/layout/fragment_edit_damage_resistances_list_item.xml b/app/src/main/res/layout/fragment_edit_damage_resistances_list_item.xml new file mode 100644 index 0000000..6e9049a --- /dev/null +++ b/app/src/main/res/layout/fragment_edit_damage_resistances_list_item.xml @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/navigation/mobile_navigation.xml b/app/src/main/res/navigation/mobile_navigation.xml index 72089fb..3873941 100644 --- a/app/src/main/res/navigation/mobile_navigation.xml +++ b/app/src/main/res/navigation/mobile_navigation.xml @@ -99,6 +99,9 @@ + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 08ad2fe..cd89ea4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -81,4 +81,6 @@ Search WIS Description + Damage Type + Add Damage Type \ No newline at end of file