Arthelh/NCNF

View on GitHub
app/src/main/java/com/ncnf/adapters/EventListAdapter.java

Summary

Maintainability
A
1 hr
Test Coverage
D
64%
package com.ncnf.adapters;

import android.content.Context;
import android.graphics.BitmapFactory;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.cardview.widget.CardView;
import androidx.recyclerview.widget.RecyclerView;

import com.ncnf.R;
import com.ncnf.models.Event;
import com.ncnf.storage.firebase.FirebaseCacheFileStore;
import com.ncnf.models.SocialObject;
import com.ncnf.utilities.DateAdapter;

import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;

public class EventListAdapter extends RecyclerView.Adapter<EventListAdapter.SocialObjViewHolder> implements Filterable {
    private List<Event> events;
    private final List<Event> eventsFull;
    private final OnSocialObjListener onSocialObjListener;
    protected final Context context;

    public interface OnSocialObjListener {
        void onEventClick(Event event);
    }

    public EventListAdapter(Context context, List<Event> items, OnSocialObjListener onSocialObjListener) {
        //ensure proper copy of the List

        events = new LinkedList<>(items);
        Collections.sort(events);
        eventsFull = new LinkedList<>(items);
        Collections.sort(eventsFull);


        this.onSocialObjListener = onSocialObjListener;
        this.context = context;
    }

    /**
     * Getter for event list
     */
    public List<SocialObject> getEvents() {
        return Collections.unmodifiableList(events);
    }

    /**
     * Setter for event list (also notify recycler view)
     */
    public void setEvents(List<Event> events) {
        this.events = events;
        notifyDataSetChanged();
    }

    /**
     * Add an event and sort the list
     */
    public void addEvent(Event Event) {
        // Add the Event at the beginning of the list
        events.add(0, Event);
        eventsFull.add(0, Event);

        orderBy();

        // Notify the insertion so the view can be refreshed
        notifyItemInserted(events.indexOf(Event));
    }


    @Override
    public int getItemCount() {
        return events.size();
    }

    @Override
    public Filter getFilter() {
        return socialObjFilter;
    }

    private final Filter socialObjFilter = new Filter() {

        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            List<SocialObject> filteredList = new ArrayList<>();

            if (constraint == null || constraint.length() == 0) {
                filteredList.addAll(eventsFull);
            } else {
                String input = constraint.toString().toLowerCase().trim();
                for (SocialObject s : eventsFull) {
                    if(s instanceof Event){
                        Event event = (Event) s;
                        if (event.getName().contains(input)) {
                            filteredList.add(s);
                        }
                    }

                }
            }

            FilterResults res = new FilterResults();
            res.values = filteredList;

            return res;
        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            events.clear();
            events.addAll((List) results.values);
            notifyDataSetChanged();
        }
    };

    public class SocialObjViewHolder extends RecyclerView.ViewHolder {
        // Card fields
        private final TextView socialObject;
        private final TextView date;
        private final TextView description;
        private final ImageView image;

        public SocialObjViewHolder(View v, OnSocialObjListener e) {
            super(v);
            socialObject = v.findViewById(R.id.set_event_name);
            date = v.findViewById(R.id.event_date);
            description = v.findViewById(R.id.event_descr);
            CardView imageHolder = v.findViewById(R.id.event_card_image);
            image = imageHolder.findViewById(R.id.event_picture);
            //add timestamp
        }

        public void bind(final Event e, final OnSocialObjListener listener) {
            socialObject.setText(e.getName());
            itemView.setOnClickListener(v -> listener.onEventClick(e));
            setEventImage(e);
        }

        private void setEventImage(Event event){
            FirebaseCacheFileStore fileStore = new FirebaseCacheFileStore();
            fileStore.setContext(context);
            fileStore.setPath(SocialObject.IMAGE_PATH, String.format(SocialObject.IMAGE_NAME, event.getUuid().toString()));
            fileStore.downloadImage(image, BitmapFactory.decodeResource(context.getResources(),
                    R.drawable.default_event_header_picture));
        }
    }

    @NonNull
    @Override
    public SocialObjViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View v = LayoutInflater.from(viewGroup.getContext())
                .inflate(R.layout.event_row, viewGroup, false);

        return new SocialObjViewHolder(v, onSocialObjListener);
    }

    @Override
    public void onBindViewHolder(@NonNull SocialObjViewHolder viewHolder, int position) {
        Event event = events.get(position);

        viewHolder.socialObject.setText(event.getName());
        viewHolder.date.setText(new DateAdapter(event.getDate()).toString());
        viewHolder.description.setText(event.getDescription());

        viewHolder.bind(event, onSocialObjListener);
    }


    public void orderBy() {
        // RELEVANCE & DEFAULT CASE
        Collections.sort(events);
        Collections.sort(eventsFull);


        // Notify the insertion so the view can be refreshed
        notifyDataSetChanged();
    }

}