/**
* Copyright (C) 2013 Romain Guefveneu.
*
* This file is part of naonedbus.
*
* Naonedbus is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Naonedbus is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package net.naonedbus.fragment;
import java.io.IOException;
import net.naonedbus.R;
import net.naonedbus.bean.async.AsyncResult;
import org.json.JSONException;
import android.os.Bundle;
import android.support.v4.content.AsyncTaskLoader;
import android.support.v4.content.Loader;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ListAdapter;
import android.widget.ListView;
import de.keyboardsurfer.android.widget.crouton.Crouton;
import de.keyboardsurfer.android.widget.crouton.Style;
public abstract class CustomInfiniteListFragement extends CustomListFragment {
private Crouton mLastCrouton;
private boolean mHasError = false;
private View mLoaderView;
public CustomInfiniteListFragement(final int layoutId) {
super(layoutId);
}
@Override
public void onActivityCreated(final Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
final ListView listView = getListView();
mLoaderView = LayoutInflater.from(getActivity()).inflate(R.layout.list_item_loader, null);
mLoaderView.setEnabled(false);
mLoaderView.setClickable(false);
mLoaderView.setFocusable(false);
mLoaderView.setFocusableInTouchMode(false);
addOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(final AbsListView view, final int scrollState) {
}
@Override
public void onScroll(final AbsListView view, final int firstVisibleItem, final int visibleItemCount,
final int totalItemCount) {
final int lastInScreen = firstVisibleItem + visibleItemCount;
if ((lastInScreen == totalItemCount) && listView.getAdapter() != null && !mHasError) {
onLoadMoreItems();
} else if (lastInScreen < totalItemCount) {
mHasError = false;
mLoaderView.setVisibility(View.VISIBLE);
}
}
});
listView.addFooterView(mLoaderView);
}
protected abstract void onLoadMoreItems();
@Override
public Loader<AsyncResult<ListAdapter>> onCreateLoader(final int arg0, final Bundle bundle) {
final Loader<AsyncResult<ListAdapter>> loader = new AsyncTaskLoader<AsyncResult<ListAdapter>>(getActivity()) {
@Override
public AsyncResult<ListAdapter> loadInBackground() {
return loadContent(getActivity(), bundle);
}
};
if (getListAdapter() == null || getListAdapter().getCount() == 0)
showLoader();
loader.forceLoad();
return loader;
}
@Override
public void onLoadFinished(final Loader<AsyncResult<ListAdapter>> loader, final AsyncResult<ListAdapter> result) {
if (result == null) {
showMessage(mMessageEmptyTitleId, mMessageEmptySummaryId, mMessageEmptyDrawableId);
return;
}
final Exception exception = result.getException();
if (exception == null) {
if (result.getResult() == null || result.getResult().getCount() == 0) {
showMessage(mMessageEmptyTitleId, mMessageEmptySummaryId, mMessageEmptyDrawableId);
} else {
if (getListAdapter() == null) {
setListAdapter(result.getResult());
showContent();
}
resetNextUpdate();
}
} else {
Log.e(getClass().getSimpleName(), "Erreur de chargement.", exception);
int titleRes = R.string.error_title;
int messageRes = R.string.error_summary;
int drawableRes = R.drawable.warning;
// Erreur réseau ou interne ?
if (exception instanceof IOException) {
titleRes = R.string.error_title_network;
messageRes = R.string.error_summary_network;
drawableRes = R.drawable.ic_thunderstorm;
} else if (exception instanceof JSONException) {
titleRes = R.string.error_title_webservice;
messageRes = R.string.error_summary_webservice;
}
if (getListAdapter() == null || getListAdapter().isEmpty()) {
showMessage(titleRes, messageRes, drawableRes);
} else {
if (mLastCrouton != null) {
mLastCrouton.cancel();
}
mLastCrouton = Crouton.makeText(getActivity(), titleRes, Style.ALERT, (ViewGroup) getView());
mLastCrouton.show();
}
mHasError = true;
mLoaderView.setVisibility(View.GONE);
}
onPostExecute();
}
}