package org.intermine.app.fragment;
/*
* Copyright (C) 2015 InterMine
*
* This code may be freely distributed and modified under the
* terms of the GNU Lesser General Public Licence. This should
* be distributed with the code. See the LICENSE file for more
* information or http://www.gnu.org/copyleft/lesser.html.
*
*/
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import android.widget.ProgressBar;
import com.octo.android.robospice.persistence.exception.SpiceException;
import com.octo.android.robospice.request.listener.RequestListener;
import org.intermine.app.R;
import org.intermine.app.activity.BaseActivity;
import org.intermine.app.activity.MainActivity;
import org.intermine.app.adapter.ApiPager;
import org.intermine.app.adapter.ListAdapter;
import org.intermine.app.controller.LoadOnScrollViewController;
import org.intermine.app.core.ListItems;
import org.intermine.app.listener.OnGeneSelectedListener;
import org.intermine.app.net.ResponseHelper;
import org.intermine.app.net.request.get.GetTypeFieldsRequest;
import org.intermine.app.net.request.post.FetchListResultsRequest;
import org.intermine.app.util.Collections;
import org.intermine.app.util.Strs;
import org.intermine.app.util.Views;
import java.util.List;
import java.util.Map;
import butterknife.InjectView;
public class GenesListFragment extends BaseFragment {
public static final String LIST_KEY = "list_key";
public static final String MINE_NAME_KEY = "mine_name_key";
public static final int ITEMS_PER_PAGE = 15;
@InjectView(R.id.list)
protected ListView mListView;
@InjectView(R.id.not_found_results_container)
protected View mNotFoundView;
@InjectView(R.id.progress_view)
protected ProgressBar mProgressView;
private ListAdapter mListAdapter;
protected LoadOnScrollViewController mViewController;
private LoadOnScrollViewController.LoadOnScrollDataController mDataController;
private ApiPager mPager;
private OnGeneSelectedListener mListener;
private org.intermine.app.core.List mList;
private String mMineName;
protected boolean mLoading;
public static GenesListFragment newInstance(org.intermine.app.core.List list, String mineName) {
GenesListFragment fragment = new GenesListFragment();
Bundle bundle = new Bundle();
bundle.putParcelable(LIST_KEY, list);
bundle.putString(MINE_NAME_KEY, mineName);
fragment.setArguments(bundle);
return fragment;
}
// --------------------------------------------------------------------------------------------
// Inner Classes
// --------------------------------------------------------------------------------------------
private class TypeFieldsListener implements RequestListener<GetTypeFieldsRequest.TypeFields> {
@Override
public void onRequestFailure(SpiceException spiceException) {
setProgress(false);
mViewController.onFinishLoad();
Views.setVisible(mNotFoundView);
Views.setGone(mListView);
ResponseHelper.handleSpiceException(spiceException, (BaseActivity) getActivity(), mMineName);
}
@Override
public void onRequestSuccess(GetTypeFieldsRequest.TypeFields result) {
if (null != result && !result.isEmpty()) {
performGetListResultsRequest();
} else {
setProgress(false);
mViewController.onFinishLoad();
Views.setVisible(mNotFoundView);
}
}
}
private class ListResultsListener implements RequestListener<ListItems> {
@Override
public void onRequestFailure(SpiceException spiceException) {
setProgress(false);
mViewController.onFinishLoad();
Views.setVisible(mNotFoundView);
Views.setGone(mListView);
ResponseHelper.handleSpiceException(spiceException, (BaseActivity) getActivity(),
mMineName);
}
@Override
public void onRequestSuccess(ListItems result) {
setProgress(false);
mViewController.onFinishLoad();
if (null != result && !Collections.isNullOrEmpty(result.getFeatures())) {
mListAdapter.addListItems(result);
} else {
Views.setVisible(mNotFoundView);
}
}
}
// --------------------------------------------------------------------------------------------
// Lifecycle
// --------------------------------------------------------------------------------------------
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.genes_list_fragment, container, false);
}
@Override
public void onAttach(Context ctx) {
super.onAttach(ctx);
mListener = (OnGeneSelectedListener) ctx;
if (ctx instanceof MainActivity) {
((MainActivity) ctx).onSectionAttached(getString(R.string.favorites));
}
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
Bundle bundle = getArguments();
if (null != bundle) {
mMineName = bundle.getString(MINE_NAME_KEY);
mList = bundle.getParcelable(LIST_KEY);
}
mListAdapter = new ListAdapter(getActivity());
mListView.setAdapter(mListAdapter);
mViewController = new LoadOnScrollViewController(getDataController(), getActivity());
mListView.setOnScrollListener(mViewController);
mListView.addFooterView(mViewController.getFooterView());
if (null != mList && !Strs.isNullOrEmpty(mMineName)) {
setProgress(true);
if (null == mPager) {
mPager = new ApiPager(mList.getSize(), 0, ITEMS_PER_PAGE);
}
Map<String, List<String>> typeFields = getStorage().getTypeFields(mMineName);
if (null == typeFields || typeFields.isEmpty()) {
GetTypeFieldsRequest request = new GetTypeFieldsRequest(getActivity(), mMineName);
execute(request, new TypeFieldsListener());
} else {
performGetListResultsRequest();
}
} else {
setProgress(false);
mViewController.onFinishLoad();
Views.setVisible(mNotFoundView);
}
}
// --------------------------------------------------------------------------------------------
// Helper Methods
// --------------------------------------------------------------------------------------------
protected LoadOnScrollViewController.LoadOnScrollDataController getDataController() {
if (null == mDataController) {
mDataController = generateDataController();
}
return mDataController;
}
protected LoadOnScrollViewController.LoadOnScrollDataController generateDataController() {
return new LoadOnScrollViewController.LoadOnScrollDataController() {
@Override
public boolean hasMore() {
return mPager == null || mPager.hasMorePages();
}
@Override
public boolean isLoading() {
return mLoading;
}
@Override
public void loadMore() {
mPager = mPager.next();
performGetListResultsRequest();
mViewController.onStartLoad();
mLoading = true;
}
};
}
protected void performGetListResultsRequest() {
FetchListResultsRequest request = new FetchListResultsRequest(getActivity(), mMineName, mList.getType(),
mList.getName(), mPager.getCurrentPage() * mPager.getPerPage(), mPager.getPerPage());
execute(request, new ListResultsListener());
}
protected void setProgress(boolean loading) {
mLoading = loading;
if (loading) {
Views.setVisible(mProgressView);
Views.setGone(mListView, mNotFoundView);
} else {
Views.setVisible(mListView);
Views.setGone(mProgressView);
}
}
}