package org.intermine.app.activity;
/*
* 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.content.Intent;
import android.os.Bundle;
import android.support.v4.app.NavUtils;
import android.support.v4.view.MenuItemCompat;
import android.support.v7.widget.SearchView;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
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.adapter.ApiPager;
import org.intermine.app.adapter.ListAdapter;
import org.intermine.app.controller.LoadOnScrollViewController;
import org.intermine.app.core.List;
import org.intermine.app.core.ListItems;
import org.intermine.app.core.templates.TemplateParameter;
import org.intermine.app.net.ResponseHelper;
import org.intermine.app.net.request.get.GetTemplateResultsRequest;
import org.intermine.app.util.Collections;
import org.intermine.app.util.Strs;
import org.intermine.app.util.Templates;
import org.intermine.app.util.Uris;
import org.intermine.app.util.Views;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import butterknife.ButterKnife;
import butterknife.InjectView;
/**
* @author Daria Komkova <Daria_Komkova @ hotmail.com>
*/
public class TemplateResultsActivity extends BaseActivity implements SearchView.OnQueryTextListener,
MenuItemCompat.OnActionExpandListener {
public static final int ITEMS_PER_PAGE = 15;
public static final String NAME_PARAM = "name";
public static final String METHOD_PARAM = "method";
public static final String METHOD_PARAM_DEFAULT_VALUE = "results";
public static final String TEMPLATE_NAME_KEY = "template_name_key";
public static final String TEMPLATE_TITLE_KEY = "template_title_key";
public static final String MINE_NAME_KEY = "mine_name_key";
public static final String TEMPLATE_PARAMS_KEY = "template_params_key";
protected LoadOnScrollViewController mViewController;
protected boolean mLoading;
@InjectView(R.id.list)
ListView mListView;
@InjectView(R.id.progress_view)
ProgressBar mProgressBar;
@InjectView(R.id.not_found_results_container)
View mNotFoundView;
private SearchView mSearchView;
private ListAdapter mListAdapter;
private LoadOnScrollViewController.LoadOnScrollDataController mDataController;
private ApiPager mPager;
private String mTemplateName;
private String mTemplateTitle;
private ArrayList<TemplateParameter> mTemplateParams;
private String mMineName;
private String mQuery = Strs.EMPTY_STRING;
// --------------------------------------------------------------------------------------------
// Inner Classes
// --------------------------------------------------------------------------------------------
public class TemplateResultsListener implements RequestListener<ListItems> {
@Override
public void onRequestFailure(SpiceException spiceException) {
setProgress(false);
mViewController.onFinishLoad();
Views.setVisible(mNotFoundView);
ResponseHelper.handleSpiceException(spiceException, TemplateResultsActivity.this,
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);
}
}
}
public class TemplateResultsCountListener implements RequestListener<Integer> {
@Override
public void onRequestFailure(SpiceException spiceException) {
setProgress(false);
mViewController.onFinishLoad();
Views.setVisible(mNotFoundView);
ResponseHelper.handleSpiceException(spiceException, TemplateResultsActivity.this,
mMineName);
}
@Override
public void onRequestSuccess(Integer count) {
mPager = new ApiPager(count, 0, ITEMS_PER_PAGE);
fetchTemplateResults();
}
}
// --------------------------------------------------------------------------------------------
// Static Methods
// --------------------------------------------------------------------------------------------
public static void start(Context context, String templateName, String templateTitle,
String mineName, ArrayList<TemplateParameter> params) {
Intent intent = new Intent(context, TemplateResultsActivity.class);
intent.putExtra(TEMPLATE_NAME_KEY, templateName);
intent.putExtra(TEMPLATE_TITLE_KEY, templateTitle);
intent.putExtra(MINE_NAME_KEY, mineName);
intent.putParcelableArrayListExtra(TEMPLATE_PARAMS_KEY, params);
context.startActivity(intent);
}
// --------------------------------------------------------------------------------------------
// Inner Classes
// --------------------------------------------------------------------------------------------
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.template_results_activity);
ButterKnife.inject(this);
Toolbar toolbar = (Toolbar) findViewById(R.id.default_toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
mTemplateName = getIntent().getStringExtra(TEMPLATE_NAME_KEY);
mTemplateTitle = getIntent().getStringExtra(TEMPLATE_TITLE_KEY);
mMineName = getIntent().getStringExtra(MINE_NAME_KEY);
mTemplateParams = getIntent().getParcelableArrayListExtra(TEMPLATE_PARAMS_KEY);
mListAdapter = new ListAdapter(this);
mListView.setAdapter(mListAdapter);
mViewController = new LoadOnScrollViewController(getDataController(), this);
mListView.setOnScrollListener(mViewController);
mListView.addFooterView(mViewController.getFooterView());
if (null != mTemplateTitle) {
setTitle(mTemplateTitle);
setProgress(true);
fetchTemplateResultsCount();
}
}
// --------------------------------------------------------------------------------------------
// Callbacks
// --------------------------------------------------------------------------------------------
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.templates_results_menu, menu);
MenuItem menuItem = menu.findItem(R.id.templates_results_search_action);
MenuItemCompat.setOnActionExpandListener(menuItem, this);
mSearchView = (SearchView) menuItem.getActionView();
mSearchView.setOnQueryTextListener(this);
mSearchView.setQueryHint(getString(R.string.template_search_hint));
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.open_in_browser:
String webTemplatesUrl = generateListAnalysisUrl(mMineName);
if (!Strs.isNullOrEmpty(webTemplatesUrl)) {
WebActivity.start(this, mTemplateTitle, webTemplatesUrl);
}
return true;
case android.R.id.home:
NavUtils.navigateUpFromSameTask(this);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@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();
}
mListAdapter.filter(Strs.EMPTY_STRING);
Views.setVisible(mListView);
Views.setGone(mNotFoundView);
return true;
}
@Override
public boolean onQueryTextChange(String query) {
mQuery = query;
if (!Strs.isNullOrEmpty(mQuery)) {
mListAdapter.filter(query);
if (mListAdapter.isFilteredResultsEmpty()) {
Views.setVisible(mNotFoundView);
Views.setGone(mListView);
} else {
Views.setVisible(mListView);
Views.setGone(mNotFoundView);
}
}
return true;
}
// --------------------------------------------------------------------------------------------
// Fragment Lifecycle
// --------------------------------------------------------------------------------------------
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();
fetchTemplateResults();
mViewController.onStartLoad();
mLoading = true;
}
};
}
protected LoadOnScrollViewController.LoadOnScrollDataController getDataController() {
if (null == mDataController) {
mDataController = generateDataController();
}
return mDataController;
}
// --------------------------------------------------------------------------------------------
// Helper Methods
// --------------------------------------------------------------------------------------------
protected void fetchTemplateResults() {
GetTemplateResultsRequest request = new GetTemplateResultsRequest(ListItems.class, this,
mTemplateName, mTemplateParams, mMineName,
mPager.getCurrentPage() * mPager.getPerPage(), ITEMS_PER_PAGE);
execute(request, new TemplateResultsListener());
}
protected void fetchTemplateResultsCount() {
GetTemplateResultsRequest request = new GetTemplateResultsRequest(Integer.class, this,
mTemplateName, mTemplateParams, mMineName, 0, ITEMS_PER_PAGE);
execute(request, new TemplateResultsCountListener());
}
protected void setProgress(boolean loading) {
mLoading = loading;
if (loading) {
Views.setVisible(mProgressBar);
Views.setGone(mListView, mNotFoundView);
} else {
Views.setVisible(mListView);
Views.setGone(mProgressBar);
}
}
private String generateListAnalysisUrl(String mineName) {
String webAppUrl = mStorage.getMineWebAppUrl(mineName);
if (!Strs.isNullOrEmpty(webAppUrl)) {
Map<String, String> params = Templates.generateUrlParams(mTemplateParams);
params.put(NAME_PARAM, mTemplateName);
params.put(METHOD_PARAM, METHOD_PARAM_DEFAULT_VALUE);
return Uris.expandQuery(webAppUrl + getString(R.string.web_template_results_path), params);
}
return Strs.EMPTY_STRING;
}
}