From 689855b8a043c26e6adcf1603b38e163e3ce335b Mon Sep 17 00:00:00 2001 From: Caesar2011 Date: Fri, 13 Jul 2018 23:44:06 +0200 Subject: [PATCH] Added Event List --- .../moddetails/ModDetailAdapter.java | 6 +- .../moddetails/ModDetailAnnounceFragment.java | 2 +- .../ModDetailAssignmentFragment.java | 2 +- .../moddetails/ModDetailEventAdapter.java | 178 ++++++++++++++++++ .../moddetails/ModDetailEventFragment.java | 107 +++++++++++ .../moddetails/ModDetailOverviewFragment.java | 2 +- .../fuplanner/tools/ui/ItemViewHolder.java | 4 +- ....xml => fragment_expandable_list_view.xml} | 0 ...verview.xml => fragment_recycler_view.xml} | 0 app/src/main/res/layout/list_all_items.xml | 13 ++ app/src/main/res/values/strings.xml | 2 + 11 files changed, 311 insertions(+), 5 deletions(-) create mode 100644 app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailEventAdapter.java create mode 100644 app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailEventFragment.java rename app/src/main/res/layout/{fragment_mod_detail_announce.xml => fragment_expandable_list_view.xml} (100%) rename app/src/main/res/layout/{fragment_mod_detail_overview.xml => fragment_recycler_view.xml} (100%) diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAdapter.java b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAdapter.java index 7922e64..fe5355c 100644 --- a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAdapter.java +++ b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAdapter.java @@ -23,7 +23,7 @@ class ModDetailAdapter extends FragmentStatePagerAdapter { // Returns total number of pages @Override public int getCount() { - return 3; + return 4; } // Returns the fragment to display for that page @@ -36,6 +36,8 @@ class ModDetailAdapter extends FragmentStatePagerAdapter { return ModDetailAnnounceFragment.newInstance(mItemPos); case 2: return ModDetailAssignmentFragment.newInstance(mItemPos); + case 3: + return ModDetailEventFragment.newInstance(mItemPos); default: return null; } @@ -51,6 +53,8 @@ class ModDetailAdapter extends FragmentStatePagerAdapter { return this.mContext.getResources().getString(R.string.announcements); case 2: return this.mContext.getResources().getString(R.string.assignments); + case 3: + return this.mContext.getResources().getString(R.string.events); default: return ""; } diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAnnounceFragment.java b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAnnounceFragment.java index 8b9a3b2..a41a0ad 100644 --- a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAnnounceFragment.java +++ b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAnnounceFragment.java @@ -66,7 +66,7 @@ public class ModDetailAnnounceFragment extends Fragment { public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment - View view = inflater.inflate(R.layout.fragment_mod_detail_announce, container, false); + View view = inflater.inflate(R.layout.fragment_expandable_list_view, container, false); // Set the adapter Context context = view.getContext(); ExpandableListView expandableListView = view.findViewById(R.id.list); diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAssignmentFragment.java b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAssignmentFragment.java index e876ea6..48005cc 100644 --- a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAssignmentFragment.java +++ b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAssignmentFragment.java @@ -66,7 +66,7 @@ public class ModDetailAssignmentFragment extends Fragment { public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment - View view = inflater.inflate(R.layout.fragment_mod_detail_announce, container, false); + View view = inflater.inflate(R.layout.fragment_expandable_list_view, container, false); // Set the adapter Context context = view.getContext(); ExpandableListView expandableListView = view.findViewById(R.id.list); diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailEventAdapter.java b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailEventAdapter.java new file mode 100644 index 0000000..17aba5c --- /dev/null +++ b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailEventAdapter.java @@ -0,0 +1,178 @@ +package de.sebse.fuplanner.fragments.moddetails; + +import android.support.annotation.NonNull; +import android.support.v7.widget.RecyclerView; +import android.util.Pair; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import com.ms.square.android.expandabletextview.ExpandableTextView; + +import java.util.ArrayList; + +import de.sebse.fuplanner.R; +import de.sebse.fuplanner.services.KVV.types.Announcement; +import de.sebse.fuplanner.services.KVV.types.Assignment; +import de.sebse.fuplanner.services.KVV.types.Event; +import de.sebse.fuplanner.services.KVV.types.Modules; +import de.sebse.fuplanner.tools.Conversion; +import de.sebse.fuplanner.tools.logging.Logger; +import de.sebse.fuplanner.tools.ui.CustomViewHolder; +import de.sebse.fuplanner.tools.ui.ItemViewHolder; + +public class ModDetailEventAdapter extends RecyclerView.Adapter { + private static final int TYPE_HEADER = 0; + private static final int TYPE_ITEM = 1; + + private static final int SECTION_UPCOMING = 0; + private static final int SECTION_PAST = 1; + + private Modules.Module mValue; + private final ArrayList> mPositionalData; + private Logger log = new Logger(this); + //private final ModulesFragment.OnModulesFragmentInteractionListener mListener; + + public ModDetailEventAdapter(/*ModulesFragment.OnModulesFragmentInteractionListener listener*/) { + mValue = null; + mPositionalData = new ArrayList<>(); + //mListener = listener; + } + + public void setModule(Modules.Module module) { + mValue = module; + this.setModule(); + } + + public void setModule() { + mPositionalData.clear(); + addPositionalListData(getUpcomingEventsCount(), SECTION_UPCOMING); + mPositionalData.add(new Pair<>(TYPE_HEADER, SECTION_PAST)); + addPositionalListData(getPastEventsCount(), SECTION_PAST); + + this.notifyDataSetChanged(); + } + + private void addPositionalListData(int count, int category) { + for (int i = 0; i < count; i++) { + mPositionalData.add(new Pair<>(TYPE_ITEM, category+1024*i)); + } + } + + @NonNull + @Override + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view; + switch (viewType) { + case TYPE_HEADER: + view = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.list_all_caption, parent, false); + return new HeaderViewHolder(view); + case TYPE_ITEM: + view = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.list_all_items, parent, false); + return new ItemViewHolder(view); + default: + //noinspection ConstantConditions + return null; + } + } + + @Override + public int getItemViewType(int position) { + // Note that unlike in ListView adapters, types don't have to be contiguous + if (position < mPositionalData.size()) + return mPositionalData.get(position).first; + else return -1; + } + + @Override + public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, int position) { + if (mValue == null || position > mPositionalData.size()) + return; + Pair data = mPositionalData.get(position); + switch (data.first) { + case TYPE_HEADER: + HeaderViewHolder h = (HeaderViewHolder) holder; + switch (data.second) { + case SECTION_PAST: + h.mCaption.setText(R.string.past_events); + break; + case SECTION_UPCOMING: + h.mCaption.setText(R.string.upcoming_events); + break; + } + break; + case TYPE_ITEM: + int section = data.second % 1024; + int index = data.second / 1024; + ItemViewHolder i = (ItemViewHolder) holder; + Event event = null; + switch (section) { + case SECTION_UPCOMING: + event = mValue.events.getUpcoming(index); + break; + case SECTION_PAST: + event = mValue.events.getPast(index); + break; + } + //noinspection ConstantConditions + i.mTitle.setText(event.getTitle()); + i.mSubLeft.setText(event.getType()); + String start, end; + if (Conversion.dateEquals(event.getStartDate(), System.currentTimeMillis())) + start = Conversion.getModifiedTime(i.mView.getContext(), event.getStartDate()); + else + start = Conversion.getModifiedDateTime(i.mView.getContext(), event.getStartDate()); + if (Conversion.dateEquals(event.getStartDate(), event.getEndDate())) + end = Conversion.getModifiedTime(i.mView.getContext(), event.getEndDate()); + else + end = Conversion.getModifiedDateTime(i.mView.getContext(), event.getEndDate()); + i.mSubRight.setText(i.mView.getResources().getString(R.string.date_scale, + start, end + )); + break; + } + } + + @Override + public int getItemCount() { + return mPositionalData.size(); + } + + private int getUpcomingEventsCount() { + if (mValue.events != null) + return mValue.events.sizeUpcoming(); + return 0; + } + + private int getPastEventsCount() { + if (mValue.events != null) + return mValue.events.sizePast(); + return 0; + } + + + + + + + + + public class HeaderViewHolder extends CustomViewHolder { + final TextView mCaption; + + HeaderViewHolder(View view) { + super(view); + mCaption = view.findViewById(R.id.caption); + } + + @Override + public String toString() { + return super.toString() + " '" + mCaption.getText() + "'"; + } + } + + +} diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailEventFragment.java b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailEventFragment.java new file mode 100644 index 0000000..258ff4c --- /dev/null +++ b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailEventFragment.java @@ -0,0 +1,107 @@ +package de.sebse.fuplanner.fragments.moddetails; + + +import android.content.Context; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.v4.app.Fragment; +import android.support.v4.widget.SwipeRefreshLayout; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import de.sebse.fuplanner.MainActivity; +import de.sebse.fuplanner.R; +import de.sebse.fuplanner.services.KVV.KVV; +import de.sebse.fuplanner.services.KVV.types.Modules; +import de.sebse.fuplanner.tools.logging.Logger; + +/** + * A simple {@link Fragment} subclass. + * Use the {@link ModDetailEventFragment#newInstance} factory method to + * create an instance of this fragment. + */ +public class ModDetailEventFragment extends Fragment { + // TODO: Rename parameter arguments, choose names that match + // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER + private static final String ARG_POSITION = "itemPosition"; + + // TODO: Rename and change types of parameters + private int mItemPos; + private Logger log = new Logger(this); + private ModDetailEventAdapter adapter; + private SwipeRefreshLayout swipeLayout; + + + public ModDetailEventFragment() { + // Required empty public constructor + } + + /** + * Use this factory method to create a new instance of + * this fragment using the provided parameters. + * + * @param itemPosition Item position in module list. + * @return A new instance of fragment ModDetailAnnounceFragment. + */ + // TODO: Rename and change types and number of parameters + public static ModDetailEventFragment newInstance(int itemPosition) { + ModDetailEventFragment fragment = new ModDetailEventFragment(); + Bundle args = new Bundle(); + args.putInt(ARG_POSITION, itemPosition); + fragment.setArguments(args); + return fragment; + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + if (getArguments() != null) { + mItemPos = getArguments().getInt(ARG_POSITION); + } + } + + @Override + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + // Inflate the layout for this fragment + View view = inflater.inflate(R.layout.fragment_recycler_view, container, false); + // Set the adapter + Context context = view.getContext(); + RecyclerView recyclerView = view.findViewById(R.id.list); + recyclerView.setLayoutManager(new LinearLayoutManager(context)); + adapter = new ModDetailEventAdapter(); + recyclerView.setAdapter(adapter); + + // Getting SwipeContainerLayout + swipeLayout = view.findViewById(R.id.swipe_container); + // Adding Listener + swipeLayout.setOnRefreshListener(() -> refresh(true)); + refresh(false); + + return view; + } + + private void refresh(boolean forceRefresh) { + if (getActivity() != null) { + KVV kvv = ((MainActivity) getActivity()).getKVV(); + kvv.getModuleList((Modules success) -> { + Modules.Module module = success.get(mItemPos); + adapter.setModule(module); + kvv.getModuleEvents(module, success1 -> { + adapter.setModule(); + swipeLayout.setRefreshing(false); + }, error -> { + swipeLayout.setRefreshing(false); + log.e(error); + }); + }, error -> { + swipeLayout.setRefreshing(false); + log.e(error); + }, forceRefresh); + } + } + +} diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailOverviewFragment.java b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailOverviewFragment.java index a03c5b4..f0da306 100644 --- a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailOverviewFragment.java +++ b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailOverviewFragment.java @@ -67,7 +67,7 @@ public class ModDetailOverviewFragment extends Fragment { public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment - View view = inflater.inflate(R.layout.fragment_mod_detail_overview, container, false); + View view = inflater.inflate(R.layout.fragment_recycler_view, container, false); // Set the adapter Context context = view.getContext(); RecyclerView recyclerView = view.findViewById(R.id.list); diff --git a/app/src/main/java/de/sebse/fuplanner/tools/ui/ItemViewHolder.java b/app/src/main/java/de/sebse/fuplanner/tools/ui/ItemViewHolder.java index daf4a01..871c19c 100644 --- a/app/src/main/java/de/sebse/fuplanner/tools/ui/ItemViewHolder.java +++ b/app/src/main/java/de/sebse/fuplanner/tools/ui/ItemViewHolder.java @@ -9,16 +9,18 @@ public class ItemViewHolder extends CustomViewHolder { public final TextView mTitle; public final TextView mSubLeft; public final TextView mSubRight; + public final TextView mTopRight; public ItemViewHolder(View view) { super(view); mTitle = view.findViewById(R.id.title); mSubLeft = view.findViewById(R.id.sub_left); mSubRight = view.findViewById(R.id.sub_right); + mTopRight = view.findViewById(R.id.top_right); } @Override public String toString() { - return super.toString() + " '" + mTitle.getText() + "' '" + mSubLeft.getText() + "' '" + mSubRight.getText() + "'"; + return super.toString() + " '" + mTitle.getText() + "' '" + mSubLeft.getText() + "' '" + mSubRight.getText() + "' '" + mTopRight.getText() + "'"; } } diff --git a/app/src/main/res/layout/fragment_mod_detail_announce.xml b/app/src/main/res/layout/fragment_expandable_list_view.xml similarity index 100% rename from app/src/main/res/layout/fragment_mod_detail_announce.xml rename to app/src/main/res/layout/fragment_expandable_list_view.xml diff --git a/app/src/main/res/layout/fragment_mod_detail_overview.xml b/app/src/main/res/layout/fragment_recycler_view.xml similarity index 100% rename from app/src/main/res/layout/fragment_mod_detail_overview.xml rename to app/src/main/res/layout/fragment_recycler_view.xml diff --git a/app/src/main/res/layout/list_all_items.xml b/app/src/main/res/layout/list_all_items.xml index 63a2719..ecfe57c 100644 --- a/app/src/main/res/layout/list_all_items.xml +++ b/app/src/main/res/layout/list_all_items.xml @@ -35,4 +35,17 @@ android:layout_alignParentEnd="true" android:layout_alignParentRight="true" tools:text="20.03.18 18:42 Uhr" /> + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 00b78b4..7a8ffe7 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -34,4 +34,6 @@ Hello blank fragment Enter Offline Mode (%1$s) No items available! + Past Events + Events