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.app.Activity;
import android.os.Bundle;
import android.support.v4.view.MenuItemCompat;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.SearchView;
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.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.TemplatesAdapter;
import org.intermine.app.core.templates.Template;
import org.intermine.app.net.ResponseHelper;
import org.intermine.app.net.request.get.GetTemplatesRequest;
import org.intermine.app.net.request.get.GetTemplatesRequest.Templates;
import org.intermine.app.util.Collections;
import org.intermine.app.util.Strs;
import org.intermine.app.util.Views;
import butterknife.InjectView;
public class TemplatesFragment extends BaseFragment implements SearchView.OnQueryTextListener,
MenuItemCompat.OnActionExpandListener, TemplatesAdapter.OnItemClickListener {
public static final String MINE_NAME_KEY = "mine_name";
public static final long TEMPLATES_CACHE_EXPIRY_DURATION = 1000 * 60 * 10;
@InjectView(R.id.templates)
RecyclerView mTemplates;
@InjectView(R.id.not_found_results_container)
View mNotFoundView;
@InjectView(R.id.progress_view)
ProgressBar mProgressView;
private SearchView mSearchView;
private TemplatesAdapter mTemplatesAdapter;
private OnTemplateSelectedListener mOnTemplateSelectedListener;
private String mMineName;
private String mQuery = Strs.EMPTY_STRING;
// --------------------------------------------------------------------------------------------
// Static Methods
// --------------------------------------------------------------------------------------------
public static TemplatesFragment newInstance(String mineName) {
TemplatesFragment fragment = new TemplatesFragment();
Bundle bundle = new Bundle();
bundle.putString(MINE_NAME_KEY, mineName);
fragment.setArguments(bundle);
return fragment;
}
// --------------------------------------------------------------------------------------------
// Inner Classes
// --------------------------------------------------------------------------------------------
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.templates_fragment, container, false);
}
// --------------------------------------------------------------------------------------------
// Fragment Lifecycle
// --------------------------------------------------------------------------------------------
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
LinearLayoutManager manager = new LinearLayoutManager(getActivity());
manager.setOrientation(LinearLayoutManager.VERTICAL);
mTemplates.setLayoutManager(manager);
mTemplates.scheduleLayoutAnimation();
mTemplatesAdapter = new TemplatesAdapter(this);
mTemplates.setAdapter(mTemplatesAdapter);
setProgress(true);
fetchTemplates();
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
mOnTemplateSelectedListener = (OnTemplateSelectedListener) activity;
Bundle bundle = getArguments();
if (null != bundle) {
mMineName = bundle.getString(MINE_NAME_KEY);
}
String title = mMineName + " " + getString(R.string.templates);
((MainActivity) activity).onSectionAttached(title);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.templates_menu, menu);
MenuItem menuItem = menu.findItem(R.id.search_action);
MenuItemCompat.setOnActionExpandListener(menuItem, this);
mSearchView = (SearchView) menuItem.getActionView();
mSearchView.setOnQueryTextListener(this);
mSearchView.setQueryHint(getString(R.string.template_search_hint));
}
@Override
public void onDestroyOptionsMenu() {
super.onDestroyOptionsMenu();
mSearchView = null;
}
// --------------------------------------------------------------------------------------------
// Callbacks
// --------------------------------------------------------------------------------------------
@Override
public boolean onQueryTextSubmit(String query) {
if (null != mSearchView) {
mSearchView.clearFocus();
}
return true;
}
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
return true;
}
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
if (null != mSearchView) {
mSearchView.clearFocus();
}
mTemplatesAdapter.filter(Strs.EMPTY_STRING);
Views.setVisible(mTemplates);
Views.setGone(mNotFoundView);
return true;
}
@Override
public boolean onQueryTextChange(String query) {
mQuery = query;
if (!Strs.isNullOrEmpty(mQuery) && null != mTemplatesAdapter) {
mTemplatesAdapter.filter(query);
if (Collections.isNullOrEmpty(mTemplatesAdapter.getFilteredTemplates())) {
Views.setVisible(mNotFoundView);
Views.setGone(mTemplates);
} else {
Views.setVisible(mTemplates);
Views.setGone(mNotFoundView);
}
}
return true;
}
@Override
public void onItemClick(Template template) {
mOnTemplateSelectedListener.onTemplateSelected(template, mMineName);
}
protected void fetchTemplates() {
GetTemplatesRequest request = new GetTemplatesRequest(getActivity(), mMineName);
execute(request, mMineName, TEMPLATES_CACHE_EXPIRY_DURATION, new GetTemplatesListener());
}
protected void setProgress(boolean loading) {
if (loading) {
Views.setVisible(mProgressView);
Views.setGone(mTemplates, mNotFoundView);
} else {
Views.setVisible(mTemplates);
Views.setGone(mProgressView);
}
}
// --------------------------------------------------------------------------------------------
// Helper Methods
// --------------------------------------------------------------------------------------------
public static interface OnTemplateSelectedListener {
void onTemplateSelected(Template template, String mineName);
}
public class GetTemplatesListener implements RequestListener<Templates> {
@Override
public void onRequestFailure(SpiceException ex) {
setProgress(false);
ResponseHelper.handleSpiceException(ex, (BaseActivity) getActivity(), mMineName);
}
@Override
public void onRequestSuccess(Templates result) {
setProgress(false);
if (result == null || result.isEmpty()) {
Views.setVisible(mNotFoundView);
Views.setGone(mTemplates);
} else {
Views.setVisible(mTemplates);
Views.setGone(mNotFoundView);
mTemplatesAdapter.updateData(result.values());
}
}
}
}