package fr.paug.androidmakers.manager; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.util.Log; import com.google.firebase.database.DataSnapshot; import com.google.firebase.database.DatabaseError; import com.google.firebase.database.DatabaseReference; import com.google.firebase.database.FirebaseDatabase; import com.google.firebase.database.ValueEventListener; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Set; import fr.paug.androidmakers.model.FirebaseDataConverted; import fr.paug.androidmakers.model.PartnerGroup; import fr.paug.androidmakers.model.Room; import fr.paug.androidmakers.model.ScheduleSlot; import fr.paug.androidmakers.model.Session; import fr.paug.androidmakers.model.Speaker; /** * Created by stan on 18/03/2017. */ public class AgendaRepository { private static final String TAG = "AgendaRepository"; private final FirebaseDatabase mDatabase; private final DatabaseReference mDatabaseReference; @NonNull private final List<OnLoadListener> mOnLoadListeners; private boolean mLoaded; private FirebaseDataConverted mFirebaseDataConverted = new FirebaseDataConverted(); private AgendaRepository() { Log.e(TAG, "AgendaRepo created"); mOnLoadListeners = new ArrayList<>(); mDatabase = FirebaseDatabase.getInstance(); mDatabaseReference = mDatabase.getReference(); mDatabaseReference.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { mFirebaseDataConverted.loadAllFromFirebase(dataSnapshot.getValue()); List<OnLoadListener> listenersCpy = new ArrayList<>(mOnLoadListeners); for (OnLoadListener listener : listenersCpy) { listener.onAgendaLoaded(); } mLoaded = true; Log.e(TAG, "AgendaRepo loaded"); } @Override public void onCancelled(DatabaseError databaseError) { // nothing to do } }); } public static AgendaRepository getInstance() { return SingletonHolder.instance; } public boolean isLoaded() { return mLoaded; } public void load(OnLoadListener listener) { if (mLoaded) { listener.onAgendaLoaded(); return; } mOnLoadListeners.add(listener); } @Nullable public Room getRoom(int id) { return mFirebaseDataConverted.getRooms().get(id); } @Nullable public Session getSession(int id) { return mFirebaseDataConverted.getSessions().get(id); } @Nullable public Speaker getSpeaker(int id) { return mFirebaseDataConverted.getSpeakers().get(id); } @NonNull public List<ScheduleSlot> getScheduleSlots() { return new ArrayList<>(mFirebaseDataConverted.getScheduleSlots()); } @Nullable public ScheduleSlot getScheduleSlot(int id) { for (ScheduleSlot slot : mFirebaseDataConverted.getScheduleSlots()) { if (slot.sessionId == id) { return slot; } } return null; } @Nullable public ScheduleSlot getScheduleSlot(@NonNull String id) { try { int idAsInt = Integer.parseInt(id); return getScheduleSlot(idAsInt); } catch (NumberFormatException e) { Log.e(TAG, "Cannot format " + id + "into an int: ", e); } return null; } public Map<PartnerGroup.PartnerType, PartnerGroup> getPartners() { return mFirebaseDataConverted.getPartners(); } public Set<String> getAllLanguages() { return mFirebaseDataConverted.getAllLanguages(); } public void removeListener(@NonNull OnLoadListener listener) { mOnLoadListeners.remove(listener); } public interface OnLoadListener { void onAgendaLoaded(); } private static class SingletonHolder { private final static AgendaRepository instance = new AgendaRepository(); } }