Added Event List
This commit is contained in:
@@ -23,7 +23,7 @@ class ModDetailAdapter extends FragmentStatePagerAdapter {
|
|||||||
// Returns total number of pages
|
// Returns total number of pages
|
||||||
@Override
|
@Override
|
||||||
public int getCount() {
|
public int getCount() {
|
||||||
return 3;
|
return 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns the fragment to display for that page
|
// Returns the fragment to display for that page
|
||||||
@@ -36,6 +36,8 @@ class ModDetailAdapter extends FragmentStatePagerAdapter {
|
|||||||
return ModDetailAnnounceFragment.newInstance(mItemPos);
|
return ModDetailAnnounceFragment.newInstance(mItemPos);
|
||||||
case 2:
|
case 2:
|
||||||
return ModDetailAssignmentFragment.newInstance(mItemPos);
|
return ModDetailAssignmentFragment.newInstance(mItemPos);
|
||||||
|
case 3:
|
||||||
|
return ModDetailEventFragment.newInstance(mItemPos);
|
||||||
default:
|
default:
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -51,6 +53,8 @@ class ModDetailAdapter extends FragmentStatePagerAdapter {
|
|||||||
return this.mContext.getResources().getString(R.string.announcements);
|
return this.mContext.getResources().getString(R.string.announcements);
|
||||||
case 2:
|
case 2:
|
||||||
return this.mContext.getResources().getString(R.string.assignments);
|
return this.mContext.getResources().getString(R.string.assignments);
|
||||||
|
case 3:
|
||||||
|
return this.mContext.getResources().getString(R.string.events);
|
||||||
default:
|
default:
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ public class ModDetailAnnounceFragment extends Fragment {
|
|||||||
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
|
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
|
||||||
Bundle savedInstanceState) {
|
Bundle savedInstanceState) {
|
||||||
// Inflate the layout for this fragment
|
// 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
|
// Set the adapter
|
||||||
Context context = view.getContext();
|
Context context = view.getContext();
|
||||||
ExpandableListView expandableListView = view.findViewById(R.id.list);
|
ExpandableListView expandableListView = view.findViewById(R.id.list);
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ public class ModDetailAssignmentFragment extends Fragment {
|
|||||||
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
|
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
|
||||||
Bundle savedInstanceState) {
|
Bundle savedInstanceState) {
|
||||||
// Inflate the layout for this fragment
|
// 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
|
// Set the adapter
|
||||||
Context context = view.getContext();
|
Context context = view.getContext();
|
||||||
ExpandableListView expandableListView = view.findViewById(R.id.list);
|
ExpandableListView expandableListView = view.findViewById(R.id.list);
|
||||||
|
|||||||
@@ -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<RecyclerView.ViewHolder> {
|
||||||
|
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<Pair<Integer, Integer>> 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<Integer, Integer> 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() + "'";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -67,7 +67,7 @@ public class ModDetailOverviewFragment extends Fragment {
|
|||||||
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
|
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
|
||||||
Bundle savedInstanceState) {
|
Bundle savedInstanceState) {
|
||||||
// Inflate the layout for this fragment
|
// 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
|
// Set the adapter
|
||||||
Context context = view.getContext();
|
Context context = view.getContext();
|
||||||
RecyclerView recyclerView = view.findViewById(R.id.list);
|
RecyclerView recyclerView = view.findViewById(R.id.list);
|
||||||
|
|||||||
@@ -9,16 +9,18 @@ public class ItemViewHolder extends CustomViewHolder {
|
|||||||
public final TextView mTitle;
|
public final TextView mTitle;
|
||||||
public final TextView mSubLeft;
|
public final TextView mSubLeft;
|
||||||
public final TextView mSubRight;
|
public final TextView mSubRight;
|
||||||
|
public final TextView mTopRight;
|
||||||
|
|
||||||
public ItemViewHolder(View view) {
|
public ItemViewHolder(View view) {
|
||||||
super(view);
|
super(view);
|
||||||
mTitle = view.findViewById(R.id.title);
|
mTitle = view.findViewById(R.id.title);
|
||||||
mSubLeft = view.findViewById(R.id.sub_left);
|
mSubLeft = view.findViewById(R.id.sub_left);
|
||||||
mSubRight = view.findViewById(R.id.sub_right);
|
mSubRight = view.findViewById(R.id.sub_right);
|
||||||
|
mTopRight = view.findViewById(R.id.top_right);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return super.toString() + " '" + mTitle.getText() + "' '" + mSubLeft.getText() + "' '" + mSubRight.getText() + "'";
|
return super.toString() + " '" + mTitle.getText() + "' '" + mSubLeft.getText() + "' '" + mSubRight.getText() + "' '" + mTopRight.getText() + "'";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,4 +35,17 @@
|
|||||||
android:layout_alignParentEnd="true"
|
android:layout_alignParentEnd="true"
|
||||||
android:layout_alignParentRight="true"
|
android:layout_alignParentRight="true"
|
||||||
tools:text="20.03.18 18:42 Uhr" />
|
tools:text="20.03.18 18:42 Uhr" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/top_right"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_alignBaseline="@id/title"
|
||||||
|
android:layout_alignBottom="@id/title"
|
||||||
|
android:textColor="#343434"
|
||||||
|
android:textSize="12sp"
|
||||||
|
android:layout_alignParentEnd="true"
|
||||||
|
android:layout_alignParentRight="true"
|
||||||
|
tools:text="Raum 105"
|
||||||
|
tools:ignore="RelativeOverlap" />
|
||||||
</RelativeLayout>
|
</RelativeLayout>
|
||||||
@@ -34,4 +34,6 @@
|
|||||||
<string name="hello_blank_fragment" translatable="false">Hello blank fragment</string>
|
<string name="hello_blank_fragment" translatable="false">Hello blank fragment</string>
|
||||||
<string name="enter_offline_mode">Enter Offline Mode (%1$s)</string>
|
<string name="enter_offline_mode">Enter Offline Mode (%1$s)</string>
|
||||||
<string name="no_items_available">No items available!</string>
|
<string name="no_items_available">No items available!</string>
|
||||||
|
<string name="past_events">Past Events</string>
|
||||||
|
<string name="events">Events</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
Reference in New Issue
Block a user