Commit 56efc43e authored by Sajal Narang's avatar Sajal Narang Committed by GitHub

Merge pull request #235 from wncc/generifyadapters

Generify Adapters
parents 76c88c8b 026e0233
......@@ -27,6 +27,7 @@ public final class Utils {
public static UpdatableList<Event> eventCache = new UpdatableList<>();
private static String sessionId;
private static RetrofitInterface retrofitInterface;
public static Gson gson;
public static boolean darkTheme = false;
public static final void loadImageWithPlaceholder(final ImageView imageView, final String url) {
......@@ -118,6 +119,10 @@ public final class Utils {
}
}
public static void makeGson() {
Utils.gson = new Gson();
}
public static void changeTheme(FragmentActivity context) {
if (darkTheme) {
context.setTheme(R.style.AppTheme);
......
......@@ -125,6 +125,8 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
ServiceGenerator serviceGenerator = new ServiceGenerator(getApplicationContext());
Utils.setRetrofitInterface(serviceGenerator.getRetrofitInterface());
Utils.makeGson();
/* Make notification channel on oreo */
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
createNotificationChannel();
......
package app.insti.adapter;
import android.content.Context;
import android.support.v4.app.Fragment;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.squareup.picasso.Picasso;
import android.support.v4.app.FragmentActivity;
import java.util.List;
import app.insti.R;
import app.insti.Utils;
import app.insti.api.model.Body;
public class BodyAdapter extends RecyclerView.Adapter<BodyAdapter.ViewHolder> {
private List<Body> bodyList;
private Context context;
private Fragment fragment;
public class BodyAdapter extends CardAdapter<Body> {
public BodyAdapter(List<Body> bodyList, Fragment mFragment) {
this.bodyList = bodyList;
fragment = mFragment;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
context = parent.getContext();
View v = LayoutInflater.from(context)
.inflate(R.layout.feed_card, parent, false);
final ViewHolder postViewHolder = new ViewHolder(v);
v.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Utils.openBodyFragment(bodyList.get(postViewHolder.getAdapterPosition()), fragment.getActivity());
super(bodyList, mFragment);
}
});
return postViewHolder;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
Body body = bodyList.get(position);
holder.name.setText(body.getBodyName());
holder.description.setText(body.getBodyShortDescription());
Picasso.get().load(
Utils.resizeImageUrl(body.getBodyImageURL())
).into(holder.image);
}
@Override
public int getItemCount() {
return bodyList.size();
}
public void setBodyList(List<Body> bodyList) {
this.bodyList = bodyList;
}
public class ViewHolder extends RecyclerView.ViewHolder {
public TextView name;
public TextView description;
public ImageView image;
public ViewHolder(View itemView) {
super(itemView);
name = (TextView) itemView.findViewById(R.id.object_title);
description = (TextView) itemView.findViewById(R.id.object_subtitle);
image = (ImageView) itemView.findViewById(R.id.object_picture);
}
public void onClick(Body body, FragmentActivity fragmentActivity) {
Utils.openBodyFragment(body, fragmentActivity);
}
}
package app.insti.adapter;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.squareup.picasso.Picasso;
import com.squareup.picasso.RequestCreator;
import java.util.List;
import app.insti.R;
import app.insti.Utils;
import app.insti.interfaces.CardInterface;
public abstract class CardAdapter<T extends CardInterface> extends RecyclerView.Adapter<CardAdapter<T>.ViewHolder> {
private List<T> tList;
private Fragment mFragment;
public abstract void onClick(T t, FragmentActivity fragmentActivity);
public String getBigImageUrl(T t) {
return null;
}
public int getAvatarPlaceholder(T t) {
return 0;
}
public CardAdapter(List<T> tList, Fragment fragment) {
this.tList = tList;
mFragment = fragment;
}
@Override
@NonNull
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, final int i) {
Context context = viewGroup.getContext();
LayoutInflater inflater = LayoutInflater.from(context);
View postView = inflater.inflate(R.layout.feed_card, viewGroup, false);
final ViewHolder postViewHolder = new ViewHolder(postView);
postView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
CardAdapter.this.onClick(tList.get(postViewHolder.getAdapterPosition()), mFragment.getActivity());
}
});
return postViewHolder;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {
T t = tList.get(i);
viewHolder.title.setText(t.getTitle());
viewHolder.subtitle.setText(t.getSubtitle());
if (getBigImageUrl(t) != null) {
// Show big image, hide avatar
viewHolder.bigPicture.setVisibility(View.VISIBLE);
viewHolder.avatar.setVisibility(View.GONE);
// Load big image with low resolution as avatar
Utils.loadImageWithPlaceholder(viewHolder.bigPicture, getBigImageUrl(t));
} else {
// Build basic request
RequestCreator requestCreator;
if (t.getAvatarUrl() != null)
requestCreator = Picasso.get().load(Utils.resizeImageUrl(t.getAvatarUrl()));
else if (getAvatarPlaceholder(t) != 0) {
requestCreator = Picasso.get().load(getAvatarPlaceholder(t));
} else {
return;
}
// Check if we have a placeholder
if (getAvatarPlaceholder(t) != 0) {
requestCreator.placeholder(getAvatarPlaceholder(t));
}
// Load the image
requestCreator.into(viewHolder.avatar);
}
}
public class ViewHolder extends RecyclerView.ViewHolder {
private ImageView avatar;
private TextView title;
private TextView subtitle;
private ImageView bigPicture;
public ViewHolder(View itemView) {
super(itemView);
avatar = itemView.findViewById(R.id.object_picture);
title = itemView.findViewById(R.id.object_title);
subtitle = itemView.findViewById(R.id.object_subtitle);
bigPicture = itemView.findViewById(R.id.big_object_picture);
}
}
@Override
public int getItemViewType(int position) {
if (position == 0) return 1;
else return 2;
}
@Override
public int getItemCount() {
return tList.size();
}
public void setList(List<T> tList) {
this.tList = tList;
}
}
package app.insti.adapter;
import android.content.Context;
import android.support.v4.app.Fragment;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.support.v4.app.FragmentActivity;
import com.squareup.picasso.Picasso;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import app.insti.R;
import app.insti.Utils;
import app.insti.api.model.Event;
import app.insti.api.model.Venue;
public class FeedAdapter extends RecyclerView.Adapter<FeedAdapter.ViewHolder> {
private List<Event> events;
private Context context;
private Fragment mFragment;
public FeedAdapter(List<Event> events, Fragment fragment) {
this.events = events;
mFragment = fragment;
}
public void getSubtitle(ViewHolder viewHolder, Event currentEvent)
{
String subtitle = "";
Date startTime = currentEvent.getEventStartTime();
Date endTime = currentEvent.getEventEndTime();
Date timeNow = Calendar.getInstance().getTime();
boolean eventStarted = timeNow.compareTo(startTime) > 0;
boolean eventEnded = timeNow.compareTo(endTime) > 0;
if (eventEnded)
subtitle += "Event ended | ";
else if(eventStarted)
{
long difference = endTime.getTime() - timeNow.getTime();
long minutes = difference / (60 * 1000 ) % 60;
long hours = difference / (60 * 60 * 1000) % 24;
long days = difference / (24 * 60 * 60 * 1000);
String timeDiff = "";
if (days > 0)
timeDiff += Long.toString(days) + "D ";
if (hours > 0)
timeDiff += Long.toString(hours) + "H ";
public class FeedAdapter extends CardAdapter<Event> {
timeDiff += Long.toString(minutes) + "M";
subtitle += "Ends in " + timeDiff + " | " ;
}
Timestamp timestamp = currentEvent.getEventStartTime();
if (timestamp != null) {
Date Date = new Date(timestamp.getTime());
SimpleDateFormat simpleDateFormatDate = new SimpleDateFormat("dd MMM");
SimpleDateFormat simpleDateFormatTime = new SimpleDateFormat("HH:mm");
subtitle += simpleDateFormatDate.format(Date) + " | " + simpleDateFormatTime.format(Date);
}
StringBuilder eventVenueName = new StringBuilder();
for (Venue venue : currentEvent.getEventVenues()) {
eventVenueName.append(", ").append(venue.getVenueShortName());
}
if (!eventVenueName.toString().equals(""))
subtitle += " | " + eventVenueName.toString().substring(2);
viewHolder.eventSubtitle.setText(subtitle);
return ;
public FeedAdapter(List<Event> eventList, Fragment fragment) {
super(eventList, fragment);
}
@Override
public int getItemViewType(int position) {
if (position == 0) return 1;
else return 2;
public void onClick(Event event, FragmentActivity fragmentActivity) {
Utils.openEventFragment(event, fragmentActivity);
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, final int i) {
context = viewGroup.getContext();
LayoutInflater inflater = LayoutInflater.from(context);
View postView = inflater.inflate(R.layout.feed_card, viewGroup, false);
final ViewHolder postViewHolder = new ViewHolder(postView);
postView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Utils.openEventFragment(events.get(postViewHolder.getAdapterPosition()), mFragment.getActivity());
}
});
return postViewHolder;
}
@Override
public void onBindViewHolder(ViewHolder viewHolder, int i) {
Event currentEvent = events.get(i);
viewHolder.eventTitle.setText(currentEvent.getEventName());
getSubtitle(viewHolder, currentEvent);
if (currentEvent.isEventBigImage()) {
viewHolder.eventBigPicture.setVisibility(View.VISIBLE);
viewHolder.eventPicture.setVisibility(View.GONE);
Utils.loadImageWithPlaceholder(viewHolder.eventBigPicture, currentEvent.getEventImageURL());
} else {
Picasso.get().load(
Utils.resizeImageUrl(currentEvent.getEventImageURL())
).into(viewHolder.eventPicture);
public String getBigImageUrl(Event event) {
if (event.isEventBigImage()) {
return event.getEventImageURL();
}
return null;
}
@Override
public int getItemCount() {
return events.size();
}
public void setEvents(List<Event> events) {
this.events = events;
}
public class ViewHolder extends RecyclerView.ViewHolder {
private ImageView eventPicture;
private TextView eventTitle;
private TextView eventSubtitle;
private ImageView eventBigPicture;
public ViewHolder(View itemView) {
super(itemView);
eventPicture = (ImageView) itemView.findViewById(R.id.object_picture);
eventTitle = (TextView) itemView.findViewById(R.id.object_title);
eventSubtitle = (TextView) itemView.findViewById(R.id.object_subtitle);
eventBigPicture = (ImageView) itemView.findViewById(R.id.big_object_picture);
}
public int getAvatarPlaceholder(Event event) {
return R.drawable.lotus_placeholder;
}
}
package app.insti.adapter;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import java.util.List;
import app.insti.R;
import app.insti.Utils;
import app.insti.api.model.Body;
import app.insti.api.model.Event;
import app.insti.api.model.User;
import app.insti.interfaces.CardInterface;
public class GenericAdapter extends CardAdapter<CardInterface> {
public GenericAdapter(List<CardInterface> cardInterfaceList, Fragment fragment){
super(cardInterfaceList, fragment);
}
@Override
public void onClick(CardInterface cardInterface, FragmentActivity fragmentActivity) {
if (cardInterface instanceof Event) {
Utils.openEventFragment((Event) cardInterface, fragmentActivity);
} else if (cardInterface instanceof Body) {
Utils.openBodyFragment((Body) cardInterface, fragmentActivity);
} else if (cardInterface instanceof User) {
Utils.openUserFragment((User) cardInterface, fragmentActivity);
}
}
@Override
public int getAvatarPlaceholder(CardInterface cardInterface) {
if (cardInterface instanceof User) {
return R.drawable.user_placeholder;
}
return R.drawable.lotus_placeholder;
}
}
package app.insti.adapter;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import com.google.gson.Gson;
import com.squareup.picasso.Picasso;
import java.util.List;
import app.insti.R;
import app.insti.Utils;
import app.insti.api.EmptyCallback;
import app.insti.api.RetrofitInterface;
import app.insti.api.model.Event;
import app.insti.api.model.NewsArticle;
import app.insti.api.model.Notification;
import app.insti.api.model.PlacementBlogPost;
import app.insti.interfaces.ItemClickListener;
import app.insti.fragment.NewsFragment;
import app.insti.fragment.PlacementBlogFragment;
import app.insti.fragment.TrainingBlogFragment;
public class NotificationsAdapter extends RecyclerView.Adapter<NotificationsAdapter.Viewholder> {
private List<Notification> notifications;
private Context context;
private ItemClickListener itemClickListener;
public NotificationsAdapter(List<Notification> notifications, ItemClickListener itemClickListener) {
this.notifications = notifications;
this.itemClickListener = itemClickListener;
}
@Override
public Viewholder onCreateViewHolder(ViewGroup viewGroup, int i) {
context = viewGroup.getContext();
LayoutInflater inflater = LayoutInflater.from(context);
View notificationView = inflater.inflate(R.layout.feed_card, viewGroup, false);
final Viewholder notificationsViewHolder = new Viewholder(notificationView);
notificationView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
itemClickListener.onItemClick(v, notificationsViewHolder.getAdapterPosition());
}
});
return notificationsViewHolder;
public class NotificationsAdapter extends CardAdapter<Notification> {
public NotificationsAdapter(List<Notification> notifications, Fragment fragment) {
super(notifications, fragment);
}
@Override
public void onBindViewHolder(Viewholder viewholder, int i) {
public void onClick(Notification notification, FragmentActivity fragmentActivity) {
/* Mark notification read */
RetrofitInterface retrofitInterface = Utils.getRetrofitInterface();
String sessId = Utils.getSessionIDHeader();
retrofitInterface.markNotificationRead(sessId, notification.getNotificationId().toString()).enqueue(new EmptyCallback<Void>());
/* Open event */
if (notification.isEvent()) {
Gson gson = new Gson();
Notification appNotification = notifications.get(i);
viewholder.notificationVerb.setText(appNotification.getNotificationVerb());
if (appNotification.getNotificationActorType().contains("event")) {
Event event = gson.fromJson(gson.toJson(appNotification.getNotificationActor()), Event.class);
Picasso.get().load(
Utils.resizeImageUrl(event.getEventImageURL())
).into(viewholder.notificationPicture);
viewholder.notificationTitle.setText(event.getEventName());
} else if (appNotification.getNotificationActorType().contains("newsentry")) {
NewsArticle article = gson.fromJson(gson.toJson(appNotification.getNotificationActor()), NewsArticle.class);
Picasso.get().load(
Utils.resizeImageUrl(article.getBody().getBodyImageURL())
).into(viewholder.notificationPicture);
viewholder.notificationTitle.setText(article.getTitle());
} else if (appNotification.getNotificationActorType().contains("blogentry")) {
PlacementBlogPost post = gson.fromJson(gson.toJson(appNotification.getNotificationActor()), PlacementBlogPost.class);
Picasso.get().load(R.drawable.lotus_sq).into(viewholder.notificationPicture);
viewholder.notificationTitle.setText(post.getTitle());
Event event = gson.fromJson(gson.toJson(notification.getNotificationActor()), Event.class) ;
Utils.openEventFragment(event, fragmentActivity);
} else if (notification.isNews()) {
NewsFragment newsFragment = new NewsFragment();
Utils.updateFragment(newsFragment, fragmentActivity);
} else if (notification.isBlogPost()) {
Gson gson = new Gson();
PlacementBlogPost post = gson.fromJson(gson.toJson(notification.getNotificationActor()), PlacementBlogPost.class);
if (post.getLink().contains("training")) {
Utils.updateFragment(new TrainingBlogFragment(), fragmentActivity);
} else {
Utils.updateFragment(new PlacementBlogFragment(), fragmentActivity);
}
}
@Override
public int getItemCount() {
return notifications.size();
}
public class Viewholder extends RecyclerView.ViewHolder {
private TextView notificationTitle;
private ImageView notificationPicture;
private TextView notificationVerb;
public Viewholder(View itemView) {
super(itemView);
notificationPicture = (ImageView) itemView.findViewById(R.id.object_picture);
notificationTitle = (TextView) itemView.findViewById(R.id.object_title);
notificationVerb = (TextView) itemView.findViewById(R.id.object_subtitle);
}
@Override
public int getAvatarPlaceholder(Notification notification) {
return R.drawable.lotus_sq;
}
}
package app.insti.adapter;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.squareup.picasso.Picasso;
import android.support.v4.app.FragmentActivity;
import java.util.List;
import app.insti.R;
import app.insti.Utils;
import app.insti.api.model.Body;
import app.insti.api.model.Role;
import app.insti.interfaces.ItemClickListener;
public class RoleAdapter extends RecyclerView.Adapter<RoleAdapter.ViewHolder> {
private List<Role> roleList;
private Context context;
private Fragment fragment;
public class RoleAdapter extends CardAdapter<Role> {
public RoleAdapter(List<Role> roleList, Fragment mFragment) {
this.roleList = roleList;
this.fragment = mFragment;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
context = parent.getContext();
View v = LayoutInflater.from(context)
.inflate(R.layout.feed_card, parent, false);
final ViewHolder postViewHolder = new ViewHolder(v);
v.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Utils.openBodyFragment(roleList.get(postViewHolder.getAdapterPosition()).getRoleBodyDetails(), fragment.getActivity());
}
});
return postViewHolder;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
Role role = roleList.get(position);
Body roleBody = role.getRoleBodyDetails();
holder.bodyName.setText(roleBody.getBodyName());
holder.role.setText(role.getRoleName());
Picasso.get().load(
Utils.resizeImageUrl(roleBody.getBodyImageURL())
).into(holder.image);
super(roleList, mFragment);
}
@Override
public int getItemCount() {
return roleList.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
public TextView bodyName;
public TextView role;
public ImageView image;
public ViewHolder(View itemView) {
super(itemView);
bodyName = (TextView) itemView.findViewById(R.id.object_title);
role = (TextView) itemView.findViewById(R.id.object_subtitle);
image = (ImageView) itemView.findViewById(R.id.object_picture);
}
public void onClick(Role role, FragmentActivity fragmentActivity) {
Utils.openBodyFragment(role.getRoleBodyDetails(), fragmentActivity);
}
}
package app.insti.adapter;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.squareup.picasso.Picasso;
import android.support.v4.app.FragmentActivity;
import java.util.List;
......@@ -18,70 +9,19 @@ import app.insti.R;
import app.insti.Utils;
import app.insti.api.model.User;
public class UserAdapter extends RecyclerView.Adapter<UserAdapter.ViewHolder> {
private List<User> userList;
private Fragment fragment;
public class UserAdapter extends CardAdapter<User> {
public UserAdapter(List<User> userList, Fragment mFragment) {
this.userList = userList;
fragment = mFragment;
super(userList, mFragment);
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
Context context = parent.getContext();
View v = LayoutInflater.from(context)
.inflate(R.layout.feed_card, parent, false);
final ViewHolder postViewHolder = new ViewHolder(v);
v.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Utils.openUserFragment(userList.get(postViewHolder.getAdapterPosition()), fragment.getActivity());
}
});
return postViewHolder;
public void onClick(User user, FragmentActivity fragmentActivity) {
Utils.openUserFragment(user, fragmentActivity);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
User user = userList.get(position);
holder.userName.setText(user.getUserName());
if (user.getCurrentRole() == null || user.getCurrentRole().equals("")) {
holder.role.setText(user.getUserLDAPId());
} else {
holder.role.setText(user.getCurrentRole());
}
Picasso.get()
.load(user.getUserProfilePictureUrl())
.resize(150, 0)
.placeholder(R.drawable.user_placeholder)
.into(holder.image);
}
@Override
public int getItemCount() {
return userList.size();
}
public void setUserList(List<User> userList) {
this.userList = userList;
}
public class ViewHolder extends RecyclerView.ViewHolder {
private TextView userName;
private TextView role;
public ImageView image;
public ViewHolder(View itemView) {
super(itemView);
userName = itemView.findViewById(R.id.object_title);
role = itemView.findViewById(R.id.object_subtitle);
image = itemView.findViewById(R.id.object_picture);
}
public int getAvatarPlaceholder(User user) {
return R.drawable.user_placeholder;
}
}
......@@ -6,7 +6,9 @@ import com.google.gson.annotations.SerializedName;
import java.util.List;
public class Body {
import app.insti.interfaces.CardInterface;
public class Body implements CardInterface {
@SerializedName("id")
private String bodyID;
......@@ -181,4 +183,16 @@ public class Body {
public void setBodyRoles(List<Role> bodyRoles) {
this.bodyRoles = bodyRoles;
}
public String getTitle() {
return getBodyName();
}
public String getSubtitle() {
return getBodyShortDescription();
}
public String getAvatarUrl() {
return getBodyImageURL();
}
}
\ No newline at end of file
......@@ -6,10 +6,15 @@ import com.google.gson.Gson;
import com.google.gson.annotations.SerializedName;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Objects;
public class Event {
import app.insti.interfaces.CardInterface;
public class Event implements CardInterface {
@NonNull()
@SerializedName("id")
private String eventID;
......@@ -237,4 +242,60 @@ public class Event {
public int hashCode() {
return Objects.hash(eventID);
}
public String getTitle() {
return getEventName();
}
public String getSubtitle()
{
String subtitle = "";
Date startTime = getEventStartTime();
Date endTime = getEventEndTime();
Date timeNow = Calendar.getInstance().getTime();
boolean eventStarted = timeNow.compareTo(startTime) > 0;
boolean eventEnded = timeNow.compareTo(endTime) > 0;
if (eventEnded)
subtitle += "Event ended | ";
else if(eventStarted)
{
long difference = endTime.getTime() - timeNow.getTime();
long minutes = difference / (60 * 1000 ) % 60;
long hours = difference / (60 * 60 * 1000) % 24;
long days = difference / (24 * 60 * 60 * 1000);
String timeDiff = "";
if (days > 0)
timeDiff += Long.toString(days) + "D ";
if (hours > 0)
timeDiff += Long.toString(hours) + "H ";
timeDiff += Long.toString(minutes) + "M";
subtitle += "Ends in " + timeDiff + " | " ;
}
Timestamp timestamp = getEventStartTime();
if (timestamp != null) {
Date Date = new Date(timestamp.getTime());
SimpleDateFormat simpleDateFormatDate = new SimpleDateFormat("dd MMM");
SimpleDateFormat simpleDateFormatTime = new SimpleDateFormat("HH:mm");
subtitle += simpleDateFormatDate.format(Date) + " | " + simpleDateFormatTime.format(Date);
}
StringBuilder eventVenueName = new StringBuilder();
for (Venue venue : getEventVenues()) {
eventVenueName.append(", ").append(venue.getVenueShortName());
}
if (!eventVenueName.toString().equals(""))
subtitle += " | " + eventVenueName.toString().substring(2);
return subtitle;
}
public String getAvatarUrl() {
return getEventImageURL();
}
}
......@@ -2,11 +2,19 @@ package app.insti.api.model;
import android.support.annotation.NonNull;
import com.google.gson.Gson;
import com.google.gson.annotations.SerializedName;
public class Notification {
@NonNull()
import app.insti.Utils;
import app.insti.interfaces.CardInterface;
public class Notification implements CardInterface {
private final String TYPE_EVENT = "event";
private final String TYPE_NEWSENTRY = "newsentry";
private final String TYPE_BLOG = "blogentry";
@NonNull()
@SerializedName("id")
private Integer notificationId;
......@@ -70,4 +78,55 @@ public class Notification {
public void setNotificationActor(Object notificationActor) {
this.notificationActor = notificationActor;
}
public String getTitle() {
if (isEvent()) {
return getEvent().getEventName();
} else if (isNews()) {
return getNews().getTitle();
} else if (isBlogPost()) {
return getBlogPost().getTitle();
}
return "Notification";
}
public String getSubtitle() {
return getNotificationVerb();
}
public String getAvatarUrl() {
if (isEvent()) {
return getEvent().getEventImageURL();
} else if (isNews()) {
return getNews().getBody().getBodyImageURL();
}
return null;
}
public boolean isEvent() {
return getNotificationActorType().contains(TYPE_EVENT);
}
public boolean isNews() {
return getNotificationActorType().contains(TYPE_NEWSENTRY);
}
public boolean isBlogPost() {
return getNotificationActorType().contains(TYPE_BLOG);
}
public Event getEvent() {
Gson gson = Utils.gson;
return gson.fromJson(gson.toJson(getNotificationActor()), Event.class);
}
public NewsArticle getNews() {
Gson gson = Utils.gson;
return gson.fromJson(gson.toJson(getNotificationActor()), NewsArticle.class);
}
public PlacementBlogPost getBlogPost() {
Gson gson = Utils.gson;
return gson.fromJson(gson.toJson(getNotificationActor()), PlacementBlogPost.class);
}
}
......@@ -6,7 +6,9 @@ import com.google.gson.annotations.SerializedName;
import java.util.List;
public class Role {
import app.insti.interfaces.CardInterface;
public class Role implements CardInterface {
@NonNull()
@SerializedName("id")
private String roleID;
......@@ -118,4 +120,16 @@ public class Role {
public void setRoleUsersDetail(List<User> roleUsersDetail) {
this.roleUsersDetail = roleUsersDetail;
}
public String getTitle() {
return getRoleBodyDetails().getBodyName();
}
public String getSubtitle() {
return getRoleName();
}
public String getAvatarUrl() {
return getRoleBodyDetails().getBodyImageURL();
}
}
......@@ -7,7 +7,9 @@ import com.google.gson.annotations.SerializedName;
import java.util.List;
public class User {
import app.insti.interfaces.CardInterface;
public class User implements CardInterface {
@NonNull()
@SerializedName("id")
private String userID;
......@@ -235,4 +237,20 @@ public class User {
public String toString() {
return new Gson().toJson(this);
}
public String getTitle() {
return getUserName();
}
public String getSubtitle() {
if (getCurrentRole() == null || getCurrentRole().equals("")) {
return getUserLDAPId();
} else {
return getCurrentRole();
}
}
public String getAvatarUrl() {
return getUserProfilePictureUrl();
}
}
......@@ -167,7 +167,7 @@ public class CalendarFragment extends BaseFragment {
if (feedAdapter == null) {
feedAdapter = new FeedAdapter(filteredEvents, this);
} else {
feedAdapter.setEvents(filteredEvents);
feedAdapter.setList(filteredEvents);
feedAdapter.notifyDataSetChanged();
}
......
......@@ -8,25 +8,28 @@ import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.EditorInfo;
import android.widget.EditText;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
import app.insti.R;
import app.insti.Utils;
import app.insti.adapter.BodyAdapter;
import app.insti.adapter.FeedAdapter;
import app.insti.adapter.UserAdapter;
import app.insti.activity.MainActivity;
import app.insti.adapter.GenericAdapter;
import app.insti.api.EmptyCallback;
import app.insti.api.RetrofitInterface;
import app.insti.api.model.Body;
import app.insti.api.model.Event;
import app.insti.api.model.User;
import app.insti.api.response.ExploreResponse;
import app.insti.interfaces.CardInterface;
import retrofit2.Call;
import retrofit2.Response;
......@@ -41,10 +44,11 @@ public class ExploreFragment extends Fragment {
private static List<Body> bodies = new ArrayList<>();
private static List<Event> events = new ArrayList<>();
private static List<User> users = new ArrayList<>();
private static List<CardInterface> cards = new ArrayList<>();
private String sessionId;
private BodyAdapter bodyAdapter;
private FeedAdapter eventsAdapter;
private UserAdapter userAdapter;
private GenericAdapter genericAdapter;
private String currentQuery = null;
......@@ -75,11 +79,13 @@ public class ExploreFragment extends Fragment {
// Initialize
sessionId = Utils.getSessionIDHeader();
initRecyclerViews();
initRecyclerView();
Toolbar toolbar = getActivity().findViewById(R.id.toolbar);
toolbar.setTitle("Explore");
final EditText searchEditText = getView().findViewById(R.id.explore_search);
// Get all bodies
if (allBodies.size() == 0) {
RetrofitInterface retrofitInterface = Utils.getRetrofitInterface();
......@@ -88,16 +94,32 @@ public class ExploreFragment extends Fragment {
public void onResponse(Call<List<Body>> call, Response<List<Body>> response) {
allBodies = response.body();
bodies = allBodies;
updateAdapters(allBodies, new ArrayList<Event>(), new ArrayList<User>());
updateAdapter(allBodies, new ArrayList<Event>(), new ArrayList<User>());
}
});
} else {
updateAdapters(allBodies, new ArrayList<Event>(), new ArrayList<User>());
// Check if search box is not empty
if (searchEditText.getText() != null && !searchEditText.getText().toString().equals("")) {
updateAdapter(bodies, events, users);
} else {
updateAdapter(allBodies, new ArrayList<Event>(), new ArrayList<User>());
}
getView().findViewById(R.id.loadingPanel).setVisibility(View.GONE);
}
// Close keyboard on search click
searchEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_SEARCH) {
MainActivity.hideKeyboard(getActivity());
return true;
}
return false;
}
});
// Search on text change in search
final EditText searchEditText = getView().findViewById(R.id.explore_search);
searchEditText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
......@@ -115,7 +137,7 @@ public class ExploreFragment extends Fragment {
if (currentQuery.length() >= 3) {
doSearch(searchEditText.getText().toString());
} else if (currentQuery.length() == 0) {
updateAdapters(allBodies, new ArrayList<Event>(), new ArrayList<User>());
updateAdapter(allBodies, new ArrayList<Event>(), new ArrayList<User>());
}
}
});
......@@ -151,45 +173,34 @@ public class ExploreFragment extends Fragment {
bodies = response.body().getBodies();
events = response.body().getEvents();
users = response.body().getUsers();
updateAdapters(bodies, events, users);
updateAdapter(bodies, events, users);
}
});
}
private void updateAdapters(List<Body> bodies, List<Event> events, List<User> users) {
private void updateAdapter(List<Body> bodies, List<Event> events, List<User> users) {
if (getActivity() == null || getView() == null) return;
// Make spinner gone
getView().findViewById(R.id.loadingPanel).setVisibility(View.GONE);
// Set adapters data
bodyAdapter.setBodyList(bodies);
eventsAdapter.setEvents(events);
userAdapter.setUserList(users);
// Build cards
cards.clear();
cards.addAll(bodies);
cards.addAll(events);
cards.addAll(users);
genericAdapter.setList(cards);
// Notify all adapters
bodyAdapter.notifyDataSetChanged();
eventsAdapter.notifyDataSetChanged();
userAdapter.notifyDataSetChanged();
// Notify adapter
genericAdapter.notifyDataSetChanged();
}
public void initRecyclerViews() {
public void initRecyclerView() {
if (getActivity() == null || getView() == null) return;
// Bodies
RecyclerView bodiesRecyclerView = getView().findViewById(R.id.explore_body_recycler_view);
bodyAdapter = new BodyAdapter(bodies, this);
bodiesRecyclerView.setAdapter(bodyAdapter);
bodiesRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
// Events
RecyclerView eventsRecyclerView = getView().findViewById(R.id.explore_event_recycler_view);
eventsAdapter = new FeedAdapter(events, this);
eventsRecyclerView.setAdapter(eventsAdapter);
eventsRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
// Users
RecyclerView usersRecyclerView = getView().findViewById(R.id.explore_user_recycler_view);
userAdapter = new UserAdapter(users, this);
usersRecyclerView.setAdapter(userAdapter);
usersRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
RecyclerView bodiesRecyclerView = getView().findViewById(R.id.explore_recycler_view);
genericAdapter = new GenericAdapter(cards, this);
bodiesRecyclerView.setAdapter(genericAdapter);
bodiesRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
}
}
\ No newline at end of file
......@@ -159,7 +159,7 @@ public class FeedFragment extends BaseFragment {
if (feedAdapter == null) {
feedAdapter = new FeedAdapter(events, this);
} else {
feedAdapter.setEvents(events);
feedAdapter.setList(events);
feedAdapter.notifyDataSetChanged();
}
......
......@@ -10,19 +10,13 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.google.gson.Gson;
import java.util.List;
import app.insti.R;
import app.insti.Utils;
import app.insti.adapter.NotificationsAdapter;
import app.insti.api.EmptyCallback;
import app.insti.api.RetrofitInterface;
import app.insti.api.model.Event;
import app.insti.api.model.Notification;
import app.insti.api.model.PlacementBlogPost;
import app.insti.interfaces.ItemClickListener;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
......@@ -78,36 +72,7 @@ public class NotificationsFragment extends BaseFragment {
/* Hide loader */
getActivity().findViewById(R.id.loadingPanel).setVisibility(View.GONE);
NotificationsAdapter notificationsAdapter = new NotificationsAdapter(notifications, new ItemClickListener() {
@Override
public void onItemClick(View v, int position) {
/* Get the notification */
Notification notification = notifications.get(position);
/* Mark notification read */
RetrofitInterface retrofitInterface = Utils.getRetrofitInterface();
String sessId = Utils.getSessionIDHeader();
retrofitInterface.markNotificationRead(sessId, notification.getNotificationId().toString()).enqueue(new EmptyCallback<Void>());
/* Open event */
if (notification.getNotificationActorType().contains("event")) {
Gson gson = new Gson();
Event event = gson.fromJson(gson.toJson(notification.getNotificationActor()), Event.class) ;
Utils.openEventFragment(event, getActivity());
} else if (notification.getNotificationActorType().contains("newsentry")) {
NewsFragment newsFragment = new NewsFragment();
Utils.updateFragment(newsFragment, getActivity());
} else if (notification.getNotificationActorType().contains("blogentry")) {
Gson gson = new Gson();
PlacementBlogPost post = gson.fromJson(gson.toJson(notification.getNotificationActor()), PlacementBlogPost.class);
if (post.getLink().contains("training")) {
Utils.updateFragment(new TrainingBlogFragment(), getActivity());
} else {
Utils.updateFragment(new PlacementBlogFragment(), getActivity());
}
}
}
});
NotificationsAdapter notificationsAdapter = new NotificationsAdapter(notifications, this);
notificationsRecyclerView = (RecyclerView) getActivity().findViewById(R.id.notifications_recycler_view);
notificationsRecyclerView.setAdapter(notificationsAdapter);
notificationsRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
......
package app.insti.interfaces;
public interface CardInterface {
String getTitle();
String getSubtitle();
String getAvatarUrl();
}
......@@ -23,13 +23,9 @@
android:paddingRight="6dp"
android:paddingTop="3dp"
android:textColor="@color/primaryTextColor"
android:textColorHint="@color/primaryTextColor" />
<android.support.v4.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical">
android:textColorHint="@color/primaryTextColor"
android:imeOptions="actionSearch"
android:inputType="text" />
<LinearLayout
android:layout_width="match_parent"
......@@ -37,26 +33,11 @@
android:orientation="vertical">
<android.support.v7.widget.RecyclerView
android:id="@+id/explore_body_recycler_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:nestedScrollingEnabled="false" />
<android.support.v7.widget.RecyclerView
android:id="@+id/explore_event_recycler_view"
android:id="@+id/explore_recycler_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:nestedScrollingEnabled="false" />
<android.support.v7.widget.RecyclerView
android:id="@+id/explore_user_recycler_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:nestedScrollingEnabled="false" />
android:layout_height="wrap_content" />
</LinearLayout>
</android.support.v4.widget.NestedScrollView>
</LinearLayout>
<RelativeLayout
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment