package com.ihateflyingbugs.kidsm.schedule; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.List; import java.util.Locale; import com.ihateflyingbugs.kidsm.R; import android.content.Context; import android.graphics.Color; import android.util.Log; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; public class CalendarAdapter extends BaseAdapter { private Context mContext; private java.util.Calendar month; public GregorianCalendar pmonth; // calendar instance for previous month /** * calendar instance for previous month for getting complete view */ public GregorianCalendar pmonthmaxset; private GregorianCalendar selectedDate; int firstDay; int maxWeeknumber; int maxP; int calMaxP; int lastWeekDay; int leftDays; int mnthlength; String itemvalue, currentDateString; DateFormat df; //private ArrayList<String> items; ArrayList<CalendarEvent> eventList; public static List<String> dayString; public static List<String> previousDayString; private View previousView; public CalendarAdapter(Context c, GregorianCalendar monthCalendar, ArrayList<CalendarEvent> eventList) { CalendarAdapter.dayString = new ArrayList<String>(); CalendarAdapter.previousDayString = new ArrayList<String>(); Locale.setDefault(Locale.US); month = monthCalendar; selectedDate = (GregorianCalendar) monthCalendar.clone(); mContext = c; month.set(GregorianCalendar.DAY_OF_MONTH, 1); //this.items = new ArrayList<String>(); this.eventList = eventList; df = new SimpleDateFormat("yyyy-MM-dd", Locale.US); currentDateString = df.format(selectedDate.getTime()); refreshDays(); } public void setItems(ArrayList<String> items) { for (int i = 0; i != items.size(); i++) { if (items.get(i).length() == 1) { items.set(i, "0" + items.get(i)); } } //this.items = items; } public int getCount() { return dayString.size(); } public Object getItem(int position) { return dayString.get(position); } public long getItemId(int position) { return 0; } // create a new view for each item referenced by the Adapter public View getView(int position, View convertView, ViewGroup parent) { View v = convertView; TextView dayView; if (convertView == null) { // if it's not recycled, initialize some // attributes LayoutInflater vi = (LayoutInflater) mContext .getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = vi.inflate(R.layout.schedule_calendar_item, null); } dayView = (TextView) v.findViewById(R.id.date); dayView.setGravity(Gravity.CENTER); // separates daystring into parts. Calendar cal = Calendar.getInstance(); String[] separatedTime = dayString.get(position).split("-"); Date todayDateValue; try { todayDateValue = new SimpleDateFormat("yyyy-MM-dd").parse(dayString.get(position)); cal.setTime(todayDateValue); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } // taking last part of date. ie; 2 from 2012-12-02 String gridvalue = separatedTime[2].replaceFirst("^0*", ""); // checking whether the day is in current month or not. if ((Integer.parseInt(gridvalue) > 1) && (position < firstDay)) { // setting offdays to white color. dayView.setTextColor(Color.WHITE); dayView.setClickable(false); dayView.setFocusable(false); } else if ((Integer.parseInt(gridvalue) < 7) && (position > 28)) { dayView.setTextColor(Color.WHITE); dayView.setClickable(false); dayView.setFocusable(false); } else { // setting curent month's days in blue color. if(cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) dayView.setTextColor(Color.parseColor("#FF5258")); else dayView.setTextColor(Color.parseColor("#6D6E70")); } if (dayString.get(position).equals(currentDateString)) { setSelected(v); previousView = v; } else { v.setBackgroundResource(R.drawable.schedule_calendar_cell); } dayView.setText(gridvalue); // create date string for comparison String date = dayString.get(position); if (date.length() == 1) { date = "0" + date; } String monthStr = "" + (month.get(GregorianCalendar.MONTH) + 1); if (monthStr.length() == 1) { monthStr = "0" + monthStr; } // show icon if date is not empty and it exists in the items array ImageView iw = (ImageView) v.findViewById(R.id.date_icon); if (date.length() > 0 && eventList != null ) { int counter = 0; ArrayList<CalendarEvent> eventOnSameDate = new ArrayList<CalendarEvent>(); for( int i = 0; i < eventList.size(); i++ ) { if( eventList.get(i).startDate.equals(date) ) { eventOnSameDate.add(eventList.get(i)); counter++; } } if(eventOnSameDate.size() != 0 ) { iw.setVisibility(View.VISIBLE); if(eventOnSameDate.size() == 1 ) { switch( eventOnSameDate.get(0).type ) { case 0: iw.setImageDrawable(mContext.getResources().getDrawable(R.drawable.cal_month_icon_schedule)); dayView.setTextColor(Color.parseColor("#FF5258")); break; case 1: iw.setImageDrawable(mContext.getResources().getDrawable(R.drawable.cal_month_icon_birthday)); dayView.setTextColor(Color.parseColor("#FFA2C2")); break; } } else { int scheduleCounter = 0, birthdayCounter = 0; for(int i = 0; i < eventOnSameDate.size(); i++) { switch( eventOnSameDate.get(i).type ) { case 0: scheduleCounter++; break; case 1: birthdayCounter++; break; } } if( scheduleCounter == 0 ) { iw.setImageDrawable(mContext.getResources().getDrawable(R.drawable.cal_month_icon_birthday)); dayView.setTextColor(Color.parseColor("#FFA2C2")); } else if( birthdayCounter == 0 ) { iw.setImageDrawable(mContext.getResources().getDrawable(R.drawable.cal_month_icon_schedule)); dayView.setTextColor(Color.parseColor("#FF5258")); } else { iw.setImageDrawable(mContext.getResources().getDrawable(R.drawable.cal_month_icon_both)); dayView.setTextColor(Color.parseColor("#FF5258")); } } } else iw.setVisibility(View.INVISIBLE); } return v; } public View setSelected(View view) { if (previousView != null) { previousView.setBackgroundResource(R.drawable.schedule_calendar_cell); } previousView = view; view.setBackgroundResource(R.drawable.calendar_cel_selectl); return view; } // public static List<String> getCalendarFromCurrentMonth(int gapIndex) { // List<String> cal = new ArrayList<String>(); // // for (int n = 0; n < mnthlength; n++) { // itemvalue = df.format(pmonthmaxset.getTime()); // pmonthmaxset.add(GregorianCalendar.DATE, 1); // dayString.add(itemvalue); // } // // return cal; // } public void refreshDays() { // clear items //items.clear(); dayString.clear(); Locale.setDefault(Locale.US); pmonth = (GregorianCalendar) month.clone(); // month start day. ie; sun, mon, etc firstDay = month.get(GregorianCalendar.DAY_OF_WEEK); // finding number of weeks in current month. maxWeeknumber = month.getActualMaximum(GregorianCalendar.WEEK_OF_MONTH); // allocating maximum row number for the gridview. mnthlength = maxWeeknumber * 7; maxP = getMaxP(); // previous month maximum day 31,30.... calMaxP = maxP - (firstDay - 1);// calendar offday starting 24,25 ... /** * Calendar instance for getting a complete gridview including the three * month's (previous,current,next) dates. */ pmonthmaxset = (GregorianCalendar) pmonth.clone(); /** * setting the start date as previous month's required date. */ pmonthmaxset.set(GregorianCalendar.DAY_OF_MONTH, calMaxP + 1); /** * filling calendar gridview. */ for (int n = 0; n < mnthlength; n++) { itemvalue = df.format(pmonthmaxset.getTime()); pmonthmaxset.add(GregorianCalendar.DATE, 1); dayString.add(itemvalue); } } private int getMaxP() { int maxP; if (month.get(GregorianCalendar.MONTH) == month .getActualMinimum(GregorianCalendar.MONTH)) { pmonth.set((month.get(GregorianCalendar.YEAR) - 1), month.getActualMaximum(GregorianCalendar.MONTH), 1); } else { pmonth.set(GregorianCalendar.MONTH, month.get(GregorianCalendar.MONTH) - 1); } maxP = pmonth.getActualMaximum(GregorianCalendar.DAY_OF_MONTH); return maxP; } }