From dc4d78b7fb0204d83b707d30a5a920921a51dbf1 Mon Sep 17 00:00:00 2001 From: Tom Hicks Date: Mon, 24 May 2021 02:48:00 -0700 Subject: [PATCH] Adds Edit Monster placeholder fragment. --- app/build.gradle | 5 ++ .../placeholder/PlaceholderContent.java | 72 +++++++++++++++++++ .../ui/monster/EditMonsterFragment.java | 72 +++++++++++++++++++ .../EditMonsterRecyclerViewAdapter.java | 61 ++++++++++++++++ .../ui/monster/MonsterDetailFragment.java | 16 ++++- .../ui/monster/MonsterDetailViewModel.java | 9 +++ .../main/res/layout/fragment_edit_monster.xml | 20 ++++++ .../res/layout/fragment_edit_monster_list.xml | 13 ++++ app/src/main/res/menu/monster_detail_menu.xml | 1 + .../main/res/navigation/mobile_navigation.xml | 12 ++++ 10 files changed, 280 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/com/majinnaibu/monstercards/placeholder/PlaceholderContent.java create mode 100644 app/src/main/java/com/majinnaibu/monstercards/ui/monster/EditMonsterFragment.java create mode 100644 app/src/main/java/com/majinnaibu/monstercards/ui/monster/EditMonsterRecyclerViewAdapter.java create mode 100644 app/src/main/res/layout/fragment_edit_monster.xml create mode 100644 app/src/main/res/layout/fragment_edit_monster_list.xml diff --git a/app/build.gradle b/app/build.gradle index 981d10a..0c421fc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -60,6 +60,9 @@ android { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } + buildFeatures { + viewBinding true + } } dependencies { @@ -73,6 +76,8 @@ dependencies { implementation "androidx.navigation:navigation-fragment:$nav_version" implementation "androidx.navigation:navigation-ui:$nav_version" implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' + implementation 'androidx.legacy:legacy-support-v4:1.0.0' + implementation 'androidx.recyclerview:recyclerview:1.1.0' // Testing testImplementation 'junit:junit:4.13.2' diff --git a/app/src/main/java/com/majinnaibu/monstercards/placeholder/PlaceholderContent.java b/app/src/main/java/com/majinnaibu/monstercards/placeholder/PlaceholderContent.java new file mode 100644 index 0000000..8a7120e --- /dev/null +++ b/app/src/main/java/com/majinnaibu/monstercards/placeholder/PlaceholderContent.java @@ -0,0 +1,72 @@ +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/monster/EditMonsterFragment.java b/app/src/main/java/com/majinnaibu/monstercards/ui/monster/EditMonsterFragment.java new file mode 100644 index 0000000..b910f49 --- /dev/null +++ b/app/src/main/java/com/majinnaibu/monstercards/ui/monster/EditMonsterFragment.java @@ -0,0 +1,72 @@ +package com.majinnaibu.monstercards.ui.monster; + +import android.content.Context; +import android.os.Bundle; + +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import com.majinnaibu.monstercards.R; +import com.majinnaibu.monstercards.placeholder.PlaceholderContent; + +/** + * A fragment representing a list of Items. + */ +public class EditMonsterFragment extends Fragment { + + // TODO: Customize parameter argument names + private static final String ARG_COLUMN_COUNT = "column-count"; + // TODO: Customize parameters + private int mColumnCount = 1; + + /** + * Mandatory empty constructor for the fragment manager to instantiate the + * fragment (e.g. upon screen orientation changes). + */ + public EditMonsterFragment() { + } + + // TODO: Customize parameter initialization + @SuppressWarnings("unused") + public static EditMonsterFragment newInstance(int columnCount) { + EditMonsterFragment fragment = new EditMonsterFragment(); + Bundle args = new Bundle(); + args.putInt(ARG_COLUMN_COUNT, columnCount); + fragment.setArguments(args); + return fragment; + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + if (getArguments() != null) { + mColumnCount = getArguments().getInt(ARG_COLUMN_COUNT); + } + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_edit_monster_list, container, false); + + // Set the adapter + if (view instanceof RecyclerView) { + Context context = view.getContext(); + RecyclerView recyclerView = (RecyclerView) view; + if (mColumnCount <= 1) { + recyclerView.setLayoutManager(new LinearLayoutManager(context)); + } else { + recyclerView.setLayoutManager(new GridLayoutManager(context, mColumnCount)); + } + recyclerView.setAdapter(new EditMonsterRecyclerViewAdapter(PlaceholderContent.ITEMS)); + } + return view; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/majinnaibu/monstercards/ui/monster/EditMonsterRecyclerViewAdapter.java b/app/src/main/java/com/majinnaibu/monstercards/ui/monster/EditMonsterRecyclerViewAdapter.java new file mode 100644 index 0000000..d16a49a --- /dev/null +++ b/app/src/main/java/com/majinnaibu/monstercards/ui/monster/EditMonsterRecyclerViewAdapter.java @@ -0,0 +1,61 @@ +package com.majinnaibu.monstercards.ui.monster; + +import androidx.recyclerview.widget.RecyclerView; + +import android.view.LayoutInflater; +import android.view.ViewGroup; +import android.widget.TextView; + +import com.majinnaibu.monstercards.placeholder.PlaceholderContent.PlaceholderItem; +import com.majinnaibu.monstercards.databinding.FragmentEditMonsterBinding; + +import java.util.List; + +/** + * {@link RecyclerView.Adapter} that can display a {@link PlaceholderItem}. + * TODO: Replace the implementation with code for your data type. + */ +public class EditMonsterRecyclerViewAdapter extends RecyclerView.Adapter { + + private final List mValues; + + public EditMonsterRecyclerViewAdapter(List items) { + mValues = items; + } + + @Override + public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + + return new ViewHolder(FragmentEditMonsterBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); + + } + + @Override + public void onBindViewHolder(final ViewHolder holder, int position) { + holder.mItem = mValues.get(position); + holder.mIdView.setText(mValues.get(position).id); + holder.mContentView.setText(mValues.get(position).content); + } + + @Override + public int getItemCount() { + return mValues.size(); + } + + public class ViewHolder extends RecyclerView.ViewHolder { + public final TextView mIdView; + public final TextView mContentView; + public PlaceholderItem mItem; + + public ViewHolder(FragmentEditMonsterBinding binding) { + super(binding.getRoot()); + mIdView = binding.itemNumber; + mContentView = binding.content; + } + + @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/monster/MonsterDetailFragment.java b/app/src/main/java/com/majinnaibu/monstercards/ui/monster/MonsterDetailFragment.java index d9fe053..32145c1 100644 --- a/app/src/main/java/com/majinnaibu/monstercards/ui/monster/MonsterDetailFragment.java +++ b/app/src/main/java/com/majinnaibu/monstercards/ui/monster/MonsterDetailFragment.java @@ -10,14 +10,16 @@ import android.util.TypedValue; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; +import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; import android.widget.TextView; import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import androidx.lifecycle.ViewModelProvider; +import androidx.navigation.NavDirections; +import androidx.navigation.Navigation; import com.majinnaibu.monstercards.R; import com.majinnaibu.monstercards.data.MonsterRepository; @@ -235,4 +237,16 @@ public class MonsterDetailFragment extends MCFragment { inflater.inflate(R.menu.monster_detail_menu, menu); super.onCreateOptionsMenu(menu, inflater); } + + @Override + public boolean onOptionsItemSelected(@NonNull MenuItem item) { + if (item.getItemId() == R.id.menu_action_edit_monster) { + NavDirections action = MonsterDetailFragmentDirections.actionNavigationMonsterToEditMonsterFragment(monsterDetailViewModel.getId().toString()); + View view = getView(); + assert view != null; + Navigation.findNavController(view).navigate(action); + return true; + } + return super.onOptionsItemSelected(item); + } } diff --git a/app/src/main/java/com/majinnaibu/monstercards/ui/monster/MonsterDetailViewModel.java b/app/src/main/java/com/majinnaibu/monstercards/ui/monster/MonsterDetailViewModel.java index 115edc7..19e6d3f 100644 --- a/app/src/main/java/com/majinnaibu/monstercards/ui/monster/MonsterDetailViewModel.java +++ b/app/src/main/java/com/majinnaibu/monstercards/ui/monster/MonsterDetailViewModel.java @@ -8,6 +8,7 @@ import com.majinnaibu.monstercards.models.Monster; import java.util.ArrayList; import java.util.List; +import java.util.UUID; public class MonsterDetailViewModel extends ViewModel { @@ -57,6 +58,8 @@ public class MonsterDetailViewModel extends ViewModel { mStrength.setValue(""); mWisdom = new MutableLiveData<>(); mWisdom.setValue(""); + mMonsterId = new MutableLiveData<>(); + mMonsterId.setValue(UUID.fromString("00000000-0000-0000-0000-000000000000")); } private final MutableLiveData> mAbilities; @@ -191,6 +194,12 @@ public class MonsterDetailViewModel extends ViewModel { return mWisdom; } + private final MutableLiveData mMonsterId; + + public LiveData getId() { + return mMonsterId; + } + private Monster mMonster; public void setMonster(Monster monster) { diff --git a/app/src/main/res/layout/fragment_edit_monster.xml b/app/src/main/res/layout/fragment_edit_monster.xml new file mode 100644 index 0000000..1877568 --- /dev/null +++ b/app/src/main/res/layout/fragment_edit_monster.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_edit_monster_list.xml b/app/src/main/res/layout/fragment_edit_monster_list.xml new file mode 100644 index 0000000..b39ee2d --- /dev/null +++ b/app/src/main/res/layout/fragment_edit_monster_list.xml @@ -0,0 +1,13 @@ + + \ No newline at end of file diff --git a/app/src/main/res/menu/monster_detail_menu.xml b/app/src/main/res/menu/monster_detail_menu.xml index 7ee2c5b..b4ad9ed 100644 --- a/app/src/main/res/menu/monster_detail_menu.xml +++ b/app/src/main/res/menu/monster_detail_menu.xml @@ -3,6 +3,7 @@ xmlns:android="http://schemas.android.com/apk/res/android"> diff --git a/app/src/main/res/navigation/mobile_navigation.xml b/app/src/main/res/navigation/mobile_navigation.xml index cb9307a..889d58a 100644 --- a/app/src/main/res/navigation/mobile_navigation.xml +++ b/app/src/main/res/navigation/mobile_navigation.xml @@ -53,6 +53,18 @@ + + + + \ No newline at end of file