njomeau/zuluzulu

View on GitHub
app/src/main/java/ch/epfl/sweng/zuluzulu/fragments/adminFragments/MementoFragment.java

Summary

Maintainability
A
35 mins
Test Coverage
package ch.epfl.sweng.zuluzulu.fragments.adminFragments;

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import ch.epfl.sweng.zuluzulu.adapters.EventArrayAdapter;
import ch.epfl.sweng.zuluzulu.CommunicationTag;
import ch.epfl.sweng.zuluzulu.firebase.DatabaseFactory;
import ch.epfl.sweng.zuluzulu.fragments.superFragments.FragmentWithUser;
import ch.epfl.sweng.zuluzulu.idlingResource.IdlingResourceFactory;
import ch.epfl.sweng.zuluzulu.OnFragmentInteractionListener;
import ch.epfl.sweng.zuluzulu.R;
import ch.epfl.sweng.zuluzulu.structure.Event;
import ch.epfl.sweng.zuluzulu.structure.EventBuilder;
import ch.epfl.sweng.zuluzulu.structure.EventDate;
import ch.epfl.sweng.zuluzulu.structure.user.Admin;
import ch.epfl.sweng.zuluzulu.urlTools.MementoParser;
import ch.epfl.sweng.zuluzulu.urlTools.UrlHandler;
import ch.epfl.sweng.zuluzulu.structure.user.User;
import ch.epfl.sweng.zuluzulu.structure.user.UserRole;


/**
 * A simple {@link Fragment} subclass.
 * Activities that contain this fragment must implement the
 * {@link OnFragmentInteractionListener} interface
 * to handle interaction events.
 * Use the {@link MementoFragment#newInstance} factory method to
 * create an instance of this fragment.
 */
public class MementoFragment extends FragmentWithUser<Admin> {
    final static public String EPFL_MEMENTO_URL = "https://memento.epfl.ch/api/jahia/mementos/epfl/events/fr/?format=json";
    final static public String ASSOCIATION_MEMENTO_URL = "https://memento.epfl.ch/api/jahia/mementos/associations/events/fr/?format=json";
    private static final String TAG = "MEMENTO_FRAGMENT";
    private static final UserRole ROLE_REQUIRED = UserRole.ADMIN;
    private EventArrayAdapter eventAdapter;
    private ArrayList<Event> events;

    public MementoFragment() {
        // Required empty public constructor
    }

    /**
     * New instance
     *
     * @param user User
     * @return The fragment
     */
    public static MementoFragment newInstance(User user) {
        if (!user.hasRole(ROLE_REQUIRED)) {
            return null;
        }

        Bundle bundle = new Bundle();
        bundle.putSerializable(ARG_USER, user);

        // Transmit data
        MementoFragment fragment = new MementoFragment();
        fragment.setArguments(bundle);

        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.events = new ArrayList<>();
        this.eventAdapter = new EventArrayAdapter(getContext(), events, mListener, user);


        mListener.onFragmentInteraction(CommunicationTag.SET_TITLE, "Memento loader");
        UrlHandler urlHandler = new UrlHandler(this::handleMemento, new MementoParser());
        urlHandler.execute(ASSOCIATION_MEMENTO_URL, EPFL_MEMENTO_URL);

        // Send increment to wait async execution in test
        IdlingResourceFactory.incrementCountingIdlingResource();
    }

    /**
     * Handle memento data
     *
     * @param result Json aray datas
     */
    private void handleMemento(List<String> result) {
        if (result != null) {
            for (int i = 0; i < result.size(); i++) {
                if (result.get(i) != null && !result.get(i).isEmpty()) {
                    addEvent(result.get(i));
                }
            }
        }

        addDatabase();
        IdlingResourceFactory.decrementCountingIdlingResource();
    }

    private void addDatabase() {
        for (Event event : events) {
            DatabaseFactory.getDependency().addEvent(event);
        }
    }

    private void addEvent(String datas) {
        if (datas == null || datas.isEmpty()) {
            return;
        }

        JSONArray jsonarray;
        try {
            jsonarray = new JSONArray(datas);
            for (int i = 0; i < jsonarray.length(); i++) {
                JSONObject jsonobject = jsonarray.getJSONObject(i);

                this.events.add(createEvent(jsonobject));
                eventAdapter.notifyDataSetChanged();
            }
        } catch (Exception e) {
            e.printStackTrace();
            Log.d(TAG, "Could not parse json");
        }
    }

    private Event createEvent(JSONObject jsonobject) throws JSONException, IllegalArgumentException, ParseException {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        Date start_date;
        if("null".equals(jsonobject.getString("event_start_time")))
            start_date = simpleDateFormat.parse(jsonobject.getString("event_start_date") + " " + "00:00:00");
         else
            start_date = simpleDateFormat.parse(jsonobject.getString("event_start_date") + " " + jsonobject.getString("event_start_time"));

        Date end_date;
        String end_date_string = jsonobject.getString("event_end_date");

        if((jsonobject.getString("event_end_time").equals("null")))
            end_date = simpleDateFormat.parse(end_date_string + " " + "00:00:00");
         else
            end_date = simpleDateFormat.parse(end_date_string + " " + jsonobject.getString("event_end_time"));

        return new EventBuilder()
                // Use this to avoid collision
                .setId(Integer.toString(jsonobject.getString("title").hashCode()))
                .setDate(new EventDate(start_date, end_date))
                .setUrlPlaceAndRoom(jsonobject.getString("event_url_place_and_room")).setAssosId("0")
                .setChannelId(Integer.toString(jsonobject.getString("title").hashCode())).setFollowers(new ArrayList<>())
                .setShortDesc(jsonobject.getString("description")).setName(jsonobject.getString("title"))
                .setLongDesc(jsonobject.getString("description")).setOrganizer(jsonobject.getString("event_organizer"))
                .setPlace(jsonobject.getString("event_place_and_room")).setBannerUri(null)
                .setIconUri(jsonobject.getString("event_visual_absolute_url")).setWebsite(jsonobject.getString("event_url_link"))
                .setContact(jsonobject.getString("event_contact")).setCategory(jsonobject.getString("event_category_fr"))
                .setSpeaker(jsonobject.getString("event_speaker")).build();
    }

    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_memento, container, false);

        ListView list = view.findViewById(R.id.memento_list_view);
        list.setAdapter(eventAdapter);

        return view;
    }
}