package com.myMinistry.fragments;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Locale;
import android.annotation.TargetApi;
import android.app.Activity;
import android.database.Cursor;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
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.util.TypedValue;
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.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.TextView;
import com.myMinistry.FragmentActivityStatus;
import com.myMinistry.R;
import com.myMinistry.Techniques;
import com.myMinistry.YoYo;
import com.myMinistry.adapters.NavDrawerMenuItemAdapter;
import com.myMinistry.adapters.TimeEntryAdapter;
import com.myMinistry.dialogfragments.PublisherNewDialogFragment;
import com.myMinistry.dialogfragments.PublisherNewDialogFragment.PublisherNewDialogFragmentListener;
import com.myMinistry.model.NavDrawerMenuItem;
import com.myMinistry.provider.MinistryContract.Publisher;
import com.myMinistry.provider.MinistryContract.Time;
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;
import com.nineoldandroids.animation.Animator;
public class TimeEntriesFragment extends ListFragment {
public static String ARG_YEAR = "year";
public static String ARG_MONTH = "month";
public static String ARG_PUBLISHER_ID = "publisher_id";
public static String ARG_IS_MONTH = "is_month";
public final static int DIRECTION_NO_CHANGE = 0;
private final int DIRECTION_CHANGE_TITLES = 1;
private final int DIRECTION_INCREASE = 2;
private final int DIRECTION_DECREASE = 3;
private boolean is_dual_pane = false;
private boolean is_month = true;
private static final int ANIMATION_DURATION = 200;
private String mMonth, mYear = "";
private Spinner publishers, monthly_or_yearly, view_type;
private TextView month, year;
private LinearLayout monthNavigation;
private NavDrawerMenuItemAdapter pubsAdapter;
private FragmentActivityStatus fragmentActivityStatus;
private FragmentManager fm;
private final SimpleDateFormat buttonFormat = new SimpleDateFormat("MMMM", Locale.getDefault());
private MinistryService database;
private Cursor entries = null;
//private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
private TimeEntryAdapter adapter = null;
private int publisherId = 0;
private Calendar date = Calendar.getInstance(Locale.getDefault());
private Calendar serviceYear = Calendar.getInstance(Locale.getDefault());
private String dbDateFormatted = "";
private String dbTimeFrame = "";
public TimeEntriesFragment newInstance(int month, int year, int _publisherID, boolean is_month) {
TimeEntriesFragment f = new TimeEntriesFragment();
Bundle args = new Bundle();
args.putInt(ARG_YEAR, year);
args.putInt(ARG_MONTH, month);
args.putInt(ARG_PUBLISHER_ID, _publisherID);
args.putBoolean(ARG_IS_MONTH, is_month);
f.setArguments(args);
return f;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.time_entries, menu);
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
fragmentActivityStatus = (FragmentActivityStatus)activity;
}
@Override
public void onPrepareOptionsMenu(Menu menu) {
boolean drawerOpen = fragmentActivityStatus.isDrawerOpen();
if(menu.findItem(R.id.time_entries_add_item) != null)
menu.findItem(R.id.time_entries_add_item).setVisible(!drawerOpen);
super.onPrepareOptionsMenu(menu);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.time_entries, container, false);
Bundle args = getArguments();
fm = getActivity().getSupportFragmentManager();
date.set(Calendar.DAY_OF_MONTH, 1);
if(args != null) {
if(args.containsKey(ARG_YEAR)) {
date.set(Calendar.YEAR, args.getInt(ARG_YEAR));
serviceYear.set(Calendar.YEAR, args.getInt(ARG_YEAR));
}
if(args.containsKey(ARG_MONTH)) {
date.set(Calendar.MONTH, args.getInt(ARG_MONTH));
serviceYear.set(Calendar.MONTH, args.getInt(ARG_MONTH));
}
if(args.containsKey(ARG_PUBLISHER_ID))
setPublisherId(args.getInt(ARG_PUBLISHER_ID));
if(args.containsKey(ARG_IS_MONTH))
is_month = args.getBoolean(ARG_IS_MONTH);
}
view.findViewById(R.id.tv_add_item).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int LAYOUT_ID = (is_dual_pane) ? R.id.secondary_fragment_container : R.id.primary_fragment_container;
FragmentTransaction ft = fm.beginTransaction();
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
Fragment frag = fm.findFragmentById(LAYOUT_ID);
TimeEditorFragment f = new TimeEditorFragment().newInstanceForPublisher(publisherId);
if(frag != null)
ft.remove(frag);
ft.add(LAYOUT_ID, f);
ft.addToBackStack(null);
ft.commit();
}
});
publishers = (Spinner) view.findViewById(R.id.publishers);
monthly_or_yearly = (Spinner) view.findViewById(R.id.monthly_or_yearly);
view_type = (Spinner) view.findViewById(R.id.view_type);
monthNavigation = (LinearLayout) view.findViewById(R.id.monthNavigation);
month = (TextView) view.findViewById(R.id.month);
year = (TextView) view.findViewById(R.id.year);
view.findViewById(R.id.next).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(is_month)
adjustMonth(1);
else
adjustYear(1);
calculateValues();
animatePage(DIRECTION_INCREASE);
}
});
view.findViewById(R.id.prev).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(is_month)
adjustMonth(-1);
else
adjustYear(-1);
calculateValues();
animatePage(DIRECTION_DECREASE);
}
});
database = new MinistryService(getActivity().getApplicationContext());
adapter = new TimeEntryAdapter(getActivity().getApplicationContext(), entries);
pubsAdapter = new NavDrawerMenuItemAdapter(getActivity().getApplicationContext());
setListAdapter(adapter);
ArrayAdapter<String> spinnerArrayAdapter = new ArrayAdapter<String>(this.getActivity().getApplicationContext(), R.layout.li_spinner_item);
spinnerArrayAdapter.setDropDownViewResource(R.layout.li_spinner_item_dropdown);
for(String name : getResources().getStringArray(R.array.summary_time_span)) {
spinnerArrayAdapter.add(name);
}
monthly_or_yearly.setAdapter(spinnerArrayAdapter);
monthly_or_yearly.setSelection((is_month) ? 0 : 1);
monthly_or_yearly.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int position, long id) {
if(position == 0) {
switchToMonthList();
} else {
switchToYearList();
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
ArrayAdapter<String> spinnerArrayAdapterType = new ArrayAdapter<String>(this.getActivity().getApplicationContext(), R.layout.li_spinner_item);
spinnerArrayAdapterType.setDropDownViewResource(R.layout.li_spinner_item_dropdown);
for(String name : getResources().getStringArray(R.array.summary_nav_view_type)) {
spinnerArrayAdapterType.add(name);
}
view_type.setAdapter(spinnerArrayAdapterType);
view_type.setSelection(1);
view_type.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int position, long id) {
if(position == 0) {
((MainActivity)getActivity()).setTitle(R.string.menu_entries);
FragmentTransaction ft = fm.beginTransaction();
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
new SummaryFragment();
SummaryFragment f1 = SummaryFragment.newInstance(PrefUtils.getPublisherId(getActivity().getApplicationContext()));
ft.replace(R.id.primary_fragment_container, f1);
ft.commit();
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
return view;
}
public void updateList() {
month.setText(mMonth);
year.setText(mYear);
database.openWritable();
if(PrefUtils.shouldCalculateRolloverTime(getActivity())) {
entries = database.fetchTimeEntriesByPublisherAndMonth(publisherId, dbDateFormatted, dbTimeFrame);
} else {
entries = database.fetchTimeEntriesByPublisherAndMonthNoRollover(publisherId, dbDateFormatted, dbTimeFrame);
}
adapter.changeCursor(entries);
database.close();
}
public void animatePage(final int changeDirection) {
final Handler mHandler = new Handler();
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
Techniques anim_out_year = Techniques.Pulse;
if(changeDirection == DIRECTION_INCREASE) {
if(date.get(Calendar.MONTH) == Calendar.JANUARY || !is_month) {
anim_out_year = Techniques.SlideOutLeft;
}
} else if(changeDirection == DIRECTION_DECREASE) {
if(date.get(Calendar.MONTH) == Calendar.DECEMBER || !is_month) {
anim_out_year = Techniques.SlideOutRight;
}
} else if(changeDirection == DIRECTION_CHANGE_TITLES) {
anim_out_year = Techniques.SlideOutDown;
}
YoYo.with(anim_out_year).withListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator arg0) {
if(changeDirection == DIRECTION_INCREASE) {
if(is_month) {
YoYo.with(Techniques.SlideOutLeft).duration(ANIMATION_DURATION).playOn(month);
}
} else if(changeDirection == DIRECTION_DECREASE) {
if(is_month) {
YoYo.with(Techniques.SlideOutRight).duration(ANIMATION_DURATION).playOn(month);
}
} else if(changeDirection == DIRECTION_CHANGE_TITLES) {
YoYo.with(Techniques.SlideOutUp).duration(ANIMATION_DURATION).playOn(month);
}
}
@Override
public void onAnimationRepeat(Animator arg0) { }
@Override
public void onAnimationEnd(Animator arg0) {
updateList();
if(changeDirection == DIRECTION_INCREASE) {
if(is_month) {
YoYo.with(Techniques.SlideInRight).duration(ANIMATION_DURATION).playOn(month);
}
if(date.get(Calendar.MONTH) == Calendar.JANUARY || !is_month) {
YoYo.with(Techniques.SlideInRight).duration(ANIMATION_DURATION).playOn(year);
}
} else if(changeDirection == DIRECTION_DECREASE) {
if(is_month) {
YoYo.with(Techniques.SlideInLeft).duration(ANIMATION_DURATION).playOn(month);
}
if(date.get(Calendar.MONTH) == Calendar.DECEMBER || !is_month) {
YoYo.with(Techniques.SlideInLeft).duration(ANIMATION_DURATION).playOn(year);
}
} else if(changeDirection == DIRECTION_CHANGE_TITLES) {
YoYo.with(Techniques.SlideInDown).duration(ANIMATION_DURATION).playOn(month);
YoYo.with(Techniques.SlideInUp).duration(ANIMATION_DURATION).playOn(year);
}
}
@Override
public void onAnimationCancel(Animator arg0) { }
})
.duration(ANIMATION_DURATION)
.playOn(year);
}
}, ANIMATION_DURATION);
}
public void setPublisherId(int _id) {
publisherId = _id;
}
public void switchDate(Calendar _date) {
setDate(_date);
if(is_dual_pane)
updateList();
else
animatePage(DIRECTION_NO_CHANGE);
}
private void setDate(Calendar _date) {
date.set(Calendar.YEAR, _date.get(Calendar.YEAR));
date.set(Calendar.MONTH, _date.get(Calendar.MONTH));
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
entries.moveToPosition(position);
if(entries.getInt(entries.getColumnIndex(Time.ENTRY_TYPE_ID)) != MinistryDatabase.ID_ROLLOVER) {
int LAYOUT_ID = (is_dual_pane) ? R.id.secondary_fragment_container : R.id.primary_fragment_container;
FragmentTransaction ft = fm.beginTransaction();
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
Fragment frag = fm.findFragmentById(LAYOUT_ID);
TimeEditorFragment f = new TimeEditorFragment().newInstance((int) id, publisherId);
if(frag != null)
ft.remove(frag);
ft.add(LAYOUT_ID, f);
ft.addToBackStack(null);
ft.commit();
}
}
@TargetApi(Build.VERSION_CODES.FROYO)
@SuppressWarnings("deprecation")
@Override
public void onActivityCreated(Bundle savedState) {
super.onActivityCreated(savedState);
is_dual_pane = getActivity().findViewById(R.id.secondary_fragment_container) != null;
setHasOptionsMenu((is_dual_pane) ? false : true);
if(is_dual_pane)
monthNavigation.setVisibility(View.GONE);
if(!is_dual_pane) {
loadPublisherAdapter();
/*
LayoutParams lp;
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO) {
lp = new LayoutParams(LayoutParams.MATCH_PARENT,(int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 1, getResources().getDisplayMetrics()));
} else {
lp = new LayoutParams(LayoutParams.FILL_PARENT,(int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 1, getResources().getDisplayMetrics()));
}
View v = new View(getActivity().getApplicationContext());
//v.setPadding(0, (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, getResources().getDisplayMetrics()), 0, 0);
v.setBackgroundResource(R.color.actionbar_background_darker);
v.setLayoutParams(lp);
monthNavigation.addView(v);
//monthNavigation.setPadding(30, 0, 0, (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 5, getResources().getDisplayMetrics()));
*/
}
calculateValues();
updateList();
}
private void adjustMonth(int addValue) {
date.add(Calendar.MONTH, addValue);
saveSharedPrefs();
}
public void adjustYear(int addValue) {
serviceYear.add(Calendar.YEAR, addValue);
}
private void saveSharedPrefs() {
if(getActivity() != null) {
PrefUtils.setSummaryMonthAndYear(getActivity(), date);
}
}
public void switchToYearList(Calendar _date) {
is_month = false;
serviceYear = _date;
if(serviceYear.get(Calendar.MONTH) < SummaryFragment.SERVICE_YEAR_START_MONTH) {
serviceYear.set(serviceYear.get(Calendar.YEAR) -1, SummaryFragment.SERVICE_YEAR_START_MONTH, 1);
} else {
serviceYear.set(serviceYear.get(Calendar.YEAR), SummaryFragment.SERVICE_YEAR_START_MONTH, 1);
}
calculateValues();
refresh(DIRECTION_CHANGE_TITLES);
}
public void switchToMonthList(Calendar _date) {
is_month = true;
date = _date;
calculateValues();
refresh(DIRECTION_CHANGE_TITLES);
}
public void switchToYearList() {
is_month = false;
serviceYear.set(date.get(Calendar.YEAR), date.get(Calendar.MONTH), 1);
if(serviceYear.get(Calendar.MONTH) < SummaryFragment.SERVICE_YEAR_START_MONTH) {
serviceYear.set(serviceYear.get(Calendar.YEAR) -1, SummaryFragment.SERVICE_YEAR_START_MONTH, 1);
} else {
serviceYear.set(serviceYear.get(Calendar.YEAR), SummaryFragment.SERVICE_YEAR_START_MONTH, 1);
}
calculateValues();
refresh(DIRECTION_CHANGE_TITLES);
}
public void switchToMonthList() {
is_month = true;
date.set(serviceYear.get(Calendar.YEAR), serviceYear.get(Calendar.MONTH), 1);
calculateValues();
refresh(DIRECTION_CHANGE_TITLES);
}
public void calculateValues() {
if(is_month) {
mMonth = buttonFormat.format(date.getTime()).toString().toUpperCase(Locale.getDefault());
mYear = String.valueOf(date.get(Calendar.YEAR)).toUpperCase(Locale.getDefault());
dbDateFormatted = TimeUtils.dbDateFormat.format(date.getTime());
dbTimeFrame = "month";
} else {
mMonth = getActivity().getApplicationContext().getResources().getString(R.string.service_year).toUpperCase(Locale.getDefault());
mYear = serviceYear.get(Calendar.YEAR) + " - " + String.valueOf(serviceYear.get(Calendar.YEAR) + 1);
dbDateFormatted = TimeUtils.dbDateFormat.format(serviceYear.getTime());
dbTimeFrame = "year";
}
}
public void refresh(final int changeDirection) {
animatePage(changeDirection);
}
private void loadPublisherAdapter() {
int initialSelection = 0;
// Add new publisher item
pubsAdapter.addItem(new NavDrawerMenuItem(getActivity().getApplicationContext().getString(R.string.menu_add_new_publisher), R.drawable.ic_drawer_publisher, MinistryDatabase.CREATE_ID));
database.openWritable();
final Cursor cursor = database.fetchActivePublishers();
while(cursor.moveToNext()) {
if(cursor.getInt(cursor.getColumnIndex(Publisher._ID)) == publisherId)
initialSelection = pubsAdapter.getCount();
pubsAdapter.addItem(new NavDrawerMenuItem(cursor.getString(cursor.getColumnIndex(Publisher.NAME)), R.drawable.ic_drawer_publisher, cursor.getInt(cursor.getColumnIndex(Publisher._ID))));
}
cursor.close();
database.close();
pubsAdapter.setDropDownViewResource(R.layout.simple_spinner_dropdown_item);
publishers.setAdapter(pubsAdapter);
if(initialSelection != 0)
publishers.setSelection(initialSelection);
publishers.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int position, long id) {
if(pubsAdapter.getItem(position).getID() == MinistryDatabase.CREATE_ID) {
PublisherNewDialogFragment f = PublisherNewDialogFragment.newInstance();
f.setPositiveButton(new PublisherNewDialogFragmentListener() {
@Override
public void setPositiveButton(int _ID, String _name) {
pubsAdapter.addItem(new NavDrawerMenuItem(_name, R.drawable.ic_drawer_publisher, _ID));
publishers.setSelection(pubsAdapter.getCount() - 1);
}
});
f.show(fm, PublisherNewDialogFragment.TAG);
}
else {
setPublisherId(pubsAdapter.getItem(position).getID());
PrefUtils.setPublisherId(getActivity().getApplicationContext(), pubsAdapter.getItem(position).getID());
calculateValues();
animatePage(DIRECTION_NO_CHANGE);
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.time_entries_add_item:
((MainActivity)getActivity()).goToNavDrawerItem(MainActivity.TIME_ENTRY_ID);
return true;
}
return super.onOptionsItemSelected(item);
}
}