package eu.ttbox.androgister.ui.product;
import android.app.Fragment;
import android.app.LoaderManager;
import android.content.Context;
import android.content.CursorLoader;
import android.content.Loader;
import android.database.Cursor;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;
import eu.ttbox.androgister.AndroGisterApplication;
import eu.ttbox.androgister.R;
import eu.ttbox.androgister.core.Intents;
import eu.ttbox.androgister.domain.provider.ProductProvider;
import eu.ttbox.androgister.domain.ProductDao;
import eu.ttbox.androgister.domain.ProductDao.ProductCursorHelper;
import eu.ttbox.androgister.domain.ProductDao.Properties;
import eu.ttbox.androgister.domain.Tag;
import eu.ttbox.androgister.domain.TagDao;
import eu.ttbox.androgister.domain.provider.TagProvider;
/**
* TODO {link
* http://blogingtutorials.blogspot.fr/2010/11/android-listview-header
* -two-or-more-in.html}
*
* @author jmorille
*
*/
public class ProductSelectorFragment extends Fragment {
private static final String TAG = "ProductSelectorFragment";
private static final Long UNSET_ID = Long.valueOf(-1);
private static final int TAG_LIST_LOADER = R.id.config_id_tag_list_loader_started;
private static final int OFFER_LIST_LOADER = R.id.config_id_offer_list_loader_started;
// Constante
private static final String[] TAG_PROJECTION_COLOMN = new String[] { TagDao.Properties.Id.columnName, TagDao.Properties.Name.columnName };
private static final String TAG_SORT_DEFAULT = String.format("%s ASC", TagDao.Properties.Name.columnName);
// private static final String[] SEARCH_PROJECTION_COLOMN = new String[] { OfferColumns.KEY_ID, OfferColumns.KEY_NAME, OfferColumns.KEY_PRICEHT, OfferColumns.KEY_TAG };
private static final String[] SEARCH_PROJECTION_COLOMN = new String[] { Properties.Id.columnName, Properties.Name.columnName,
Properties.PriceHT.columnName, Properties.TagId.columnName };
private static final String SEARCH_SELECTION_TAG = String.format("%s = ?", Properties.TagId.columnName);
private static final String OFFER_SORT_DEFAULT = String.format("%s ASC, %s ASC",Properties.TagId.columnName, Properties.Id.columnName);
// Mock Value
// private static final String SEARCH_SELECTION_TAG_NO_VALUE = "Tous";
// private String[] filterValues = new String[] {
// SEARCH_SELECTION_TAG_NO_VALUE, "Entrée", "Plat", "Dessert", "Boisson" };
// Search Filter Value
private String filterTagId = null;
// Binding Values
private GridView gridView;
private ListView filterListView;
// Helper
private ProductDao productDao;
private ProductCursorHelper productHelper;
private ProductItemAdapter listAdapter;
private TagItemAdapter tagListAdapter;
// Registered Listeenr
private OnOfferSelectedListener onOfferSelectedListener;
// Listener
private final AdapterView.OnItemClickListener mOnClickListener = new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
onListItemClick((GridView) parent, v, position, id);
}
};
private final AdapterView.OnItemClickListener mOnFilterClickListener = new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
onFilterItemClick((ListView) parent, v, position, id);
}
};
// ===========================================================
// Constructors
// ===========================================================
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Dao
Context context = getActivity();
AndroGisterApplication app = (AndroGisterApplication) context.getApplicationContext();
productDao = app.getDaoSession().getProductDao();
productHelper =productDao.getCursorHelper(null);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.product_selector, container, false);
// Link search
gridView = (GridView) view.findViewById(R.id.product_selector_gridview);
gridView.setOnItemClickListener(mOnClickListener);
// Filter By Tag
Context context = getActivity();
filterListView = (ListView) view.findViewById(R.id.product_selector_filterList);
// Tag Header
View listViewHeader = inflater.inflate(R.layout.admin_calatog_list_item, container, false);
String allLabel = getString(R.string.all);
Tag headerData = new Tag();
headerData.setId(UNSET_ID);
headerData.setName(allLabel);
((TextView) listViewHeader).setText(allLabel);
filterListView.addHeaderView(listViewHeader, headerData, true);
// Tag
filterListView.setOnItemClickListener(mOnFilterClickListener);
tagListAdapter = new TagItemAdapter(context, null);
filterListView.setAdapter(tagListAdapter);
// List Adapter
listAdapter = new ProductItemAdapter(context, R.layout.admin_product_list_item, null, SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
gridView.setAdapter(listAdapter);
// Init Search
getLoaderManager().initLoader(TAG_LIST_LOADER, null, tagLoaderCallback);
getLoaderManager().initLoader(OFFER_LIST_LOADER, null, offerLoaderCallback);
return view;
}
// ===========================================================
// Actions
// ===========================================================
private void onFilterItemClick(ListView l, View v, int position, long id) {
long itemId = l.getAdapter().getItemId(position);
if (UNSET_ID.longValue() == itemId) {
filterTagId = null;
} else {
filterTagId = String.valueOf(itemId);
}
getLoaderManager().restartLoader(OFFER_LIST_LOADER, null, offerLoaderCallback);
// ((Filterable)gridView.getAdapter()).getFilter().filter(filterName);
}
public void onListItemClick(GridView l, View v, int position, long id) {
Cursor item = (Cursor) l.getAdapter().getItem(position);
Bundle offer = productHelper.readBundleValues(item);
if (onOfferSelectedListener != null) {
onOfferSelectedListener.onOfferSelected(offer);
} else {
getActivity().sendBroadcast(Intents.addToBasket(offer));
}
}
public void setOnOfferSelectedListener(OnOfferSelectedListener listener) {
this.onOfferSelectedListener = listener;
}
public static interface OnOfferSelectedListener {
public void onOfferSelected(Bundle offer);
}
// ===========================================================
// Cursor Loader
// ===========================================================
private final LoaderManager.LoaderCallbacks<Cursor> offerLoaderCallback = new LoaderManager.LoaderCallbacks<Cursor>() {
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
String sortOrder = OFFER_SORT_DEFAULT;
String selection = null;
String[] selectionArgs = null;
if (filterTagId != null) {
selection = SEARCH_SELECTION_TAG;
selectionArgs = new String[] { filterTagId };
}
Log.d(TAG, "Search for filterTagId : " + filterTagId);
CursorLoader cursorLoader = new CursorLoader(getActivity(), ProductProvider.Constants.CONTENT_URI_CATALOG_PRODUCT, SEARCH_PROJECTION_COLOMN, selection, selectionArgs, sortOrder);
return cursorLoader;
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
listAdapter.changeCursor(cursor);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
listAdapter.changeCursor(null);
}
};
private final LoaderManager.LoaderCallbacks<Cursor> tagLoaderCallback = new LoaderManager.LoaderCallbacks<Cursor>() {
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
String selection = null;
String[] selectionArgs = null;
CursorLoader cursorLoader = new CursorLoader(getActivity(), TagProvider.Constants.CONTENT_URI, TAG_PROJECTION_COLOMN, selection, selectionArgs, TAG_SORT_DEFAULT);
return cursorLoader;
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
tagListAdapter.changeCursor(data);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
tagListAdapter.changeCursor(null);
}
};
}