package org.gdg.frisbee.android.eventseries;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.design.widget.Snackbar;
import com.squareup.picasso.Picasso;
import org.gdg.frisbee.android.Const;
import org.gdg.frisbee.android.R;
import org.gdg.frisbee.android.api.Callback;
import org.gdg.frisbee.android.api.GdgXHub;
import org.gdg.frisbee.android.api.model.Event;
import org.gdg.frisbee.android.api.model.PagedList;
import org.gdg.frisbee.android.app.App;
import org.gdg.frisbee.android.cache.ModelCache;
import org.gdg.frisbee.android.utils.Utils;
import org.joda.time.DateTime;
import java.util.ArrayList;
import java.util.List;
public class GdgEventListFragment extends EventListFragment {
private GdgXHub gdgXHub;
private ModelCache modelCache;
private String mCacheKey;
private String mPlusId;
public static EventListFragment newInstance(String plusId) {
EventListFragment fragment = new GdgEventListFragment();
Bundle arguments = new Bundle();
arguments.putString(Const.EXTRA_PLUS_ID, plusId);
fragment.setArguments(arguments);
return fragment;
}
@Override
EventAdapter createEventAdapter() {
Picasso picasso = App.from(getContext()).getPicasso();
return new EventAdapter(getContext(), picasso);
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
gdgXHub = App.from(context).getGdgXHub();
modelCache = App.from(context).getModelCache();
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mPlusId = getArguments().getString(Const.EXTRA_PLUS_ID);
mCacheKey = "event_" + mPlusId;
}
@Override
void fetchEvents() {
setIsLoading(true);
if (Utils.isOnline(getActivity())) {
loadFirstPage();
} else {
modelCache.getAsync(mCacheKey, false, new ModelCache.CacheListener() {
@Override
public void onGet(Object item) {
if (checkValidCache(item)) {
ArrayList<Event> events = (ArrayList<Event>) item;
mAdapter.addAll(events);
setIsLoading(false);
Snackbar.make(getView(), R.string.cached_content, Snackbar.LENGTH_SHORT).show();
} else {
modelCache.removeAsync(mCacheKey);
onNotFound();
}
}
@Override
public void onNotFound(String key) {
onNotFound();
}
private void onNotFound() {
setIsLoading(false);
showError(R.string.offline_alert);
}
});
}
}
private void loadFirstPage() {
loadMoreEvents(1);
}
@Override
protected boolean loadMoreEvents(int page) {
final boolean isInitialPage = page == 1;
gdgXHub.getChapterAllEventList(mPlusId, page).
enqueue(new Callback<PagedList<Event>>() {
@Override
public void onSuccess(PagedList<Event> eventsPagedList) {
List<Event> events = eventsPagedList.getItems();
if (isContextValid()) {
mAdapter.addAll(events);
setIsLoading(false);
}
if (isInitialPage) {
modelCache.putAsync(mCacheKey, events, DateTime.now().plusHours(2));
}
}
@Override
public void onError() {
setIsLoading(false);
showError(R.string.fetch_events_failed);
}
@Override
public void onNetworkFailure(Throwable error) {
setIsLoading(false);
showError(R.string.offline_alert);
}
});
return true;
}
}