diff --git a/app/build.gradle b/app/build.gradle index db912c8..a55b435 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -50,5 +50,6 @@ dependencies { implementation 'com.ms-square:expandableTextView:0.1.4' // https://github.com/bignerdranch/expandable-recycler-view implementation 'com.bignerdranch.android:expandablerecyclerview:3.0.0-RC1' + implementation 'com.github.Cutta:TagView:1.3' implementation files('libs/jericho-html-3.4.jar') } diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/canteen/MealAdapter.java b/app/src/main/java/de/sebse/fuplanner/fragments/canteen/MealAdapter.java index 59dd523..48a5365 100644 --- a/app/src/main/java/de/sebse/fuplanner/fragments/canteen/MealAdapter.java +++ b/app/src/main/java/de/sebse/fuplanner/fragments/canteen/MealAdapter.java @@ -103,7 +103,6 @@ class MealAdapter extends RecyclerView.Adapter { string.append(" - ").append(s); } viewHolder.mNotes.setText(string.toString()); - viewHolder.mCategory.setText(meal.getCategory()); viewHolder.mIconVegan.setVisibility(meal.getVegan() == Meal.VEGAN_VEGAN ? View.VISIBLE : View.GONE); viewHolder.mIconVegetarian.setVisibility(meal.getVegan() == Meal.VEGAN_VEGETARIAN ? View.VISIBLE : View.GONE); viewHolder.mIconBio.setVisibility((meal.getCertificates() & Meal.CERT_BIO) != 0 ? View.VISIBLE : View.GONE); diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAnnounceAdapter.java b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAnnounceAdapter.java index e81def0..5f69bcf 100644 --- a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAnnounceAdapter.java +++ b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAnnounceAdapter.java @@ -3,28 +3,29 @@ package de.sebse.fuplanner.fragments.moddetails; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.BaseExpandableListAdapter; -import java.util.ArrayList; +import com.cunoraz.tagview.Tag; + +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; import java.util.List; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; import androidx.recyclerview.widget.RecyclerView; 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.Modules; -import de.sebse.fuplanner.tools.Preferences; +import de.sebse.fuplanner.tools.Regex; import de.sebse.fuplanner.tools.UtilsDate; +import de.sebse.fuplanner.tools.logging.Logger; import de.sebse.fuplanner.tools.ui.AnnouncementViewHolder; -import de.sebse.fuplanner.tools.ui.ItemViewHolder; -import de.sebse.fuplanner.tools.ui.MealViewHolder; -import de.sebse.fuplanner.tools.ui.StringViewHolder; class ModDetailAnnounceAdapter extends RecyclerView.Adapter { @Nullable private Modules.Module mModule = null; + private Logger log = new Logger(this); public void setModule(Modules.Module module) { this.mModule = module; @@ -49,16 +50,36 @@ class ModDetailAnnounceAdapter extends RecyclerView.Adapter notes = item.getUrls(); - for (int i1 = 0, notesSize = notes.size(); i1 < notesSize; i1++) { - if (i1 != 0) - string.append("\n"); - String s = notes.get(i1); - string.append(" - ").append(s); + if (!notes.isEmpty()) { + holder.mTagGroup.setVisibility(View.VISIBLE); + for (int i = 0, notesSize = notes.size(); i < notesSize; i++) { + String name; + try { + name = URLDecoder.decode(Regex.regex("/([^/]*)$", notes.get(i)), "UTF-8"); + } catch (NoSuchFieldException e) { + e.printStackTrace(); + name = holder.mView.getResources().getString(R.string.attachment_nr, i); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + name = holder.mView.getResources().getString(R.string.attachment_nr, i); + } + Tag tag = new Tag(name); + tag.id = i; + tag.layoutColor = ContextCompat.getColor(holder.mView.getContext(), R.color.colorFUBlue); + holder.mTagGroup.addTag(tag); + log.d(notes.get(i)); + } + holder.mTagGroup.setOnTagClickListener((tag, i) -> { + String s = notes.get(i); + if (s != null) { + log.d("Download", s); + } + }); + } else { + holder.mTagGroup.setVisibility(View.GONE); } - holder.mNotes.setText(string.toString()); + holder.mNotes.setText(item.getBody()); } @Override 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 492ba02..9216d0d 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 @@ -95,5 +95,4 @@ public class ModDetailAnnounceFragment extends Fragment { }, forceRefresh); } } - } diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAssignmentAdapter.java b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAssignmentAdapter.java index 5e31e32..de66222 100644 --- a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAssignmentAdapter.java +++ b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAssignmentAdapter.java @@ -3,109 +3,29 @@ package de.sebse.fuplanner.fragments.moddetails; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.BaseExpandableListAdapter; +import com.cunoraz.tagview.Tag; + +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.util.List; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.RecyclerView; import de.sebse.fuplanner.R; import de.sebse.fuplanner.services.KVV.types.Assignment; import de.sebse.fuplanner.services.KVV.types.Modules; +import de.sebse.fuplanner.tools.Regex; import de.sebse.fuplanner.tools.UtilsDate; -import de.sebse.fuplanner.tools.ui.ItemViewHolder; -import de.sebse.fuplanner.tools.ui.StringViewHolder; +import de.sebse.fuplanner.tools.logging.Logger; +import de.sebse.fuplanner.tools.ui.AnnouncementViewHolder; -class ModDetailAssignmentAdapter extends BaseExpandableListAdapter { +class ModDetailAssignmentAdapter extends RecyclerView.Adapter { - private Modules.Module mModule = null; - - @Override - public String getChild(int groupPosition, int childPosition) { - StringBuilder sb = new StringBuilder(); - sb.append(this.getGroup(groupPosition).getInstructions()); - sb.append("\n\n"); - for (String s : this.getGroup(groupPosition).getUrls()) - { - sb.append(s); - sb.append("\n\n"); - } - return sb.toString(); - } - - @Override - public long getChildId(int groupPosition, int childPosition) { - return childPosition; - } - - @Override - public View getChildView(int groupPosition, final int childPosition, - boolean isLastChild, View convertView, ViewGroup parent) { - - final String childText = getChild(groupPosition, childPosition); - - if (convertView == null) { - convertView = LayoutInflater.from(parent.getContext()) - .inflate(R.layout.list_all_string, parent, false); - } - - StringViewHolder itemHolder = new StringViewHolder(convertView); - itemHolder.mString.setText(childText); - - return convertView; - } - - @Override - public int getChildrenCount(int groupPosition) { - return 1; - } - - @Override - public Assignment getGroup(int groupPosition) { - if (this.mModule != null && this.mModule.assignments != null) - return this.mModule.assignments.get(groupPosition); - else - return null; - } - - @Override - public int getGroupCount() { - if (this.mModule != null && this.mModule.assignments != null) - return this.mModule.assignments.size(); - else - return 0; - } - - @Override - public long getGroupId(int groupPosition) { - return groupPosition; - } - - @Override - public View getGroupView(int groupPosition, boolean isExpanded, - View convertView, ViewGroup parent) { - Assignment assignment = getGroup(groupPosition); - if (convertView == null) { - convertView = LayoutInflater.from(parent.getContext()) - .inflate(R.layout.list_all_items, parent, false); - } - - ItemViewHolder itemHolder = new ItemViewHolder(convertView); - itemHolder.mTitle.setText(assignment.getTitle()); - if(assignment.isOpen()) - itemHolder.mSubLeft.setText(itemHolder.mView.getResources().getText(R.string.open)); - else - itemHolder.mSubLeft.setText(itemHolder.mView.getResources().getText(R.string.closed)); - itemHolder.mSubRight.setText(UtilsDate.getModifiedDateTime(parent.getContext(), assignment.getDueDate())); - - return convertView; - } - - @Override - public boolean hasStableIds() { - return false; - } - - @Override - public boolean isChildSelectable(int groupPosition, int childPosition) { - return false; - } + @Nullable private Modules.Module mModule = null; + private Logger log = new Logger(this); public void setModule(Modules.Module module) { this.mModule = module; @@ -115,4 +35,70 @@ class ModDetailAssignmentAdapter extends BaseExpandableListAdapter { public void setModule() { this.notifyDataSetChanged(); } + + @NonNull + public AnnouncementViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) { + View view = LayoutInflater.from(viewGroup.getContext()) + .inflate(R.layout.list_announcement_items, viewGroup, false); + return new AnnouncementViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull AnnouncementViewHolder holder, int position) { + holder.reset(); + Assignment item = getAssignment(position); + holder.mTitle.setText(item.getTitle()); + holder.mSubTitle.setText(UtilsDate.getModifiedDateTime(holder.mView.getContext(), item.getDueDate())); + + List notes = item.getUrls(); + if (!notes.isEmpty()) { + holder.mTagGroup.setVisibility(View.VISIBLE); + for (int i = 0, notesSize = notes.size(); i < notesSize; i++) { + String name; + try { + name = URLDecoder.decode(Regex.regex("/([^/]*)$", notes.get(i)), "UTF-8"); + } catch (NoSuchFieldException e) { + e.printStackTrace(); + name = holder.mView.getResources().getString(R.string.attachment_nr, i); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + name = holder.mView.getResources().getString(R.string.attachment_nr, i); + } + Tag tag = new Tag(name); + tag.id = i; + tag.layoutColor = ContextCompat.getColor(holder.mView.getContext(), R.color.colorFUBlue); + holder.mTagGroup.addTag(tag); + log.d(notes.get(i)); + } + holder.mTagGroup.setOnTagClickListener((tag, i) -> { + String s = notes.get(i); + if (s != null) { + log.d("Download", s); + } + }); + } else { + holder.mTagGroup.setVisibility(View.GONE); + } + holder.mNotes.setText(item.getInstructions()); + } + + @Override + public int getItemCount() { + if (mModule != null && mModule.assignments != null) + return mModule.assignments.size(); + else + return 0; + } + + @Override + public int getItemViewType(int position) { + return 0; + } + + private Assignment getAssignment(int index) { + if (mModule != null && mModule.assignments != null) + return mModule.assignments.get(index); + else + return null; + } } \ No newline at end of file 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 cbd9c92..9c7f4c8 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 @@ -9,6 +9,7 @@ import android.widget.ExpandableListView; import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.RecyclerView; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import de.sebse.fuplanner.MainActivity; import de.sebse.fuplanner.R; @@ -61,9 +62,9 @@ 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_expandable_list_view, container, false); + View view = inflater.inflate(R.layout.fragment_recycler_view, container, false); // Set the adapter - ExpandableListView expandableListView = view.findViewById(R.id.list); + RecyclerView expandableListView = view.findViewById(R.id.list); adapter = new ModDetailAssignmentAdapter(); expandableListView.setAdapter(adapter); @@ -94,5 +95,4 @@ public class ModDetailAssignmentFragment extends Fragment { }, forceRefresh); } } - } diff --git a/app/src/main/java/de/sebse/fuplanner/tools/ui/AnnouncementViewHolder.java b/app/src/main/java/de/sebse/fuplanner/tools/ui/AnnouncementViewHolder.java index f6216fa..91694b7 100644 --- a/app/src/main/java/de/sebse/fuplanner/tools/ui/AnnouncementViewHolder.java +++ b/app/src/main/java/de/sebse/fuplanner/tools/ui/AnnouncementViewHolder.java @@ -4,12 +4,15 @@ import android.view.View; import android.widget.ImageView; import android.widget.TextView; +import com.cunoraz.tagview.TagView; + import de.sebse.fuplanner.R; public class AnnouncementViewHolder extends ExpandableCardViewHolder { public final TextView mTitle; public final TextView mSubTitle; public final TextView mNotes; + public final TagView mTagGroup; public AnnouncementViewHolder(View view) { @@ -19,6 +22,8 @@ public class AnnouncementViewHolder extends ExpandableCardViewHolder { mTitle = outerView.findViewById(R.id.title); mSubTitle = outerView.findViewById(R.id.sub_title); mNotes = innerView.findViewById(R.id.notes); + mTagGroup = innerView.findViewById(R.id.tag_group); + } @Override diff --git a/app/src/main/java/de/sebse/fuplanner/tools/ui/MealViewHolder.java b/app/src/main/java/de/sebse/fuplanner/tools/ui/MealViewHolder.java index a786425..11d7655 100644 --- a/app/src/main/java/de/sebse/fuplanner/tools/ui/MealViewHolder.java +++ b/app/src/main/java/de/sebse/fuplanner/tools/ui/MealViewHolder.java @@ -9,7 +9,6 @@ import de.sebse.fuplanner.R; public class MealViewHolder extends ExpandableCardViewHolder { public final TextView mTitle; public final TextView mSubTitle; - public final TextView mCategory; public final TextView mNotes; public final ImageView mIconVegan; @@ -25,7 +24,6 @@ public class MealViewHolder extends ExpandableCardViewHolder { mTitle = outerView.findViewById(R.id.title); mSubTitle = outerView.findViewById(R.id.sub_title); mNotes = innerView.findViewById(R.id.notes); - mCategory = innerView.findViewById(R.id.category); mIconVegan = innerView.findViewById(R.id.icon_vegan); mIconVegetarian = innerView.findViewById(R.id.icon_vegetarian); mIconBio = innerView.findViewById(R.id.icon_organic); diff --git a/app/src/main/res/layout/list_announcement_body.xml b/app/src/main/res/layout/list_announcement_body.xml index 06d0f1d..fae4554 100644 --- a/app/src/main/res/layout/list_announcement_body.xml +++ b/app/src/main/res/layout/list_announcement_body.xml @@ -2,10 +2,22 @@ + android:padding="15dp"> + \ No newline at end of file diff --git a/app/src/main/res/layout/list_canteen_body.xml b/app/src/main/res/layout/list_canteen_body.xml index 72092e9..605898f 100644 --- a/app/src/main/res/layout/list_canteen_body.xml +++ b/app/src/main/res/layout/list_canteen_body.xml @@ -7,12 +7,6 @@ android:layout_width="match_parent" android:layout_height="wrap_content" style="@style/FUTheme.itemValue" - android:id="@+id/category"/> - Vegan Vegetarisch Aus biologischem Anbau + %1$d. Anhang \ 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 b1a2209..279b1b7 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -75,4 +75,5 @@ Vegetarian Organic Food MSC + Attachment #%1$d