Added new layout to Announcement and assignment with attachment tags
This commit is contained in:
@@ -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')
|
||||
}
|
||||
|
||||
@@ -103,7 +103,6 @@ class MealAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
|
||||
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);
|
||||
|
||||
@@ -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<AnnouncementViewHolder> {
|
||||
|
||||
@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<AnnouncementViewHold
|
||||
holder.mTitle.setText(item.getTitle());
|
||||
holder.mSubTitle.setText(UtilsDate.getModifiedDateTime(holder.mView.getContext(), item.getCreatedOn()));
|
||||
|
||||
StringBuilder string = new StringBuilder();
|
||||
string.append(item.getBody());
|
||||
List<String> 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
|
||||
|
||||
@@ -95,5 +95,4 @@ public class ModDetailAnnounceFragment extends Fragment {
|
||||
}, forceRefresh);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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<AnnouncementViewHolder> {
|
||||
|
||||
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<String> 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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -2,10 +2,22 @@
|
||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:padding="20dp">
|
||||
android:padding="15dp">
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
style="@style/FUTheme.itemValue"
|
||||
android:id="@+id/notes"/>
|
||||
<com.cunoraz.tagview.TagView
|
||||
xmlns:tagview="http://schemas.android.com/apk/res-auto"
|
||||
android:layout_below="@id/notes"
|
||||
android:id="@+id/tag_group"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tagview:lineMargin="5dp"
|
||||
tagview:tagMargin="5dp"
|
||||
tagview:textPaddingLeft="8dp"
|
||||
tagview:textPaddingTop="5dp"
|
||||
tagview:textPaddingRight="8dp"
|
||||
tagview:textPaddingBottom="5dp" />
|
||||
</RelativeLayout>
|
||||
@@ -7,12 +7,6 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
style="@style/FUTheme.itemValue"
|
||||
android:id="@+id/category"/>
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@id/category"
|
||||
style="@style/FUTheme.itemValue"
|
||||
android:id="@+id/notes"/>
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
|
||||
@@ -67,4 +67,5 @@
|
||||
<string name="vegan">Vegan</string>
|
||||
<string name="vegetarian">Vegetarisch</string>
|
||||
<string name="bio">Aus biologischem Anbau</string>
|
||||
<string name="attachment_nr">%1$d. Anhang</string>
|
||||
</resources>
|
||||
@@ -75,4 +75,5 @@
|
||||
<string name="vegetarian">Vegetarian</string>
|
||||
<string name="bio">Organic Food</string>
|
||||
<string name="msc" translatable="false">MSC</string>
|
||||
<string name="attachment_nr">Attachment #%1$d</string>
|
||||
</resources>
|
||||
|
||||
Reference in New Issue
Block a user