org.intermine.app.fragment.TemplatesFragment.java Source code

Java tutorial

Introduction

Here is the source code for org.intermine.app.fragment.TemplatesFragment.java

Source

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());
            }
        }
    }
}