package org.ecomap.android.app.fragments; import android.app.Activity; import android.app.DatePickerDialog; import android.os.Bundle; import android.support.v4.app.ListFragment; import android.support.v7.widget.SwitchCompat; import android.util.Log; import android.util.SparseBooleanArray; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.DatePicker; import android.widget.ListView; import android.widget.ScrollView; import android.widget.TextView; import org.ecomap.android.app.R; import org.ecomap.android.app.User; import org.ecomap.android.app.data.EcoMapContract; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Locale; public class FiltersFragment extends ListFragment { /*these are never used. Though we need them to understand the type of problems. public static final int WOODS_PROBLEM = 1; public static final int TRASH_PROBLEM = 2; public static final int BUILDING_PROBLEM = 3; public static final int WATER_PROBLEM = 4; public static final int LIFEFORMS_PROBLEM = 5; public static final int POACHING_PROBLEM = 6; public static final int OTHER_PROBLEM = 7;*/ private final String LOG_TAG = "FilterFragment"; private final String problemType = EcoMapContract.ProblemsEntry.COLUMN_PROBLEM_TYPE_ID + " = "; private final String dateInterval = ") AND (" + EcoMapContract.ProblemsEntry.COLUMN_DATE + " BETWEEN "; private String resultCondition; private ListView listView; private TextView startDate, endDate; private ArrayList<Integer> selectedIdees; private View mainView; private Filterable ourActivity; private SparseBooleanArray sbArray; private int startYear, startMonth, startDay, endYear, endMonth, endDay; private String dateCondition; private boolean startDateInitialized; private boolean endDateInitialized; private String beginDate; private String finishDate; private final String userID = EcoMapContract.ProblemsEntry.COLUMN_USER_ID + " = "; private String userCondition; private SwitchCompat mSwitch; private int userIDValue; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); Log.i(LOG_TAG, "OnCreate"); } @Override public void onAttach(Activity activity) { super.onAttach(activity); ourActivity = (Filterable) activity; Log.i(LOG_TAG, "onAttach"); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { super.onCreateView(inflater, container, savedInstanceState); Log.i(LOG_TAG, "onCreateView"); mainView = inflater.inflate(R.layout.filters_fragment_main, container, false); getActivity().setTitle(getActivity().getString(R.string.filters_menu_item_title)); //getActivity().invalidateOptionsMenu(); ScrollView scrollView = (ScrollView) mainView.findViewById(R.id.scroll_view); scrollView.scrollTo(0, 0); return mainView; } @Override public void onResume() { super.onResume(); Log.i(LOG_TAG, "onResume"); mSwitch = (SwitchCompat) mainView.findViewById(R.id.switch_compat); listView = getListView(); listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource( getActivity(), R.array.types, android.R.layout.simple_list_item_multiple_choice); listView.setAdapter(adapter); //set all of the items checked in the start if (sbArray == null) { for (int i = 0; i < listView.getCount(); i++) { listView.setItemChecked(i, true); } } selectedIdees = new ArrayList<>(); //if we already did some checking in filters, we get our previous selections. if (sbArray != null) { Log.i(LOG_TAG, "sbArray size " + sbArray.size()); for (int i = 0; i < sbArray.size(); i++) { int key = sbArray.keyAt(i); if (sbArray.get(key)) { listView.setItemChecked(key, true); } } } Button okBtn = (Button) mainView.findViewById(R.id.ok); Button resetBtn = (Button) mainView.findViewById(R.id.reset); startDate = (TextView) mainView.findViewById(R.id.start_date); endDate = (TextView) mainView.findViewById(R.id.end_date); String finishDateForTextfield = ""; final Calendar c = Calendar.getInstance(); if (!startDateInitialized) { beginDate = "2014-02-18"; startYear = 2014; startMonth = 1; startDay = 18; } if (!endDateInitialized) { endYear = c.get(Calendar.YEAR); endMonth = c.get(Calendar.MONTH); endDay = c.get(Calendar.DAY_OF_MONTH); //this is needed because user will want to see problems what were added today. //So we increase the day to see all the problems from the last day. c.set(endYear, endMonth, endDay); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.US); finishDateForTextfield = sdf.format(c.getTime()); //make a finish date for query. Need to make it one day more, to see the problems added today. c.set(endYear, endMonth, endDay + 1); finishDate = sdf.format(c.getTime()); } startDate.setText(beginDate); endDate.setText(finishDateForTextfield); okBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { sbArray = listView.getCheckedItemPositions(); Log.i(LOG_TAG, "sbArray created. size= " + sbArray.size()); for (int i = 0; i < sbArray.size(); i++) { int key = sbArray.keyAt(i); if (sbArray.get(key)) { selectedIdees.add(key + 1); Log.i(LOG_TAG, "added + " + (key + 1)); } } if (selectedIdees.size() == 0) { resultCondition = "(" + problemType + 120; } else if (selectedIdees.size() == 1) { resultCondition = "(" + problemType + selectedIdees.get(0); } else { resultCondition = "(" + problemType + selectedIdees.remove(0); for (int i = 0; i < selectedIdees.size(); i++) { resultCondition += " OR " + problemType + selectedIdees.get(i); } } dateCondition = dateInterval + "\'" + beginDate + "\'" + " AND " + "\'" + finishDate + "\')"; resultCondition += dateCondition; if (mSwitch.isChecked()) { userIDValue = User.getUserId(); userCondition = " AND (" + userID + userIDValue + ")"; resultCondition += userCondition; } Log.i(LOG_TAG, resultCondition); ourActivity.filter(resultCondition); } }); //set all problems as checked resetBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mSwitch.setChecked(false); for (int i = 0; i < listView.getCount(); i++) { listView.setItemChecked(i, true); } //aaand delete our previous choises sbArray = null; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.US); finishDate = sdf.format(c.getTime()); endYear = c.get(Calendar.YEAR); endMonth = c.get(Calendar.MONTH); endDay = c.get(Calendar.DAY_OF_MONTH); startDate.setText(beginDate); endDate.setText(finishDate); beginDate = "2014-02-18"; startYear = 2014; startMonth = 1; startDay = 18; } }); View.OnClickListener showDatePicker = new View.OnClickListener() { @Override public void onClick(View v) { DatePickerDialog datePickerDialog; if (v.getId() == R.id.start_date) { datePickerDialog = new DatePickerDialog(getActivity(), new DatePickerDialog.OnDateSetListener() { @Override public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { Calendar c = Calendar.getInstance(); c.set(year, monthOfYear, dayOfMonth); startYear = year; startMonth = monthOfYear; startDay = dayOfMonth; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.US); beginDate = sdf.format(c.getTime()); startDateInitialized = true; startDate.setText(beginDate); } }, startYear, startMonth, startDay); } else { datePickerDialog = new DatePickerDialog(getActivity(), new DatePickerDialog.OnDateSetListener() { @Override public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { Calendar c = Calendar.getInstance(); c.set(year, monthOfYear, dayOfMonth); String dateForTextField; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.US); dateForTextField = sdf.format(c.getTime()); c.set(year, monthOfYear, dayOfMonth + 1); endYear = year; endMonth = monthOfYear; endDay = dayOfMonth; endDateInitialized = true; endDate.setText(dateForTextField); } }, endYear, endMonth, endDay); } datePickerDialog.show(); } }; startDate.setOnClickListener(showDatePicker); endDate.setOnClickListener(showDatePicker); } @Override public void onPause() { super.onPause(); Log.i(LOG_TAG, "on pause"); } public interface Filterable { void filter(String string); } }