package com.gh4a.loader;
import java.util.ArrayList;
import java.util.Collection;
import org.eclipse.egit.github.core.client.NoSuchPageException;
import org.eclipse.egit.github.core.client.PageIterator;
import android.content.Context;
import android.support.v4.content.AsyncTaskLoader;
import android.util.Log;
import com.gh4a.Gh4Application;
public class PageIteratorLoader<T> extends AsyncTaskLoader<LoaderResult<PageIteratorLoader<T>.LoadedPage>> {
private final PageIterator<T> mPageIterator;
private ArrayList<T> mPreviouslyLoadedData;
public class LoadedPage {
public final Collection<T> results;
public final boolean hasMoreData;
private LoadedPage(Collection<T> r, boolean hmd) {
results = r;
hasMoreData = hmd;
}
}
public PageIteratorLoader(Context context, PageIterator<T> pageIterator) {
super(context);
mPageIterator = pageIterator;
mPreviouslyLoadedData = new ArrayList<>();
onContentChanged();
}
@Override
public void onContentChanged() {
super.onContentChanged();
mPageIterator.reset();
mPreviouslyLoadedData.clear();
}
@Override
protected void onReset() {
super.onReset();
mPageIterator.reset();
mPreviouslyLoadedData.clear();
}
@Override
public LoaderResult<LoadedPage> loadInBackground() {
if (mPageIterator.hasNext()) {
try {
Collection<T> newData = mPageIterator.next();
mPreviouslyLoadedData = new ArrayList<>(mPreviouslyLoadedData);
mPreviouslyLoadedData.addAll(newData);
} catch (NoSuchPageException e) {
// should only happen in case of an empty repo
return new LoaderResult<>(new LoadedPage(mPreviouslyLoadedData, false));
} catch (Exception e) {
Log.e(Gh4Application.LOG_TAG, e.getMessage(), e);
return new LoaderResult<>(e);
}
}
return new LoaderResult<>(new LoadedPage(mPreviouslyLoadedData, mPageIterator.hasNext()));
}
@Override
protected void onStartLoading() {
if (takeContentChanged()) {
forceLoad();
}
}
@Override
protected void onStopLoading() {
cancelLoad();
}
}