package eoc.studio.voicecard.calendarview; import java.util.Locale; import eoc.studio.voicecard.R; import android.content.Context; import android.content.Intent; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.os.Bundle; import android.os.SystemClock; import android.support.v4.app.Fragment; import android.view.GestureDetector; import android.view.GestureDetector.SimpleOnGestureListener; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnTouchListener; import android.view.ViewConfiguration; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.Button; import android.widget.GridView; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.ViewSwitcher; public class CalendarView extends Fragment implements OnTouchListener, OnClickListener { private static Context mContext; private static Locale locale; private ViewSwitcher calendarSwitcher; private static TextView currentMonth; private static CalendarAdapter calendarAdapter; private GestureDetector swipeDetector; private static GridView calendarGrid; // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public CalendarView() { locale = Locale.getDefault(); } // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @Override public void onResume() { super.onResume(); mContext = getActivity(); updateCurrentMonth(); // getNewView(); } // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @Override public void onDestroy() { super.onDestroy(); DateProcess.mCalendar.setTimeInMillis(System.currentTimeMillis()); calendarAdapter = null; SystemClock.sleep(200); } // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mContext = getActivity(); final RelativeLayout calendarLayout = (RelativeLayout) inflater.inflate(R.layout.calendar_view, null); calendarGrid = (GridView) calendarLayout.findViewById(R.id.calendar_grid); final Button nextMonth = (Button) calendarLayout.findViewById(R.id.next_month); final Button prevMonth = (Button) calendarLayout.findViewById(R.id.previous_month); swipeDetector = new GestureDetector(getActivity(), new SwipeGesture(getActivity())); calendarSwitcher = (ViewSwitcher) calendarLayout.findViewById(R.id.calendar_switcher); currentMonth = (TextView) calendarLayout.findViewById(R.id.current_month); // nextMonth.setOnClickListener(this); prevMonth.setOnClickListener(this); getNewView(); calendarGrid.setOnTouchListener(this); calendarGrid.setOnItemClickListener(new DayItemClickListener()); return calendarLayout; } // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// protected static void getNewView() { calendarAdapter = new CalendarAdapter(mContext, DateProcess.mCalendar); updateCurrentMonth(); calendarGrid.setSelector(new ColorDrawable(Color.TRANSPARENT)); calendarGrid.setAdapter(calendarAdapter); } // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @Override public boolean onTouch(View v, MotionEvent event) { return swipeDetector.onTouchEvent(event); } // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// protected static void updateCurrentMonth() { calendarAdapter.refreshDays(); currentMonth.setText(DateProcess.getYear() + "-" + String.format(locale, "%tB", DateProcess.mCalendar)); } // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// private final class DayItemClickListener implements OnItemClickListener { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Intent SetCalendarMainView = new Intent(); SetCalendarMainView.setClass(getActivity(), SetCalendarMainView.class); Bundle bundle = new Bundle(); bundle.putString(DataProcess.EVENT_DATE, calendarAdapter.setSelected(position)); SetCalendarMainView.putExtras(bundle); getActivity().startActivity(SetCalendarMainView); getActivity().overridePendingTransition(0, 0); } } // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// protected final void onNextMonth() { calendarSwitcher.setInAnimation(getActivity(), R.anim.in_from_right); calendarSwitcher.setOutAnimation(getActivity(), R.anim.out_to_left); calendarSwitcher.showNext(); DateProcess.setNextMonthCalendar(); updateCurrentMonth(); } // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// protected final void onPreviousMonth() { calendarSwitcher.setInAnimation(getActivity(), R.anim.in_from_left); calendarSwitcher.setOutAnimation(getActivity(), R.anim.out_to_right); calendarSwitcher.showPrevious(); DateProcess.setPreviousMonthCalendar(); updateCurrentMonth(); } // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @Override public void onClick(View view) { switch (view.getId()) { case R.id.next_month: { onNextMonth(); } break; case R.id.previous_month: { onPreviousMonth(); } break; } } // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// private final class SwipeGesture extends SimpleOnGestureListener { private final int swipeMinDistance; private final int swipeThresholdVelocity; public SwipeGesture(Context context) { final ViewConfiguration viewConfig = ViewConfiguration.get(context); swipeMinDistance = viewConfig.getScaledTouchSlop(); swipeThresholdVelocity = viewConfig.getScaledMinimumFlingVelocity(); } @Override public boolean onFling(MotionEvent me1, MotionEvent me2, float velocityX, float velocityY) { if (me1.getX() - me2.getX() > swipeMinDistance && Math.abs(velocityX) > swipeThresholdVelocity) { onNextMonth(); } else if (me2.getX() - me1.getX() > swipeMinDistance && Math.abs(velocityX) > swipeThresholdVelocity) { onPreviousMonth(); } return true; } } // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// }