package com.myMinistry.fragments;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.ContentValues;
import android.content.DialogInterface;
import android.database.Cursor;
import android.os.Bundle;
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.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import com.myMinistry.FragmentActivityStatus;
import com.myMinistry.R;
import com.myMinistry.adapters.ItemAdapter;
import com.myMinistry.dialogfragments.EntryTypeNewDialogFrag;
import com.myMinistry.dialogfragments.EntryTypeNewDialogFrag.EntryTypeNewDialogFragListener;
import com.myMinistry.model.NavDrawerMenuItem;
import com.myMinistry.provider.MinistryContract.EntryType;
import com.myMinistry.provider.MinistryDatabase;
import com.myMinistry.provider.MinistryService;
import com.myMinistry.util.PrefUtils;
public class EntryTypeManagerFrag extends ListFragment {
private boolean is_dual_pane = false;
private Cursor cursor;
private ItemAdapter adapter;
private ContentValues values = null;
private MinistryService database;
private FragmentManager fm;
private FragmentActivityStatus fragmentActivityStatus;
private final int RENAME_ID = 0;
private final int TRANSFER_ID = 1;
private final int DELETE_ID = 2;
public EntryTypeManagerFrag newInstance() {
return new EntryTypeManagerFrag();
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
fragmentActivityStatus = (FragmentActivityStatus)activity;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.entry_type_manager, container, false);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.sorting_used, menu);
}
@Override
public void onPrepareOptionsMenu(Menu menu) {
boolean drawerOpen = fragmentActivityStatus.isDrawerOpen();
if(menu.findItem(R.id.sort_container) != null)
menu.findItem(R.id.sort_container).setVisible(!drawerOpen);
if(menu.findItem(R.id.manage_new) != null)
menu.findItem(R.id.manage_new).setVisible(!drawerOpen);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.manage_new:
if(is_dual_pane) {
populateEditor(MinistryDatabase.CREATE_ID);
}
else {
EntryTypeNewDialogFrag f = EntryTypeNewDialogFrag.newInstance();
f.setPositiveButton(new EntryTypeNewDialogFragListener() {
@Override
public void setPositiveButton(boolean created) {
sortList(PrefUtils.getEntryTypeSort(getActivity()));
}
});
f.show(fm, EntryTypeNewDialogFrag.class.getName());
}
return true;
case R.id.sort_alpha:
PrefUtils.setEntryTypeSort(getActivity(), MinistryDatabase.SORT_BY_ASC);
sortList(MinistryDatabase.SORT_BY_ASC);
return true;
case R.id.sort_alpha_desc:
PrefUtils.setEntryTypeSort(getActivity(), MinistryDatabase.SORT_BY_DESC);
sortList(MinistryDatabase.SORT_BY_DESC);
return true;
case R.id.sort_most_used:
PrefUtils.setEntryTypeSort(getActivity(), MinistryDatabase.SORT_BY_POPULAR);
sortList(MinistryDatabase.SORT_BY_POPULAR);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
is_dual_pane = getActivity().findViewById(R.id.secondary_fragment_container) != null;
setHasOptionsMenu(true);
fm = getActivity().getSupportFragmentManager();
database = new MinistryService(getActivity().getApplicationContext());
database.openWritable();
adapter = new ItemAdapter(getActivity().getApplicationContext());
loadCursor();
setListAdapter(adapter);
database.close();
if (is_dual_pane) {
Fragment frag = fm.findFragmentById(R.id.secondary_fragment_container);
EntryTypeManagerEditorFrag f = new EntryTypeManagerEditorFrag().newInstance(MinistryDatabase.CREATE_ID);
FragmentTransaction ft = fm.beginTransaction();
if(frag != null)
ft.remove(frag);
ft.add(R.id.secondary_fragment_container, f);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.addToBackStack(null);
ft.commit();
}
}
private void populateEditor(long id) {
EntryTypeManagerEditorFrag f = (EntryTypeManagerEditorFrag) fm.findFragmentById(R.id.secondary_fragment_container);
f.switchForm(id);
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
createDialog(adapter.getItem(position).getID(), adapter.getItem(position).toString(), (adapter.getItem(position).getID() == MinistryDatabase.ID_ROLLOVER) ? 0 : 1);
}
private void createDialog(final long id, String name, int isActive) {
switch((int)id) {
case MinistryDatabase.ID_ROLLOVER:
case MinistryDatabase.ID_BIBLE_STUDY:
case MinistryDatabase.ID_RETURN_VISIT:
case MinistryDatabase.ID_SERVICE:
case MinistryDatabase.ID_RBC:
case MinistryDatabase.CREATE_ID:
if(is_dual_pane)
populateEditor(id);
else
showEditTextDialog((int)id,name,isActive);
break;
default:
showListItems((int)id,name,isActive);
}
}
@SuppressLint("InflateParams")
private void showEditTextDialog(final int id, String name, int isActive) {
View view = LayoutInflater.from(getActivity().getApplicationContext()).inflate(R.layout.d_edit_text_with_cb, null);
AlertDialog.Builder builder = new Builder(EntryTypeManagerFrag.this.getActivity());
final EditText editText = (EditText) view.findViewById(R.id.text1);
final CheckBox cb_is_active = (CheckBox) view.findViewById(R.id.cb_is_active);
final TextView tv_note = (TextView) view.findViewById(R.id.tv_note);
editText.setText(name);
cb_is_active.setChecked(isActive != 0 ? true : false);
if(id == MinistryDatabase.ID_ROLLOVER) {
cb_is_active.setEnabled(false);
cb_is_active.setTextColor(getActivity().getApplicationContext().getResources().getColor(R.color.holo_grey_light));
tv_note.setVisibility(View.VISIBLE);
}
builder.setView(view);
builder.setTitle(id != MinistryDatabase.CREATE_ID ? R.string.form_rename : R.string.form_name);
builder.setNegativeButton(R.string.menu_cancel, null); // Do nothing on cancel - this will dismiss the dialog :)
builder.setPositiveButton(R.string.menu_save, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if(values == null)
values = new ContentValues();
values.put(EntryType.NAME, editText.getText().toString());
values.put(EntryType.RBC, id != MinistryDatabase.ID_RBC ? MinistryService.INACTIVE : MinistryService.ACTIVE);
if(id != MinistryDatabase.ID_ROLLOVER)
values.put(EntryType.ACTIVE, (cb_is_active.isChecked()) ? MinistryService.ACTIVE : MinistryService.INACTIVE);
else
values.put(EntryType.ACTIVE, MinistryService.INACTIVE);
database.openWritable();
if(id != MinistryDatabase.CREATE_ID)
database.saveEntryType(id, values);
else
database.createEntryType(values);
reloadCursor();
database.close();
}
});
builder.show();
}
public void showListItems(final int id, final String name, final int isActive) {
AlertDialog.Builder builder = new Builder(EntryTypeManagerFrag.this.getActivity());
builder.setTitle(R.string.menu_options);
builder.setItems(getResources().getStringArray(R.array.entry_type_list_item_options), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch(which) {
case RENAME_ID:
if(is_dual_pane) {
populateEditor(id);
}
else {
showEditTextDialog(id, name, isActive);
sortList(PrefUtils.getEntryTypeSort(getActivity()));
}
break;
case TRANSFER_ID:
showTransferToDialog(id, name);
break;
case DELETE_ID:
database.openWritable();
database.deleteEntryTypeByID(id);
if(is_dual_pane)
populateEditor(MinistryDatabase.CREATE_ID);
sortList(PrefUtils.getEntryTypeSort(getActivity()));
database.close();
break;
}
}
});
builder.show();
}
public void showTransferToDialog(final int id, final String name) {
AlertDialog.Builder builder = new Builder(EntryTypeManagerFrag.this.getActivity());
database.openWritable();
final Cursor defaults = database.fetchAllEntryTypesButID(id);
builder.setTitle(R.string.menu_transfer_to);
builder.setCursor(defaults, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
defaults.moveToPosition(which);
database.reassignEntryType(id, defaults.getInt(defaults.getColumnIndex(EntryType._ID)));
sortList(PrefUtils.getEntryTypeSort(getActivity()));
}
}, EntryType.NAME);
builder.show();
}
private void loadCursor() {
if(!database.isOpen())
database.openWritable();
adapter.clear();
final Cursor cursor = database.fetchAllEntryTypes();
while(cursor.moveToNext())
adapter.addItem(new NavDrawerMenuItem(cursor.getString(cursor.getColumnIndex(EntryType.NAME)), R.drawable.ic_drawer_entry_types, cursor.getInt(cursor.getColumnIndex(EntryType._ID))));
cursor.close();
database.close();
}
public void reloadCursor() {
loadCursor();
adapter.notifyDataSetChanged();
}
public void sortList(int how_to_sort) {
if(!database.isOpen())
database.openWritable();
if(how_to_sort == MinistryDatabase.SORT_BY_ASC)
cursor = database.fetchAllEntryTypes("ASC");
else if(how_to_sort == MinistryDatabase.SORT_BY_DESC)
cursor = database.fetchAllEntryTypes("DESC");
else if(how_to_sort == MinistryDatabase.SORT_BY_POPULAR)
cursor = database.fetchAllEntryTypesByPopularity();
else
cursor = null;
if(cursor != null) {
int count = 0;
ContentValues values = new ContentValues();
for(cursor.moveToFirst();!cursor.isAfterLast();cursor.moveToNext()) {
count++;
values.put(EntryType.SORT_ORDER, count);
database.saveEntryType(cursor.getLong(cursor.getColumnIndex(EntryType._ID)), values);
}
}
reloadCursor();
}
}