package com.example.familymap; import com.google.android.gms.maps.model.Marker; import com.google.android.gms.maps.model.Polyline; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.TreeMap; import model.Event; import model.Person; public class DataCache { /** * DataCache operations */ private static DataCache instance = new DataCache(); private DataCache() {} public void clearInstance() { instance = null; } public static DataCache getInstance() { if (instance == null) { instance = new DataCache(); } return instance; } /** * Lists of persons and events */ private List allPersons = new ArrayList<>(); private List allEvents = new ArrayList<>(); public List getAllPersons() { return allPersons; } public List getAllEvents() { return allEvents; } private List maleEvents = new ArrayList<>(); private List femaleEvents = new ArrayList<>(); public List getMaleEvents() { return maleEvents; } public List getFemaleEvents() { return femaleEvents; } private List paternalAncestors = new ArrayList<>(); private List maternalAncestors = new ArrayList<>(); private List malePaternalEvents = new ArrayList<>(); private List femalePaternalEvents = new ArrayList<>(); private List maleMaternalEvents = new ArrayList<>(); private List femaleMaternalEvents = new ArrayList<>(); public List getPaternalAncestors() { return paternalAncestors; } public List getMaternalAncestors() { return maternalAncestors; } public List getMalePaternalEvents() { return malePaternalEvents; } public List getFemalePaternalEvents() { return femalePaternalEvents; } public List getMaleMaternalEvents() { return maleMaternalEvents; } public List getFemaleMaternalEvents() { return femaleMaternalEvents; } /** * Maps and marker data structures */ private Map personByIDMap = new TreeMap<>(); public Map getPersonByIDMap() { return personByIDMap; } private Map> personFamilyMap = new TreeMap<>(); public Map> personEventsMap = new TreeMap<>(); public Map> getPersonFamilyMap() { return personFamilyMap; } public Map> getPersonEventsMap() { return personEventsMap; } private Map markerColorsMap = new TreeMap<>(); private List markers = new ArrayList<>(); public Map getMarkerColorsMap() { return markerColorsMap; } public List getMarkers() { return markers; } /** * User person and eventID */ public Person userPerson; private String currentEventID; private boolean fromEventActivity = false; public void setUserPerson(Person userPerson) { this.userPerson = userPerson; } public Person getUserPerson() { return userPerson; } public void setCurrentEventID(String eventID) { currentEventID = eventID; } public String getCurrentEventID() { return currentEventID; } public void setFromEventActivity(boolean condition) { fromEventActivity = condition; } public boolean isFromEventActivity() { return fromEventActivity; } /** * Settings */ private boolean showLifeStoryLines = true; private boolean showFamilyTreeLines = true; private boolean showSpouseLines = true; private boolean showFathersSide = true; private boolean showMothersSide = true; private boolean showMaleEvents = true; private boolean showFemaleEvents = true; public void setShowLifeStoryLines(boolean condition) { showLifeStoryLines = condition; } public boolean showLifeStoryLines() { return showLifeStoryLines; } public void setShowFamilyTreeLines(boolean condition) { showFamilyTreeLines = condition; } public boolean showFamilyTreeLines() { return showFamilyTreeLines; } public void setShowSpouseLines(boolean condition) { showSpouseLines = condition; } public boolean showSpouseLines() { return showSpouseLines; } public void setShowFathersSide(boolean condition) { showFathersSide = condition; } public boolean showFathersSide() { return showFathersSide; } public void setShowMothersSide(boolean condition) { showMothersSide = condition; } public boolean showMothersSide() { return showMothersSide; } public void setShowMaleEvents(boolean condition) { showMaleEvents = condition; } public boolean showMaleEvents() { return showMaleEvents; } public void setShowFemaleEvents(boolean condition) { showFemaleEvents = condition; } public boolean showFemaleEvents() { return showFemaleEvents; } public List filterEvents() { List filteredEvents = new ArrayList<>(); //Resetting the person-event map so that the user and their spouse do not have missing events for (int i = 0; i < allPersons.size(); i++) { String personID = allPersons.get(i).getPersonID(); getPersonEventsMap().get(personID).clear(); for (int j = 0; j < allEvents.size(); j++) { if (allEvents.get(j).getPersonID().equals(personID)) { getPersonEventsMap().get(personID).add(allEvents.get(j)); } } } if(showFathersSide() && showMothersSide()) { if (showMaleEvents() && !showFemaleEvents()) { filteredEvents = getMaleEvents(); } else if (!showMaleEvents() && showFemaleEvents()) { filteredEvents = getFemaleEvents(); } else if (showMaleEvents() && showFemaleEvents()) { filteredEvents = getAllEvents(); } } else if (!showFathersSide() && showMothersSide()) { filteredEvents.addAll(personEventsMap.get(userPerson.getPersonID())); if (userPerson.getSpouseID() != null) { filteredEvents.addAll(personEventsMap.get(userPerson.getSpouseID())); } if (showMaleEvents() && !showFemaleEvents()) { filteredEvents = getMaleMaternalEvents(); } else if (!showMaleEvents() && showFemaleEvents()) { filteredEvents = getFemaleMaternalEvents(); } else if (showMaleEvents() && showFemaleEvents()) { filteredEvents.addAll(maleMaternalEvents); filteredEvents.addAll(femaleMaternalEvents); } } else if (showFathersSide() && !showMothersSide()) { filteredEvents.addAll(personEventsMap.get(userPerson.getPersonID())); if (userPerson.getSpouseID() != null) { filteredEvents.addAll(personEventsMap.get(userPerson.getSpouseID())); } if (showMaleEvents() && !showFemaleEvents()) { filteredEvents = getMalePaternalEvents(); } else if (!showMaleEvents() && showFemaleEvents()) { filteredEvents = getFemalePaternalEvents(); } else if (showMaleEvents() && showFemaleEvents()) { filteredEvents.addAll(malePaternalEvents); filteredEvents.addAll(femalePaternalEvents); } } else { if (showMaleEvents() && !showFemaleEvents()) { if (userPerson.getGender().equals("m")) { filteredEvents.addAll(personEventsMap.get(userPerson.getPersonID())); } if (personByIDMap.get(userPerson.getSpouseID()).getGender().equals("m")) { filteredEvents.addAll(personEventsMap.get(userPerson.getSpouseID())); } } else if (!showMaleEvents() && showFemaleEvents()) { if (userPerson.getGender().equals("f")) { filteredEvents.addAll(personEventsMap.get(userPerson.getPersonID())); } if (personByIDMap.get(userPerson.getSpouseID()).getGender().equals("f")) { filteredEvents.addAll(personEventsMap.get(userPerson.getSpouseID())); } } else if (showMaleEvents() && showFemaleEvents()) { filteredEvents.addAll(personEventsMap.get(userPerson.getPersonID())); if (userPerson.getSpouseID() != null) { filteredEvents.addAll(personEventsMap.get(userPerson.getSpouseID())); } } } //Modifying the person-event map to reflect the changes made for (int i = 0; i < allPersons.size(); i++) { String personID = allPersons.get(i).getPersonID(); getPersonEventsMap().get(personID).clear(); for (int j = 0; j < filteredEvents.size(); j++) { if (filteredEvents.get(j).getPersonID().equals(personID)) { getPersonEventsMap().get(personID).add(filteredEvents.get(j)); } } } //Sorting the new events that were put into the map for (Map.Entry> entry : getPersonEventsMap().entrySet()) { Collections.sort(entry.getValue(), new Comparator() { @Override public int compare(Event event1, Event event2) { if (event1.getYear() == event2.getYear()) { return Integer.valueOf(event2.getEventType().charAt(0)).compareTo(Integer.valueOf(event1.getEventType().charAt(0))); } else { return Integer.valueOf(event1.getYear()).compareTo(event2.getYear()); } } }); } return filteredEvents; } public void populateImmediateFamily(List persons) { for (int i = 0; i < persons.size(); i++) { String personID = persons.get(i).getPersonID(); //All checks to see if the given personID is a mother, father, spouse, etc. (determines what goes in the immediate family map) for (int j = 0; j < persons.size(); j++) { if (persons.get(j).getFatherID() != null && persons.get(j).getMotherID() != null) { if (persons.get(j).getFatherID().equals(personID) || persons.get(j).getMotherID().equals(personID)) { if (getPersonFamilyMap().containsKey(personID)) { getPersonFamilyMap().get(personID).add(persons.get(j)); } else { ArrayList personList = new ArrayList<>(); personList.add(persons.get(j)); getPersonFamilyMap().put(personID, personList); } } } if (persons.get(j).getPersonID().equals(persons.get(i).getSpouseID())) { if (getPersonFamilyMap().containsKey(personID)) { getPersonFamilyMap().get(personID).add(persons.get(j)); } else { ArrayList personList = new ArrayList<>(); personList.add(persons.get(j)); getPersonFamilyMap().put(personID, personList); } } if (persons.get(j).getPersonID().equals(persons.get(i).getMotherID())) { if (getPersonFamilyMap().containsKey(personID)) { getPersonFamilyMap().get(personID).add(persons.get(j)); } else { ArrayList personList = new ArrayList<>(); personList.add(persons.get(j)); getPersonFamilyMap().put(personID, personList); } } if (persons.get(j).getPersonID().equals(persons.get(i).getFatherID())) { if (getPersonFamilyMap().containsKey(personID)) { getPersonFamilyMap().get(personID).add(persons.get(j)); } else { ArrayList personList = new ArrayList<>(); personList.add(persons.get(j)); getPersonFamilyMap().put(personID, personList); } } } } } }