package pt.rupeal.invoicexpress.fragments;
import java.util.List;
import pt.rupeal.invoicexpress.R;
import pt.rupeal.invoicexpress.adapters.DocumentListRowAdapter;
import pt.rupeal.invoicexpress.adapters.FragmentPagerAdapter;
import pt.rupeal.invoicexpress.model.ContactModel;
import pt.rupeal.invoicexpress.model.DocumentModel;
import pt.rupeal.invoicexpress.model.DocumentsModel;
import pt.rupeal.invoicexpress.server.DocumentsRestHandler;
import pt.rupeal.invoicexpress.server.InvoiceXpress;
import pt.rupeal.invoicexpress.widgets.SearchView;
import android.app.Fragment;
import android.app.FragmentManager;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Vibrator;
import android.support.v4.view.PagerTitleStrip;
import android.support.v4.view.ViewPager;
import android.util.TypedValue;
import android.view.Gravity;
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.inputmethod.InputMethodManager;
import android.widget.AbsListView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.SearchView.OnQueryTextListener;
import android.widget.TextView;
public class DocumentsListFragment extends Fragment {
private ViewPager viewPager;
private DocumentsFragmentPagerAdapter documentsPagerAdapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View viewLayout = inflater.inflate(R.layout.documents_main, container, false);
viewPager = (ViewPager) viewLayout.findViewById(R.id.pager);
((PagerTitleStrip) viewPager.findViewById(R.id.pager_title_strip)).setTextColor(getResources().getColor(R.color.horizontal_navigation_bar_text));
((PagerTitleStrip) viewPager.findViewById(R.id.pager_title_strip)).setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);
((PagerTitleStrip) viewPager.findViewById(R.id.pager_title_strip)).setGravity(Gravity.CENTER_VERTICAL);
((PagerTitleStrip) viewPager.findViewById(R.id.pager_title_strip)).setPadding(-70, 0, -55, 0);
String docType = "";
String contactId = "";
if(getArguments() != null) {
docType = getArguments().getString(DocumentModel.DOC_TYPE, "");
contactId = getArguments().getString(ContactModel.ID, "");
}
documentsPagerAdapter = new DocumentsFragmentPagerAdapter(getFragmentManager(), docType, contactId);
// set adapter
new SetAdapterTask().execute();
// return view
return viewLayout;
}
private class SetAdapterTask extends AsyncTask<Void,Void,Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Void doInBackground(Void... params) {
return null;
}
@Override
protected void onPostExecute(Void result) {
viewPager.setAdapter(documentsPagerAdapter);
viewPager.setCurrentItem(1);
}
}
private final int[] documents_filters = new int[] {R.string.doc_filter_archived, R.string.doc_filter_all, R.string.doc_filter_expired};
public class DocumentsFragmentPagerAdapter extends FragmentPagerAdapter {
private String docType;
private String contactId;
public DocumentsFragmentPagerAdapter(FragmentManager fm, String docType, String contactId) {
super(fm);
this.docType = docType;
this.contactId = contactId;
}
@Override
public Fragment getItem(int position) {
// create new fragment
Fragment fragment = new DocumentFilterFragment();
// set filter argument
Bundle args = new Bundle();
args.putInt(DocumentFilterFragment.FILTER_CODE, position);
args.putString(DocumentModel.DOC_TYPE, docType);
args.putString(ContactModel.ID, contactId);
// set argumetns
fragment.setArguments(args);
// return fragment
return fragment;
}
@Override
public int getCount() {
return documents_filters.length;
}
@Override
public CharSequence getPageTitle(int position) {
return getResources().getString(documents_filters[position]);
}
}
public static class DocumentFilterFragment extends Fragment {
public static final String FILTER_CODE = "filter";
public static final int NO_FILTER = -1;
public static final int FILTER_CODE_ARCHIVED = 0;
public static final int FILTER_CODE_ALL = 1;
public static final int FILTER_CODE_OVER_DUE = 2;
private int filterCode;
private DocumentListRowAdapter adapter;
// private LinearLayout documentsMoreLayout;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// enable onCreateOptionsMenu
setHasOptionsMenu(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// get documents model
DocumentsModel documentsModel = getDocuments();
// check if there are no documents
if(documentsModel == null || documentsModel.getDocumentsSorted().isEmpty()) {
return inflater.inflate(R.layout.documents_list_empty, container, false);
}
// get sorted documents list
List<DocumentModel> documentsByFilterCode = documentsModel.getDocumentsSorted();
// inflate view to show documents list
View view = inflater.inflate(R.layout.documents_list, container, false);
ListView documentsListView = (ListView) view.findViewById(R.id.documents_list);
// add the upload more documents widget
LinearLayout documentsMoreLayout = (LinearLayout) inflater.inflate(R.layout.documents_more, documentsListView, false);
documentsMoreLayout.setLayoutParams(new AbsListView.LayoutParams(
AbsListView.LayoutParams.MATCH_PARENT, AbsListView.LayoutParams.WRAP_CONTENT));
int downloadedDocuments = documentsModel.getDownloadedDocuments();
((TextView) documentsMoreLayout.findViewById(R.id.documents_more_docs_downloaded)).setText(
downloadedDocuments + " " + getResources().getString(R.string.doc_more_downloaded));
int toUploadDocuments = documentsModel.getTotalDocuments() - downloadedDocuments;
((TextView) documentsMoreLayout.findViewById(R.id.documents_more_docs_to_upload)).setText(
toUploadDocuments + " " + getResources().getString(R.string.doc_more_to_upload));
documentsListView.addFooterView(documentsMoreLayout);
// get adapter
adapter = new DocumentListRowAdapter(getActivity(), documentsByFilterCode, documentsMoreLayout);
documentsListView.setAdapter(adapter);
if(toUploadDocuments > 0) {
documentsMoreLayout.setOnClickListener(new MoreButtonListener(documentsMoreLayout));
}
return view;
}
private DocumentsModel getDocuments() {
filterCode = getArguments().getInt(FILTER_CODE);
String docType = getArguments().getString(DocumentModel.DOC_TYPE, "");
String contactId = getArguments().getString(ContactModel.ID, "");
if(contactId.isEmpty()) {
return InvoiceXpress.getInstance().getDocuments(docType).getDocuments().get(filterCode);
} else {
return InvoiceXpress.getInstance().getContacts().get(contactId).getDocuments().getDocuments().get(filterCode);
}
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
// clear menu
menu.clear();
DocumentsModel documentsModel = getDocuments();
if(documentsModel != null) {
List<DocumentModel> documentsByFilterCode = documentsModel.getDocumentsSorted();
if(documentsByFilterCode != null && !documentsByFilterCode.isEmpty()) {
// update menu with refresh and search icons
inflater.inflate(R.menu.action_bar_documents_list, menu);
SearchView searchView = (SearchView) menu.findItem(R.id.search_tab).getActionView();
// set documents search listener
searchView.setOnQueryTextListener(new DocumentsSearch(searchView));
}
}
}
@Override
public void onOptionsMenuClosed(Menu menu) {
// clear menu if there are no documents
DocumentsModel documentsModel = getDocuments();
if(documentsModel != null) {
List<DocumentModel> documentsByFilterCode = documentsModel.getDocumentsSorted();
if(documentsByFilterCode == null || documentsByFilterCode.isEmpty()) {
menu.clear();
}
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.refresh_tab:
// get docType
String docType = getArguments().getString(DocumentModel.DOC_TYPE, "");
// get clientId
String clientId = getArguments().getString(ContactModel.ID, "");
// set parameters
String[] params = new String[]{docType, clientId,
String.valueOf(filterCode), ""};
// execute web service
DocumentsRestHandler resthandler = new DocumentsRestHandler(getActivity(), adapter);
InvoiceXpress.getInstance().setAsyncTaskActive(resthandler);
resthandler.execute(params);
break;
default:
break;
}
return super.onOptionsItemSelected(item);
}
private class MoreButtonListener implements View.OnClickListener {
private LinearLayout listViewFooter;
public MoreButtonListener(LinearLayout listViewFooter) {
this.listViewFooter = listViewFooter;
}
@Override
public void onClick(View v) {
// check if the progress bar is visible to disable clicks
if(!InvoiceXpress.isInvoiceXpressClickable(getActivity())) {
return;
}
// vibrate - time in milliseconds
((Vibrator) getActivity().getSystemService(Context.VIBRATOR_SERVICE)).vibrate(50);
// get docType
String docType = getArguments().getString(DocumentModel.DOC_TYPE, "");
// get clientId
String clientId = getArguments().getString(ContactModel.ID, "");
// get page wanted
int currentPage = InvoiceXpress.getInstance().getDocuments(docType).getDocuments().get(filterCode).getCurrentPage();
// set parameters
String[] params = new String[]{
docType,
clientId,
String.valueOf(filterCode),
String.valueOf(currentPage + 1)};
// execute web service
DocumentsRestHandler restHandler = new DocumentsRestHandler(getActivity(), adapter, listViewFooter);
InvoiceXpress.getInstance().setAsyncTaskActive(restHandler);
restHandler.execute(params);
}
}
private class DocumentsSearch implements OnQueryTextListener {
private SearchView searchView;
public DocumentsSearch(SearchView searchView) {
this.searchView = searchView;
}
@Override
public boolean onQueryTextChange(String newText) {
if(adapter != null) {
adapter.getFilter().filter(newText);
}
return true;
}
@Override
public boolean onQueryTextSubmit(String query) {
((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(searchView.getWindowToken(), 0);
return true;
}
};
}
}