package com.campus.prime.ui;
import java.util.Collections;
import java.util.List;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.Loader;
import android.text.format.DateUtils;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AnimationUtils;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AbsListView;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import com.campus.prime.R;
import com.campus.prime.core.MessageItem;
import com.campus.prime.utils.ViewUtils;
import com.handmark.pulltorefresh.library.PullToRefreshBase;
import com.handmark.pulltorefresh.library.PullToRefreshBase.Mode;
import com.handmark.pulltorefresh.library.PullToRefreshBase.OnRefreshListener;
import com.handmark.pulltorefresh.library.PullToRefreshListView;
public abstract class ItemListFragment<E> extends Fragment implements
LoaderCallbacks<List<E>>{
/**
* Force refersh
*/
public static final String FORCE_REFRESH = "force_refresh";
public static final int FORCE = 1;
protected SingleTypeAdapter<E> adapter;
/**
* ListView items
*/
protected List<E> items = Collections.emptyList();
/**
* ListView
*/
protected PullToRefreshListView listView;
/**
* Empty TextView
*/
protected TextView emptyView;
/**
* ProgressBar
*/
protected ProgressBar progressBar;
/**
* Is the list currently shown
*/
protected boolean listShown;
public PullToRefreshListView getListView(){
return this.listView;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
if(items != null && (!items.isEmpty()))
setListShown(true,false);
}
@Override
public void onStart() {
// TODO Auto-generated method stub
super.onStart();
getLoaderManager().initLoader(0, null, this);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
return inflater.inflate(R.layout.item_list,null);
}
@Override
public void onDestroyView() {
// TODO Auto-generated method stub
listShown = false;
emptyView = null;
progressBar = null;
listView = null;
super.onDestroyView();
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onViewCreated(view, savedInstanceState);
listView = (PullToRefreshListView)view.findViewById(R.id.list);
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
// TODO Auto-generated method stub
onListItemClick((ListView)arg0,arg1,arg2,arg3);
}
});
ListView actualListView = listView.getRefreshableView();
registerForContextMenu(actualListView);
this.adapter = createAdapter();
actualListView.setAdapter(adapter);
actualListView.setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
// TODO Auto-generated method stub
return onListItemLongClick((ListView)arg0,arg1,arg2,arg3);
}
});
progressBar = (ProgressBar)view.findViewById(R.id.pb_loading);
emptyView = (TextView)view.findViewById(R.id.empty);
}
/**
* is fragment usable in UI-Thread
* @return
*/
protected boolean isUsable(){
return getActivity() != null;
}
/**
* configure listView
*/
protected void configureList(){
this.adapter = createAdapter();
listView.setAdapter(adapter);
}
/**
* create adapter for listView
* @return
*/
protected SingleTypeAdapter<E> createAdapter(){
SingleTypeAdapter<E> wrapped = createAdapter(items);
return wrapped;
}
protected abstract SingleTypeAdapter<E> createAdapter(final List<E> items);
/**
* force to refresh
*/
protected void forceRefresh(){
Bundle bundle = new Bundle();
bundle.putInt(FORCE_REFRESH,FORCE);
refresh(bundle);
}
public void refresh(){
refresh(null);
}
protected void refresh(final Bundle args){
getActivity().setProgressBarIndeterminateVisibility(true);
getLoaderManager().restartLoader(0, args, this);
}
/**
* set listView show
* @param shown
* @param animate
* @return
*/
public ItemListFragment<E> setListShown(final boolean shown,
final boolean animate){
if(shown == listShown){
if(shown){
if(items != null && (!items.isEmpty()))
hide(emptyView).show(listView);
else
hide(listView).show(emptyView);
}
return this;
}
listShown = shown;
if(shown){
if((items != null) && (!items.isEmpty()))
hide(progressBar).hide(emptyView).fadeIn(listView,animate)
.show(listView);
else
hide(progressBar).hide(listView).fadeIn(emptyView,animate)
.show(emptyView);
}else{
hide(listView).hide(emptyView).fadeIn(progressBar,animate)
.show(progressBar);
}
return this;
}
private ItemListFragment<E> show(final View view){
ViewUtils.setGone(view,false);
return this;
}
private ItemListFragment<E> hide(final View view){
ViewUtils.setGone(view,true);
return this;
}
private ItemListFragment<E> fadeIn(final View view,final boolean animate){
if(view != null){
if(animate)
view.startAnimation(AnimationUtils.loadAnimation(getActivity(),
android.R.anim.fade_in));
else
view.clearAnimation();
}
return this;
}
protected void showList(){
setListShown(true,isResumed());
}
@Override
public void onLoaderReset(Loader<List<E>> arg0) {
// TODO Auto-generated method stub
getListAdapter().setItems(Collections.emptyList());
}
@SuppressWarnings("unchecked")
protected SingleTypeAdapter<E> getListAdapter(){
return adapter;
}
protected ItemListFragment<E> notifyDataSetChanged(){
SingleTypeAdapter<E> root = getListAdapter();
if(root != null){
root.notifyDataSetChanged();
}
return this;
}
/**
* Set list adapter to use on list view
*
* @param adapter
* @return this fragment
*/
protected ItemListFragment<E> setListAdapter(final ListAdapter adapter) {
if (listView != null)
listView.setAdapter(adapter);
return this;
}
protected ItemListFragment<E> setEmptyText(final String message){
if(emptyView != null)
emptyView.setText(message);
return this;
}
@Override
public void onLoadFinished(Loader<List<E>> arg0, List<E> arg1) {
// TODO Auto-generated method stub
getActivity().setProgressBarIndeterminateVisibility(false);
}
/**
* Callback when a list view item is clicked
*
* @param l
* @param v
* @param position
* @param id
*/
public void onListItemClick(ListView l, View v, int position, long id) {
}
/**
* Callback when a list view item is clicked and held
*
* @param l
* @param v
* @param position
* @param id
* @return true if the callback consumed the long click, false otherwise
*/
public boolean onListItemLongClick(ListView l, View v, int position, long id) {
return false;
}
}