package eu.ttbox.androgister.ui.order;
import java.util.Calendar;
import android.app.Fragment;
import android.app.LoaderManager;
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.DatePicker;
import android.widget.DatePicker.OnDateChangedListener;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;
import eu.ttbox.androgister.R;
import eu.ttbox.androgister.core.AppConstants;
import eu.ttbox.androgister.core.Intents;
import eu.ttbox.androgister.domain.OrderDao.Properties;
import eu.ttbox.androgister.domain.provider.OrderProvider;
/**
* {link http://mobile.tutsplus.com/tutorials/android/android-sdk_loading-
* data_cursorloader/}
*
* @author jmorille
*
*/
public class OrderListFragment extends Fragment {
private static final String TAG = "OrderListFragment";
private static final int ORDER_LIST_LOADER = R.id.config_id_order_list_loader_started;
private static final String[] SEARCH_PROJECTION_COLOMN = new String[] { Properties.Id.columnName, //
Properties.OrderNumber.columnName, Properties.StatusId.columnName, Properties.OrderDate.columnName, //
Properties.OrderUUID.columnName, Properties.OrderDeleteUUID.columnName, //
Properties.PersonLastname.columnName, Properties.PersonFirstname.columnName, Properties.PersonMatricule.columnName, //
Properties.PriceSumHT.columnName };
private static final String ORDER_SORT_DEFAULT = String.format("%s DESC, %s DESC", Properties.OrderDate.columnName, Properties.OrderNumber.columnName);
// Search Filter Value
String filterOrderDateMin = null;
String filterOrderDateMax = null;
// Adapter
private OrderListAdapter listAdapter;
// Binding
private TextView searchResultTextView;
private ListView listView;
private DatePicker searchDate;
// Listener
private final LoaderManager.LoaderCallbacks<Cursor> orderLoaderCallback = new LoaderManager.LoaderCallbacks<Cursor>() {
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
String sortOrder = ORDER_SORT_DEFAULT;
String selection = null;
String[] selectionArgs = null;
// Filter
if (filterOrderDateMin != null) {
selection = String.format("%1$s >= ? and %1$s < ?", Properties.OrderDate.columnName);
selectionArgs = new String[] { filterOrderDateMin, filterOrderDateMax };
}
// Loader
CursorLoader cursorLoader = new CursorLoader(getActivity(), OrderProvider.Constants.CONTENT_URI, SEARCH_PROJECTION_COLOMN, selection, selectionArgs, sortOrder);
return cursorLoader;
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
int count = 0;
if (cursor != null) {
count = cursor.getCount();
}
if (count < 1) {
searchResultTextView.setText(R.string.search_no_results);
} else {
String countString = getResources().getQuantityString(R.plurals.search_results, count, new Object[] { count });
searchResultTextView.setText(countString);
}
listAdapter.changeCursor(cursor);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
searchResultTextView.setText(R.string.search_instructions);
listAdapter.changeCursor(null);
}
};
private final OnDateChangedListener filterOnDateChangedListener = new OnDateChangedListener() {
@Override
public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
setFilterOrderDate(year, monthOfYear, dayOfMonth);
getLoaderManager().restartLoader(ORDER_LIST_LOADER, null, orderLoaderCallback);
}
};
private final AdapterView.OnItemClickListener mOnClickListener = new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
onListItemClick((ListView) parent, v, position, id);
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public void onResume() {
super.onResume();
getLoaderManager().restartLoader(ORDER_LIST_LOADER, null, orderLoaderCallback);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.order_list, container, false);
// Bind
listView = (ListView) view.findViewById(R.id.order_list_list);
listView.setOnItemClickListener(mOnClickListener);
searchDate = (DatePicker) view.findViewById(R.id.order_list_search_date);
searchResultTextView = (TextView) view.findViewById(R.id.order_search_result);
// List Header
ViewGroup mTop = (ViewGroup) inflater.inflate(R.layout.order_list_header, listView, false);
listView.addHeaderView(mTop, null, false);
// List Adpater
listAdapter = new OrderListAdapter(getActivity(), R.layout.order_list_item, null, SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
listView.setAdapter(listAdapter);
// Search Form: Date
final Calendar c = setFilterOrderDate(-1, -1, -1);
int year = c.get(Calendar.YEAR);
int monthOfYear = c.get(Calendar.MONTH);
int dayOfMonth = c.get(Calendar.DAY_OF_MONTH);
searchDate.setMaxDate(c.getTimeInMillis());
searchDate.init(year, monthOfYear, dayOfMonth, filterOnDateChangedListener);
// Do Search
// getLoaderManager().initLoader(ORDER_LIST_LOADER, null,
// orderLoaderCallback);
return view;
}
private void onListItemClick(ListView l, View v, int position, long id) {
Cursor item = (Cursor) l.getAdapter().getItem(position);
long orderId = item.getLong(item.getColumnIndex(Properties.Id.columnName));
Log.d(TAG, "onListItemClick orderId : " + orderId);
startActivity(Intents.viewOrderDetail(getActivity(), orderId));
}
private Calendar setFilterOrderDate(int year, int monthOfYear, int dayOfMonth) {
Calendar c = Calendar.getInstance();
if (year != -1) {
c.set(Calendar.YEAR, year);
}
if (monthOfYear != -1) {
c.set(Calendar.MONTH, monthOfYear);
}
if (dayOfMonth != -1) {
c.set(Calendar.DAY_OF_MONTH, dayOfMonth);
}
c.clear(Calendar.HOUR);
c.clear(Calendar.HOUR_OF_DAY);
c.clear(Calendar.MINUTE);
c.clear(Calendar.SECOND);
c.clear(Calendar.MILLISECOND);
long minFilter = c.getTimeInMillis();
long maxFilter = minFilter + AppConstants.ONE_DAY_MS;
filterOrderDateMin = String.valueOf(minFilter);
filterOrderDateMax = String.valueOf(maxFilter);
Log.i(TAG, String.format("set Filter OrderDate in range of %1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS,%1$tL to %2$tY-%2$tm-%2$td %2$tH:%2$tM:%2$tS,%2$tL", minFilter, maxFilter));
return c;
}
}