From 8e29dc2440eae98d00c9fbe63405da485b15e410 Mon Sep 17 00:00:00 2001 From: Tom Hicks Date: Sun, 20 Jun 2021 12:40:56 -0700 Subject: [PATCH] Adds Edit Senses fragment. --- .../ui/editmonster/EditMonsterFragment.java | 5 + .../ui/editmonster/EditSensesFragment.java | 96 +++++++++++++++++++ .../EditSensesRecyclerViewAdapter.java | 69 +++++++++++++ .../res/layout/fragment_edit_senses_list.xml | 33 +++++++ .../layout/fragment_edit_senses_list_item.xml | 13 +++ .../main/res/navigation/mobile_navigation.xml | 8 ++ app/src/main/res/values/strings.xml | 1 + 7 files changed, 225 insertions(+) create mode 100644 app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditSensesFragment.java create mode 100644 app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditSensesRecyclerViewAdapter.java create mode 100644 app/src/main/res/layout/fragment_edit_senses_list.xml create mode 100644 app/src/main/res/layout/fragment_edit_senses_list_item.xml 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 e461b0b..7d43eab 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 @@ -116,6 +116,11 @@ public class EditMonsterFragment extends MCFragment { Navigation.findNavController(requireView()).navigate(action); }); + mHolder.senses.setOnClickListener(v -> { + NavDirections action = EditMonsterFragmentDirections.actionEditMonsterFragmentToEditSensesFragment(); + 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/EditSensesFragment.java b/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditSensesFragment.java new file mode 100644 index 0000000..5a92c6f --- /dev/null +++ b/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditSensesFragment.java @@ -0,0 +1,96 @@ +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.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.MCFragment; +import com.majinnaibu.monstercards.ui.shared.SwipeToDeleteCallback; +import com.majinnaibu.monstercards.utils.Logger; + +/** + * A fragment representing a list of Items. + */ +@SuppressWarnings("FieldCanBeLocal") +public class EditSensesFragment extends MCFragment { + private EditMonsterViewModel mViewModel; + private ViewHolder mHolder; + + private void navigateToEditSense(String sense) { + Logger.logUnimplementedFeature("Navigate to edit sense fragment."); +// NavDirections action = EditSensesFragmentDirections.actionEditSensesFragmentToEditSenseFragment(sense); +// 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_senses_list, container, false); + + mHolder = new ViewHolder(root); + setupRecyclerView(mHolder.list); + setupAddSenseButton(mHolder.addSense); + + return root; + } + + private void setupRecyclerView(@NonNull RecyclerView recyclerView) { + Context context = requireContext(); + LinearLayoutManager layoutManager = new LinearLayoutManager(context); + recyclerView.setLayoutManager(layoutManager); + + mViewModel.getSenses().observe(getViewLifecycleOwner(), senses -> { + EditSensesRecyclerViewAdapter adapter = new EditSensesRecyclerViewAdapter(mViewModel.getSensesArray(), sense -> { + if (sense != null) { + navigateToEditSense(sense); + } else { + Logger.logError("Can't navigate to EditSense with a null sense"); + } + }); + recyclerView.setAdapter(adapter); + }); + + DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(context, layoutManager.getOrientation()); + recyclerView.addItemDecoration(dividerItemDecoration); + + ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new SwipeToDeleteCallback(context, mViewModel::removeSense)); + itemTouchHelper.attachToRecyclerView(recyclerView); + } + + private void setupAddSenseButton(@NonNull FloatingActionButton fab) { + fab.setOnClickListener(view -> { + String newSense = mViewModel.addNewSense(); + navigateToEditSense(newSense); + }); + } + + private static class ViewHolder { + RecyclerView list; + FloatingActionButton addSense; + + ViewHolder(View root) { + this.list = root.findViewById(R.id.list); + this.addSense = root.findViewById(R.id.add_sense); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditSensesRecyclerViewAdapter.java b/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditSensesRecyclerViewAdapter.java new file mode 100644 index 0000000..1710bcf --- /dev/null +++ b/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditSensesRecyclerViewAdapter.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.FragmentEditSensesListItemBinding; + +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +/** + * x + * {@link RecyclerView.Adapter} that can display a {@link String}. + */ +public class EditSensesRecyclerViewAdapter extends RecyclerView.Adapter { + private final List mValues; + private final ItemCallback mOnClick; + + public EditSensesRecyclerViewAdapter(List items, ItemCallback onClick) { + mValues = items; + mOnClick = onClick; + } + + @NotNull + @Override + public ViewHolder onCreateViewHolder(@NotNull ViewGroup parent, int viewType) { + return new ViewHolder(FragmentEditSensesListItemBinding.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(FragmentEditSensesListItemBinding 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/res/layout/fragment_edit_senses_list.xml b/app/src/main/res/layout/fragment_edit_senses_list.xml new file mode 100644 index 0000000..3c1ca94 --- /dev/null +++ b/app/src/main/res/layout/fragment_edit_senses_list.xml @@ -0,0 +1,33 @@ + + + + + + + diff --git a/app/src/main/res/layout/fragment_edit_senses_list_item.xml b/app/src/main/res/layout/fragment_edit_senses_list_item.xml new file mode 100644 index 0000000..6e9049a --- /dev/null +++ b/app/src/main/res/layout/fragment_edit_senses_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 4ddc3c9..da09d83 100644 --- a/app/src/main/res/navigation/mobile_navigation.xml +++ b/app/src/main/res/navigation/mobile_navigation.xml @@ -93,6 +93,9 @@ + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c1c0db3..61f87f3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,5 +1,6 @@ Add monster + Add Sense Add Skill Edit Actions