package com.myMinistry.fragments; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Locale; import android.app.Activity; import android.app.AlertDialog; import android.content.ContentValues; import android.content.DialogInterface; import android.database.Cursor; import android.os.Bundle; import android.support.v4.app.ActivityCompat; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.support.v4.app.ListFragment; import android.text.format.DateFormat; 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.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.AdapterView; import android.widget.ImageView; import android.widget.ListView; import android.widget.Spinner; import android.widget.TextView; import android.widget.Toast; import com.doomonafireball.betterpickers.numberpicker.NumberPickerBuilder; import com.doomonafireball.betterpickers.numberpicker.NumberPickerDialogFragment.NumberPickerDialogHandler; import com.myMinistry.FragmentActivityStatus; import com.myMinistry.Helper; import com.myMinistry.R; import com.myMinistry.adapters.NavDrawerMenuItemAdapter; import com.myMinistry.adapters.TimeEditorEntryAdapter; import com.myMinistry.dialogfragments.DatePickerDialogFragment; import com.myMinistry.dialogfragments.DatePickerDialogFragment.DatePickerDialogFragmentListener; import com.myMinistry.dialogfragments.HouseholderDialogFragment; import com.myMinistry.dialogfragments.HouseholderDialogFragment.HouseholderDialogFragmentListener; import com.myMinistry.dialogfragments.HouseholderNewDialogFragment; import com.myMinistry.dialogfragments.HouseholderNewDialogFragment.HouseholderNewDialogFragmentListener; import com.myMinistry.dialogfragments.NotesDialogFragment; import com.myMinistry.dialogfragments.NotesDialogFragment.NotesDialogFragmentListener; import com.myMinistry.dialogfragments.PublicationDialogFragment; import com.myMinistry.dialogfragments.PublicationDialogFragment.LiteratureDialogFragmentListener; import com.myMinistry.dialogfragments.PublicationNewDialogFragment; import com.myMinistry.dialogfragments.PublicationNewDialogFragment.LiteratureNewDialogFragmentListener; import com.myMinistry.dialogfragments.PublicationTypeDialogFragment; import com.myMinistry.dialogfragments.PublicationTypeDialogFragment.LiteratureTypeDialogFragmentListener; import com.myMinistry.dialogfragments.TimePickerDialogFragment; import com.myMinistry.dialogfragments.TimePickerDialogFragment.TimePickerDialogFragmentListener; import com.myMinistry.model.HouseholderForTime; import com.myMinistry.model.NavDrawerMenuItem; import com.myMinistry.model.QuickLiterature; import com.myMinistry.provider.MinistryContract.EntryType; import com.myMinistry.provider.MinistryContract.Householder; import com.myMinistry.provider.MinistryContract.Literature; import com.myMinistry.provider.MinistryContract.LiteraturePlaced; import com.myMinistry.provider.MinistryContract.Notes; import com.myMinistry.provider.MinistryContract.Publisher; import com.myMinistry.provider.MinistryContract.Time; import com.myMinistry.provider.MinistryContract.TimeHouseholder; import com.myMinistry.provider.MinistryContract.UnionsNameAsRef; import com.myMinistry.provider.MinistryDatabase; import com.myMinistry.provider.MinistryService; import com.myMinistry.ui.MainActivity; import com.myMinistry.util.PrefUtils; import com.myMinistry.util.TimeUtils; public class TimeEditorFragment extends ListFragment implements NumberPickerDialogHandler { public static final String ARG_TIME_ID = "time_id"; public static final String ARG_PUBLISHER_ID = "publisher_id"; private boolean is_dual_pane = false; private MinistryService database = null; private int publisherId, originalPublisherId, entryTypeId, timeId = 0; private Spinner publishers, entryTypes = null; private TextView dateStart, dateEnd, timeStart, timeEnd; private ImageView addListItem; private Cursor qEntryTypes = null; private Calendar selectedDateStart = Calendar.getInstance(); private Calendar selectedDateEnd = Calendar.getInstance(); private Calendar originalSelectedDateStart = Calendar.getInstance(); private Cursor qPublishers = null; private String publisherName = null; private ArrayList<HouseholderForTime> householderList = new ArrayList<HouseholderForTime>(); private int selectedHHLoc, selectedLitLoc = 0; private HouseholderForTime householderForTime; private QuickLiterature quickLit; private TimeEditorEntryAdapter adapter; private boolean allowedToEdit = true; private boolean publisherExists = false; private boolean showFlow = true; private NavDrawerMenuItemAdapter typesAdapter; private NavDrawerMenuItemAdapter pubsAdapter; private Animation anim; private FragmentManager fm; private final int REF_DATE_START = 3; private final int REF_DATE_END = 4; private final int REF_NOTES = 0; private final int REF_ADD_LITERATURE = 1; private final int REF_DELETE = 2; private final int REF_TOGGLE_RETURN_VISIT = 3; SimpleDateFormat dateFormat = new SimpleDateFormat("EEE, MMM d, yyyy", Locale.getDefault()); SimpleDateFormat timeFormat = new SimpleDateFormat("h:mm aaa", Locale.getDefault()); SimpleDateFormat saveTimeFormat = new SimpleDateFormat("HH:mm", Locale.getDefault()); private FragmentActivityStatus fragmentActivityStatus; public TimeEditorFragment newInstance() { TimeEditorFragment f = new TimeEditorFragment(); return f; } public TimeEditorFragment newInstance(int _timeID) { TimeEditorFragment f = new TimeEditorFragment(); Bundle args = new Bundle(); args.putInt(ARG_TIME_ID, _timeID); f.setArguments(args); return f; } public TimeEditorFragment newInstance(int timeId, int publisherId) { TimeEditorFragment f = new TimeEditorFragment(); Bundle args = new Bundle(); args.putInt(ARG_TIME_ID, timeId); args.putInt(ARG_PUBLISHER_ID, publisherId); f.setArguments(args); return f; } public TimeEditorFragment newInstanceForPublisher(int publisherId) { TimeEditorFragment f = new TimeEditorFragment(); Bundle args = new Bundle(); args.putInt(ARG_PUBLISHER_ID, publisherId); f.setArguments(args); return f; } @Override public void onPrepareOptionsMenu(Menu menu) { boolean drawerOpen = fragmentActivityStatus.isDrawerOpen(); if(menu.findItem(R.id.menu_discard) != null) menu.findItem(R.id.menu_discard).setVisible(!drawerOpen); if(menu.findItem(R.id.menu_save) != null) menu.findItem(R.id.menu_save).setVisible(!drawerOpen); if(menu.findItem(R.id.menu_cancel) != null) menu.findItem(R.id.menu_cancel).setVisible(!drawerOpen); super.onPrepareOptionsMenu(menu); } @Override public void onAttach(Activity activity) { super.onAttach(activity); fragmentActivityStatus = (FragmentActivityStatus)activity; } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { if(allowedToEdit) { if(timeId == 0) inflater.inflate(R.menu.save_cancel, menu); else inflater.inflate(R.menu.save_cancel_discard, menu); } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { final View root = inflater.inflate(R.layout.time_editor, container, false); int _timeID = 0; Bundle args = getArguments(); if(args != null) { if(args.containsKey(ARG_TIME_ID)) _timeID = args.getInt(ARG_TIME_ID); if(args.containsKey(ARG_PUBLISHER_ID)) publisherId = args.getInt(ARG_PUBLISHER_ID); } setHasOptionsMenu(true); fm = getActivity().getSupportFragmentManager(); anim = AnimationUtils.loadAnimation(getActivity().getApplicationContext(), R.anim.fade_anim); publishers = (Spinner) root.findViewById(R.id.publishers); entryTypes = (Spinner) root.findViewById(R.id.entryTypes); dateStart = (TextView) root.findViewById(R.id.dateStart); dateEnd = (TextView) root.findViewById(R.id.dateEnd); timeStart = (TextView) root.findViewById(R.id.timeStart); timeEnd = (TextView) root.findViewById(R.id.timeEnd); addListItem = (ImageView) root.findViewById(R.id.addListItem); selectedDateStart.set(Calendar.MILLISECOND, 0); selectedDateEnd.set(Calendar.MILLISECOND, 0); database = new MinistryService(getActivity()); database.openWritable(); if(_timeID == 0) { qEntryTypes = database.fetchActiveEntryTypes(); qPublishers = database.fetchActivePublishers(); } else { qEntryTypes = database.fetchActiveEntryTypes(); qPublishers = database.fetchAllPublishers(); } typesAdapter = new NavDrawerMenuItemAdapter(getActivity().getApplicationContext()); while(qEntryTypes.moveToNext()) typesAdapter.addItem(new NavDrawerMenuItem(qEntryTypes.getString(qEntryTypes.getColumnIndex(EntryType.NAME)), R.drawable.ic_drawer_entry_types, qEntryTypes.getInt(qEntryTypes.getColumnIndex(EntryType._ID)))); pubsAdapter = new NavDrawerMenuItemAdapter(getActivity().getApplicationContext()); while(qPublishers.moveToNext()) pubsAdapter.addItem(new NavDrawerMenuItem(qPublishers.getString(qPublishers.getColumnIndex(Publisher.NAME)), R.drawable.ic_drawer_publisher, qPublishers.getInt(qPublishers.getColumnIndex(Publisher._ID)))); entryTypes.setAdapter(typesAdapter); entryTypes.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> adapterView, View view, int position, long id) { entryTypeId = typesAdapter.getItem(position).getID(); } @Override public void onNothingSelected(AdapterView<?> parent) { } }); publishers.setAdapter(pubsAdapter); publishers.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> adapterView, View view, int position, long id) { publisherId = pubsAdapter.getItem(position).getID(); //qPublishers.moveToPosition(position); publisherName = pubsAdapter.getItem(position).toString(); } @Override public void onNothingSelected(AdapterView<?> parent) { } }); timeStart.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { TimePickerDialogFragment frag = TimePickerDialogFragment.newInstance(selectedDateStart); frag.setTimePickerDialogFragmentListener(new TimePickerDialogFragmentListener() { @Override public void TimePickerDialogFragmentListenerSet(int hourOfDay, int minute) { selectedDateStart.set(Calendar.HOUR_OF_DAY, hourOfDay); selectedDateStart.set(Calendar.MINUTE, minute); updateDisplayTimes(); } }); frag.show(fm, TimePickerDialogFragment.TAG); } }); timeEnd.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { TimePickerDialogFragment frag = TimePickerDialogFragment.newInstance(selectedDateEnd); frag.setTimePickerDialogFragmentListener(new TimePickerDialogFragmentListener() { @Override public void TimePickerDialogFragmentListenerSet(int hourOfDay, int minute) { selectedDateEnd.set(Calendar.HOUR_OF_DAY, hourOfDay); selectedDateEnd.set(Calendar.MINUTE, minute); updateDisplayTimes(); } }); frag.show(fm, TimePickerDialogFragment.TAG); } }); dateStart.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { DatePickerDialogFragment frag = DatePickerDialogFragment.newInstance(selectedDateStart); frag.setDatePickerDialogFragmentListener(new DatePickerDialogFragmentListener() { @Override public void DatePickerDialogFragmentListenerSet(int selectedYear, int selectedMonth, int selectedDay) { selectedDateStart.set(selectedYear, selectedMonth, selectedDay); updateDisplayTimes(); } }); frag.show(fm, DatePickerDialogFragment.TAG); } }); dateEnd.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { DatePickerDialogFragment frag = DatePickerDialogFragment.newInstance(selectedDateEnd); frag.setDatePickerDialogFragmentListener(new DatePickerDialogFragmentListener() { @Override public void DatePickerDialogFragmentListenerSet(int selectedYear, int selectedMonth, int selectedDay) { selectedDateEnd.set(selectedYear, selectedMonth, selectedDay); updateDisplayTimes(); } }); frag.show(fm, DatePickerDialogFragment.TAG); } }); addListItem.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showFlow = true; showHouseholdersDialog(); } }); adapter = new TimeEditorEntryAdapter(getActivity().getApplicationContext(), householderList); adapter.setNotifyOnChange(true); setListAdapter(adapter); database.close(); setTimeEntry(_timeID); return root; } @Override public void onActivityCreated(Bundle savedState) { super.onActivityCreated(savedState); is_dual_pane = getActivity().findViewById(R.id.secondary_fragment_container) != null; getActivity().setTitle(R.string.navdrawer_item_time_entry); } public void setTimeEntry(int _timeID) { timeId = _timeID; if(timeId > 0) { database.openWritable(); Cursor record = database.fetchTimeEntry(timeId); if(record.moveToFirst()) { String[] splitTime = record.getString(record.getColumnIndex(Time.TIME_START)).split(":"); Calendar todel = Calendar.getInstance(Locale.getDefault()); Calendar todel2 = Calendar.getInstance(Locale.getDefault()); try { todel.setTime(TimeUtils.dbDateFormat.parse(record.getString(record.getColumnIndex(Time.DATE_START)))); } catch (Exception e) { todel = Calendar.getInstance(Locale.getDefault()); } todel.set(Calendar.HOUR_OF_DAY,Integer.valueOf(splitTime[0])); todel.set(Calendar.MINUTE,Integer.valueOf(splitTime[1])); setDate(todel,REF_DATE_START); try { todel2.setTime(TimeUtils.dbDateFormat.parse(record.getString(record.getColumnIndex(Time.DATE_END)))); } catch (Exception e) { todel2 = Calendar.getInstance(Locale.getDefault()); } splitTime = record.getString(record.getColumnIndex(Time.TIME_END)).split(":"); todel2.set(Calendar.HOUR_OF_DAY,Integer.valueOf(splitTime[0])); todel2.set(Calendar.MINUTE,Integer.valueOf(splitTime[1])); setDate(todel2,REF_DATE_END); // Set the publisher in the spinner for(qPublishers.moveToFirst();!qPublishers.isAfterLast();qPublishers.moveToNext()) { if(qPublishers.getInt(qPublishers.getColumnIndex(Publisher._ID)) == record.getInt(record.getColumnIndex(Time.PUBLISHER_ID))) { publishers.setSelection(qPublishers.getPosition()); /** Set the default publisher ID to be checked on update */ originalPublisherId = record.getInt(record.getColumnIndex(Time.PUBLISHER_ID)); publisherExists = true; break; } } // The publisher doesn't exist in the cursor so we need to grab ALL the publishers. if(!publisherExists) { qPublishers = database.fetchAllPublishers(); pubsAdapter.clear(); while(qPublishers.moveToNext()) { if(qPublishers.getInt(qPublishers.getColumnIndex(UnionsNameAsRef.ACTIVE)) == MinistryService.ACTIVE || qPublishers.getInt(qPublishers.getColumnIndex(Publisher._ID)) == record.getInt(record.getColumnIndex(Time.PUBLISHER_ID))) { pubsAdapter.addItem(new NavDrawerMenuItem(qPublishers.getString(qPublishers.getColumnIndex(Publisher.NAME)), R.drawable.ic_drawer_publisher, qPublishers.getInt(qPublishers.getColumnIndex(Publisher._ID)))); } } pubsAdapter.notifyDataSetChanged(); publisherExists = true; for(qPublishers.moveToFirst();!qPublishers.isAfterLast();qPublishers.moveToNext()) { if(qPublishers.getInt(qPublishers.getColumnIndex(Publisher._ID)) == record.getInt(record.getColumnIndex(Time.PUBLISHER_ID))) { publishers.setSelection(qPublishers.getPosition()); /** Set the default publisher ID to be checked on update */ originalPublisherId = record.getInt(record.getColumnIndex(Time.PUBLISHER_ID)); break; } } } if(record.getInt(record.getColumnIndex(Time.ENTRY_TYPE_ID)) == MinistryDatabase.ID_ROLLOVER) { allowedToEdit = false; ActivityCompat.invalidateOptionsMenu(getActivity()); qEntryTypes = database.fetchAllEntryTypes(); typesAdapter.clear(); while(qEntryTypes.moveToNext()) typesAdapter.addItem(new NavDrawerMenuItem(qEntryTypes.getString(qEntryTypes.getColumnIndex(EntryType.NAME)), R.drawable.ic_drawer_entry_types, qEntryTypes.getInt(qEntryTypes.getColumnIndex(EntryType._ID)))); typesAdapter.notifyDataSetChanged(); } for(qEntryTypes.moveToFirst();!qEntryTypes.isAfterLast();qEntryTypes.moveToNext()) { if(qEntryTypes.getInt(qEntryTypes.getColumnIndex(EntryType._ID)) == record.getInt(record.getColumnIndex(Time.ENTRY_TYPE_ID))) { entryTypes.setSelection(qEntryTypes.getPosition()); break; } } // Let's get all the return visits/studies for this entry :) Cursor qTimeHouseholders = database.fetchTimeHouseholdersForTimeByID(timeId); Cursor qTimeLiterature; for(qTimeHouseholders.moveToFirst();!qTimeHouseholders.isAfterLast();qTimeHouseholders.moveToNext()) { if(qTimeHouseholders.getString(qTimeHouseholders.getColumnIndex(TimeHouseholder.HOUSEHOLDER_ID)) != null) { householderForTime = new HouseholderForTime(qTimeHouseholders.getInt(qTimeHouseholders.getColumnIndex(TimeHouseholder.HOUSEHOLDER_ID)), qTimeHouseholders.getString(qTimeHouseholders.getColumnIndex(Householder.NAME)), qTimeHouseholders.getInt(qTimeHouseholders.getColumnIndex(TimeHouseholder._ID))); householderForTime.setCountedForReturnVisit(qTimeHouseholders.getInt(qTimeHouseholders.getColumnIndex(TimeHouseholder.RETURN_VISIT))); if(qTimeHouseholders.getString(qTimeHouseholders.getColumnIndex(UnionsNameAsRef.NOTE_ID)) != "") { householderForTime.setNotesID(qTimeHouseholders.getInt(qTimeHouseholders.getColumnIndex(UnionsNameAsRef.NOTE_ID))); householderForTime.setNotes(qTimeHouseholders.getString(qTimeHouseholders.getColumnIndex(Notes.NOTES))); } householderList.add(householderForTime); // Let's get all the literature placed for this householder :) qTimeLiterature = database.fetchPlacedLitByTimeAndHouseholderID(timeId, qTimeHouseholders.getInt(qTimeHouseholders.getColumnIndex(TimeHouseholder.HOUSEHOLDER_ID))); for(qTimeLiterature.moveToFirst();!qTimeLiterature.isAfterLast();qTimeLiterature.moveToNext()) { householderList.get(householderList.size() - 1).addLit(new QuickLiterature(qTimeLiterature.getInt(qTimeLiterature.getColumnIndex(LiteraturePlaced.LITERATURE_ID)), qTimeLiterature.getString(qTimeLiterature.getColumnIndex(Literature.NAME)), qTimeLiterature.getInt(qTimeLiterature.getColumnIndex(LiteraturePlaced.COUNT)), qTimeLiterature.getInt(qTimeLiterature.getColumnIndex(Literature.TYPE_OF_LIERATURE_ID)))); } qTimeLiterature.close(); } } qTimeHouseholders.close(); } record.close(); database.close(); adapter.notifyDataSetChanged(); } // Set Defaults else { selectedDateEnd = Helper.roundMinutesAndHour(selectedDateEnd,15); selectedDateStart.set(Calendar.HOUR_OF_DAY,selectedDateEnd.get(Calendar.HOUR_OF_DAY) - 1); selectedDateStart.set(Calendar.MINUTE,selectedDateEnd.get(Calendar.MINUTE)); setDate(selectedDateStart,REF_DATE_START); setDate(selectedDateEnd,REF_DATE_END); for(qPublishers.moveToFirst();!qPublishers.isAfterLast();qPublishers.moveToNext()) { if(qPublishers.getInt(qPublishers.getColumnIndex(Publisher._ID)) == publisherId) { publishers.setSelection(qPublishers.getPosition()); break; } } } updateDisplayTimes(); originalSelectedDateStart.set(Calendar.YEAR,selectedDateStart.get(Calendar.YEAR)); originalSelectedDateStart.set(Calendar.MONTH,selectedDateStart.get(Calendar.MONTH)); } public void updateDisplayTimes() { dateEnd.setText(dateFormat.format(selectedDateEnd.getTime()).toString()); dateStart.setText(dateFormat.format(selectedDateStart.getTime()).toString()); timeStart.setText(DateFormat.getTimeFormat(getActivity().getApplicationContext()).format(selectedDateStart.getTime()).toString()); timeEnd.setText(DateFormat.getTimeFormat(getActivity().getApplicationContext()).format(selectedDateEnd.getTime()).toString()); } public void setDate(Calendar _date, int _which) { switch(_which) { case REF_DATE_START: selectedDateStart = _date; break; case REF_DATE_END: selectedDateEnd = _date; break; } updateDisplayTimes(); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menu_save: if(allowedToEdit) { if(saveTime()) { PrefUtils.setSummaryMonthAndYear(getActivity(), selectedDateStart); PrefUtils.setPublisherId(getActivity(), publisherId); // This will update the action bar with the new publisher MainActivity mainFrag = (MainActivity) getActivity(); mainFrag.setPublisherId(publisherId, publisherName); } else { Toast.makeText(getActivity(), getActivity().getApplicationContext().getString(R.string.toast_saved_problem), Toast.LENGTH_SHORT).show(); } } else Toast.makeText(getActivity(), getActivity().getApplicationContext().getString(R.string.toast_cannot_modify_rollover_time), Toast.LENGTH_SHORT).show(); return true; case R.id.menu_cancel: getActivity().setTitle(R.string.navdrawer_item_summary); if(is_dual_pane) { // The fragment is the time entry one, just update the frag instead of doing a replacement. SummaryFragment fragment = (SummaryFragment) fm.findFragmentById(R.id.primary_fragment_container); if(timeId > 0) { fragment.setPublisherId(originalPublisherId); fragment.setDate(originalSelectedDateStart); } fragment.refresh(SummaryFragment.DIRECTION_NO_CHANGE); } else { FragmentTransaction ft = fm.beginTransaction(); ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); Fragment frag = fm.findFragmentById(R.id.primary_fragment_container); new SummaryFragment(); SummaryFragment f; if(timeId > 0) { f = SummaryFragment.newInstance(originalPublisherId); f.setDate(originalSelectedDateStart); } else { f = SummaryFragment.newInstance(publisherId); f.setDate(selectedDateStart); } f.setDate(originalSelectedDateStart); if(frag != null) ft.remove(frag); ft.add(R.id.primary_fragment_container, f); ft.commit(); } return true; case R.id.menu_discard: if(allowedToEdit) { DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { switch (which){ case DialogInterface.BUTTON_POSITIVE: getActivity().setTitle(R.string.navdrawer_item_summary); // Delete Time Entries Deep database.openWritable(); database.removeTimeEntryDeep(timeId); database.processRolloverTime(originalPublisherId, originalSelectedDateStart); database.close(); Toast.makeText(getActivity(), getActivity().getApplicationContext().getString(R.string.toast_deleted), Toast.LENGTH_SHORT).show(); if(is_dual_pane) { SummaryFragment f = (SummaryFragment) fm.findFragmentById(R.id.primary_fragment_container); if(timeId > 0) { f.setPublisherId(originalPublisherId); f.setDate(originalSelectedDateStart); } f.calculateSummaryValues(); f.refresh(SummaryFragment.DIRECTION_NO_CHANGE); } else { FragmentTransaction ft = fm.beginTransaction(); ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); Fragment frag = fm.findFragmentById(R.id.primary_fragment_container); new SummaryFragment(); SummaryFragment f; if(timeId > 0) { f = SummaryFragment.newInstance(originalPublisherId); f.setDate(originalSelectedDateStart); } else { f = SummaryFragment.newInstance(publisherId); f.setDate(selectedDateStart); } f.setDate(originalSelectedDateStart); if(frag != null) ft.remove(frag); ft.add(R.id.primary_fragment_container, f); ft.addToBackStack(null); ft.commit(); } break; } } }; AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setTitle(R.string.confirm_deletion) .setPositiveButton(R.string.menu_delete, dialogClickListener) .setNegativeButton(R.string.menu_cancel, dialogClickListener) .show(); } else Toast.makeText(getActivity(), getActivity().getApplicationContext().getString(R.string.toast_cannot_modify_rollover_time), Toast.LENGTH_SHORT).show(); return true; default: return super.onOptionsItemSelected(item); } } /** Insert values into database */ private boolean saveTime() { /** Flag to know if the literature should be inserted or deleted */ boolean isNew = (timeId == 0) ? true : false; double totalTime = Helper.getDifference(selectedDateStart, selectedDateEnd); /** No zero or negative hours allowed */ if(totalTime < 0) { Toast.makeText(getActivity(), getActivity().getApplicationContext().getString(R.string.toast_saved_problem), Toast.LENGTH_SHORT).show(); } else { /** Values to save */ ContentValues values = new ContentValues(); values.put(Time.PUBLISHER_ID, publisherId); values.put(Time.ENTRY_TYPE_ID, entryTypeId); values.put(Time.DATE_START, TimeUtils.dbDateFormat.format(selectedDateStart.getTime())); values.put(Time.DATE_END, TimeUtils.dbDateFormat.format(selectedDateEnd.getTime())); values.put(Time.TIME_START, saveTimeFormat.format(selectedDateStart.getTime())); values.put(Time.TIME_END, saveTimeFormat.format(selectedDateEnd.getTime())); /** Let's save the info to the times table */ database.openWritable(); if(timeId > 0) { if(database.saveTime(timeId, values) == 0) { Toast.makeText(getActivity(), getActivity().getApplicationContext().getString(R.string.toast_saved_problem), Toast.LENGTH_SHORT).show(); return false; } } else { timeId = (int) database.createTime(values); if(timeId == -1) { Toast.makeText(getActivity(), getActivity().getApplicationContext().getString(R.string.toast_created_problem), Toast.LENGTH_SHORT).show(); return false; } } /** Do we need to check for two publishers for the changing of the guard? :) */ if(!isNew && publisherId != originalPublisherId) { /** Run the rollover checkup on the original publisher. */ database.processRolloverTime(originalPublisherId, originalSelectedDateStart); } if(originalSelectedDateStart.after(selectedDateStart)) database.processRolloverTime(publisherId, selectedDateStart); else database.processRolloverTime(publisherId, originalSelectedDateStart); database.close(); long[] householderPKIDs = new long[householderList.size()]; int[] householderIDs = new int[householderList.size()]; long[] placedIDs; database.openWritable(); /** Loop over our householder list to save */ for(int i = 0;i < householderList.size(); i++) { householderForTime = householderList.get(i); values = new ContentValues(); values.put(TimeHouseholder.TIME_ID, timeId); values.put(TimeHouseholder.HOUSEHOLDER_ID, householderForTime.getID()); values.put(TimeHouseholder.RETURN_VISIT, householderForTime.isCountedForReturnVisit()); /** Bible Study */ if(entryTypeId == MinistryDatabase.ID_BIBLE_STUDY) values.put(TimeHouseholder.STUDY, 1); else values.put(TimeHouseholder.STUDY, 0); /** Check to see if the record exists */ if(householderForTime.getTimeHouseholderPK() == MinistryDatabase.CREATE_ID) { householderForTime.setTimeHouseholderPK(database.createTimeHouseholder(values)); } else { database.saveTimeHouseholder(householderForTime.getTimeHouseholderPK(), values); } if(householderForTime.getNotes() != null && householderForTime.getNotes().length() > 0) { values = new ContentValues(); values.put(Notes.TIME_ID, timeId); values.put(Notes.HOUSEHOLDER_ID, householderForTime.getID()); values.put(Notes.NOTES, householderForTime.getNotes()); if(householderForTime.getNotesID() == 0) database.createNotes(values); else database.saveNotes(householderForTime.getNotesID(), values); } /** We need to delete a note that existed before but has been removed. */ if(householderForTime.getNotesID() != 0 && (householderForTime.getNotes() == null || (householderForTime.getNotes() != null && householderForTime.getNotes().length() == 0))) database.deleteNoteByID(householderForTime.getNotesID()); householderPKIDs[i] = householderForTime.getTimeHouseholderPK(); householderIDs[i] = householderForTime.getID(); ArrayList<QuickLiterature> litList = householderList.get(i).getLit(); if(litList == null) placedIDs = null; else { placedIDs = new long[litList.size()]; for(int j = 0;j < litList.size();j++) { quickLit = litList.get(j); values = new ContentValues(); values.put(LiteraturePlaced.TIME_ID, timeId); values.put(LiteraturePlaced.HOUSEHOLDER_ID, householderForTime.getID()); values.put(LiteraturePlaced.LITERATURE_ID, quickLit.getID()); values.put(LiteraturePlaced.PUBLISHER_ID, publisherId); values.put(LiteraturePlaced.DATE, TimeUtils.dbDateFormat.format(selectedDateStart.getTime())); values.put(LiteraturePlaced.COUNT, quickLit.getCount()); /** Check to see if the record exists */ quickLit.setPlacedID(database.fetchPlacedLitByTimeAndHouseholderAndLitID(timeId, householderForTime.getID(), quickLit.getID())); if(quickLit.getPlacedID() == 0) { quickLit.setPlacedID(database.createPlacedLiterature(values)); } else { database.savePlacedLiterature(quickLit.getPlacedID(), values); } placedIDs[j] = quickLit.getPlacedID(); } } if(!isNew) { /** Delete orphaned litPlaced records */ database.deletePlacedLiteratureOrphans(timeId, householderForTime.getID(), placedIDs); } } if(!isNew) { /** Delete orphaned timeHouseholder and records */ database.deleteTimeHouseholderOrphans(timeId, householderPKIDs); /** Delete orphaned litPlaced records that aren't for the householders */ database.deleteTimeHouseholderLiteraturePlacedOrphans(timeId, householderIDs); /** Delete orphaned notes records */ database.deleteTimeHouseholderNotesOrphans(timeId, householderIDs); } database.close(); if(isNew) Toast.makeText(getActivity(), getActivity().getApplicationContext().getString(R.string.toast_created), Toast.LENGTH_SHORT).show(); else Toast.makeText(getActivity(), getActivity().getApplicationContext().getString(R.string.toast_saved), Toast.LENGTH_SHORT).show(); return true; } return false; } public void setSelectedHouseholder(int _ID,String _name, Boolean _isReturnVisit) { boolean addHH = true; selectedHHLoc = 0; for(int i = 0;i < householderList.size(); i++) { if(householderList.get(i).getID() == _ID) { /** We have the householder selected - don't add a new one */ addHH = false; selectedHHLoc = i; break; } } if(addHH) { HouseholderForTime entry = new HouseholderForTime(_ID,_name,MinistryDatabase.CREATE_ID); entry.setCountedForReturnVisit(_isReturnVisit); selectedHHLoc = householderList.size(); /** Since this is a zero based list, the size will be the new location of the added entry. */ householderList.add(entry); } adapter.notifyDataSetChanged(); showLiteratureTypesDialog(); } private void showHouseholdersDialog() { HouseholderDialogFragment frag = HouseholderDialogFragment.newInstance(); frag.setHouseholderFragmentListener(new HouseholderDialogFragmentListener() { @Override public void householderDialogFragmentSet(int _ID, String _name) { if(_ID == HouseholderDialogFragment.CREATE_ID) showHouseholderCreateNewDialog(); else setSelectedHouseholder(_ID,_name,true); } }); frag.show(fm, HouseholderDialogFragment.TAG); } public void showHouseholderCreateNewDialog() { HouseholderNewDialogFragment frag = HouseholderNewDialogFragment.newInstance(); frag.setPositiveButton(new HouseholderNewDialogFragmentListener() { @Override public void setPositiveButton(int _ID, String _name, Boolean _isFirstVisit) { setSelectedHouseholder(_ID,_name,_isFirstVisit); } }); frag.show(fm, HouseholderNewDialogFragment.TAG); } public void showLiteratureTypesDialog() { PublicationTypeDialogFragment frag = PublicationTypeDialogFragment.newInstance(showFlow); frag.setLiteratureTypeDialogFragmentListener(new LiteratureTypeDialogFragmentListener() { @Override public void LiteratureTypeDialogFragmentListenerSet(int _ID, String _name) { if(_ID == MinistryDatabase.CREATE_ID) showNotesDialog(householderList.get(selectedHHLoc).getNotes()); else showLiteratureDialog(_ID, _name); } }); frag.show(fm, PublicationTypeDialogFragment.TAG); } public void showLiteratureDialog(int _typeID, String _name) { PublicationDialogFragment frag = PublicationDialogFragment.newInstance(_typeID, _name); frag.setLiteratureFragmentListener(new LiteratureDialogFragmentListener() { @Override public void literatureDialogFragmentSet(int _ID, String _name, int _typeID) { if(_ID == PublicationDialogFragment.CREATE_ID - 1) { showNotesDialog(householderList.get(selectedHHLoc).getNotes()); } else if(_ID == PublicationDialogFragment.CREATE_ID) { showLiteratureCreateNewDialog(_typeID); } else { QuickLiterature quickLit = new QuickLiterature(_ID, _name, 0, _typeID); selectedLitLoc = householderList.get(selectedHHLoc).addLit(quickLit); showLiteratureCountDialog(); adapter.notifyDataSetChanged(); } } }); frag.show(fm, PublicationDialogFragment.TAG); } public void showLiteratureCreateNewDialog(int _typeID) { PublicationNewDialogFragment frag = PublicationNewDialogFragment.newInstance(_typeID); frag.setPositiveButton(new LiteratureNewDialogFragmentListener() { @Override public void setPositiveButton(int _ID, String _name, int _litTypeID) { QuickLiterature quickLit = new QuickLiterature(_ID, _name, 0, _litTypeID); selectedLitLoc = householderList.get(selectedHHLoc).addLit(quickLit); showLiteratureCountDialog(); adapter.notifyDataSetChanged(); } }); frag.show(fm, PublicationNewDialogFragment.TAG); } public void showLiteratureCountDialog() { NumberPickerBuilder npb = new NumberPickerBuilder() .setReference(selectedLitLoc) .setFragmentManager(fm) .setStyleResId(R.style.BetterPickersDialogFragment_Light) .setPlusMinusVisibility(View.GONE) .setMinNumber(1) .setMaxNumber(99) .setDecimalVisibility(View.GONE) .setTargetFragment(TimeEditorFragment.this); npb.show(); } private void showNotesDialog(String notes) { NotesDialogFragment frag = NotesDialogFragment.newInstance(notes); frag.setPositiveButton(new NotesDialogFragmentListener() { @Override public void setPositiveButton(String _notes) { householderList.get(selectedHHLoc).setNotes(_notes); adapter.notifyDataSetChanged(); } }); frag.show(fm, NotesDialogFragment.TAG); } @Override public void onListItemClick(ListView l, final View v, final int position, long id) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); if(householderList.get(position).toString() != null && householderList.get(position).toString().length() > 0) builder.setTitle(householderList.get(position).toString()); else builder.setTitle(R.string.menu_options); builder.setItems(getResources().getStringArray(householderList.get(position).isCountedForReturnVisit() ? R.array.time_editor_list_item_options_no_count : R.array.time_editor_list_item_options_count), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int item) { switch(item) { case REF_NOTES: { selectedHHLoc = position; showNotesDialog(householderList.get(position).getNotes()); break; } case REF_ADD_LITERATURE: { selectedHHLoc = position; showFlow = false; showLiteratureTypesDialog(); break; } case REF_DELETE: { anim.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) {} @Override public void onAnimationRepeat(Animation animation) {} @Override public void onAnimationEnd(Animation animation) { /** Remove the item from our list */ householderList.remove(position); adapter.notifyDataSetChanged(); } }); v.startAnimation(anim); break; } case REF_TOGGLE_RETURN_VISIT: { householderList.get(position).toggleCountedForReturnVisit(); adapter.notifyDataSetChanged(); break; } } } }); AlertDialog alert = builder.create(); alert.show(); } @Override public void onDialogNumberSet(int reference, int number, double decimal, boolean isNegative, double fullNumber) { householderList.get(selectedHHLoc).getLit().get(reference).setCount(number); if(showFlow) showNotesDialog(householderList.get(selectedHHLoc).getNotes()); adapter.notifyDataSetChanged(); } }