Java tutorial
/* * Copyright 2011 Lauri Nevala. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package es.progmac.cuadrante.lib; import java.util.ArrayList; import java.util.Calendar; import java.util.List; import org.joda.time.DateTime; import org.joda.time.DateTimeConstants; import org.joda.time.Days; import org.joda.time.Interval; import org.joda.time.Period; import org.joda.time.Weeks; import es.progmac.cuadrante.R; import es.progmac.cuadrante.info.ComisionInfo; import es.progmac.cuadrante.info.ServicioInfo; import es.progmac.android.others.Utils; import android.content.Context; import android.content.SharedPreferences; import android.content.res.Resources; import android.preference.PreferenceManager; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.animation.GridLayoutAnimationController; import android.widget.BaseAdapter; import android.widget.GridLayout.LayoutParams; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; public class CalendarAdapter extends BaseAdapter { //private static final String TAG = "CalendarAdapter"; static final int FIRST_DAY_OF_WEEK = 1; // Sunday = 0, Monday = 1 private static final String TAG = "CalendarAdapter"; public DatabaseHandler db; private Context mContext; private java.util.Calendar month; private Calendar selectedDate; private ArrayList<String> items; // references to our items public String[] days; public ServicioInfo[] daysWithServices; public ComisionInfo[] daysWithComisions; /** * Si se activa o no el pas en este mes, se modifica desde la funcin * MainActivity.calendarUpdater */ private boolean pas_active = false; public String pas = ""; public int pas_year = 0; public int pas_week = 0; public DateTime dt_pas; /** * Si el calendario tienen que verse los horarios en vez de los servicios */ private boolean view_schedule = false; /** * Se guardan las semanas de servicios correlativas dependiendo de * cual haya sido la elegida inicialmente en configuracin */ public ArrayList<String> pas_list = new ArrayList<String>(); public Pas pasObj = new Pas(); public CalendarAdapter(Context c, Calendar monthCalendar) { month = monthCalendar; selectedDate = (Calendar) monthCalendar.clone(); mContext = c; month.set(Calendar.DAY_OF_MONTH, 1); db = new DatabaseHandler(mContext); pasObj = new Pas(mContext); this.items = new ArrayList<String>(); 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 days.length; } public Object getItem(int position) { return days[position]; } public long getItemId(int position) { return position; } public void setPASActive(boolean active) { pas_active = active; } // 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; boolean schedule_same_line = false; /** * si el item actual equivale al dia actual del calendario para ponerlo como activo */ boolean isViewDayFocused = false; 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.calendar_item, null); } Resources res = mContext.getResources(); //MyLog.d("getView", "width:" + v.getWidth() + " getMeasuredWidth:" + v.getMeasuredWidth()); //si la anchura de cada celda es mayor, podemos mostrar los horarios en la misma fila //MyLog.d(TAG, v.getMeasuredWidth()); if (v.getMeasuredWidth() > 160) { schedule_same_line = true; } if (this.view_schedule) { int min_height; min_height = (schedule_same_line) ? R.integer.MIN_HEIGHT_CALENDAR_ITEM_SCHEDULE_SAME_LINE : R.integer.MIN_HEIGHT_CALENDAR_ITEM_SCHEDULE; v.setMinimumHeight(Utils.getDptoPx(mContext, res.getInteger(min_height))); } else { v.setMinimumHeight(Utils.getDptoPx(mContext, res.getInteger(R.integer.MIN_HEIGHT_CALENDAR_ITEM))); } dayView = (TextView) v.findViewById(R.id.date); dayView.setTextAppearance(v.getContext(), R.style.calendar_item_date); TextView dayServiceView = (TextView) v.findViewById(R.id.date_servicio); dayServiceView.setTextAppearance(v.getContext(), R.style.calendar_item_date_servicio_default); dayServiceView.setText(""); dayServiceView.setTextColor(-1); dayView.setTextColor(-1); v.setVisibility(View.VISIBLE); TextView typeDayNoCountNaturalView = (TextView) v.findViewById(R.id.type_day_no_count_natural); typeDayNoCountNaturalView.setVisibility(View.GONE); //imagen importante estrella ImageView important_image = (ImageView) v.findViewById(R.id.important_star); important_image.setVisibility(View.GONE); //imagen manutencion ImageView manutencion_entera = (ImageView) v.findViewById(R.id.manutencion_entera); manutencion_entera.setVisibility(View.GONE); //imagen importante estrella ImageView manutencion_media = (ImageView) v.findViewById(R.id.manutencion_media); manutencion_media.setVisibility(View.GONE); // disable empty days from the beginning if (days[position].equals("")) { v.setVisibility(View.INVISIBLE); } else { //MyLog.d("getview", "dia: " + selectedDate.get(Calendar.DAY_OF_MONTH)); // mark current day as focused if (month.get(Calendar.YEAR) == selectedDate.get(Calendar.YEAR) && month.get(Calendar.MONTH) == selectedDate.get(Calendar.MONTH) && days[position].equals("" + selectedDate.get(Calendar.DAY_OF_MONTH))) { isViewDayFocused = true; if (Sp.getTodayColorActive(mContext)) { v.setBackgroundColor(Sp.getTodayBgColor(mContext)); dayServiceView.setTextColor(Sp.getTodayTextColor(mContext)); dayView.setTextColor(Sp.getTodayTextColor(mContext)); typeDayNoCountNaturalView.setTextColor(Sp.getTodayTextColor(mContext)); } else { v.setBackgroundResource(R.drawable.item_background_focused); dayServiceView.setTextColor(Cuadrante.TODAY_DEFAULT_TEXT_COLOR); dayView.setTextColor(Cuadrante.TODAY_DEFAULT_TEXT_COLOR); typeDayNoCountNaturalView.setTextColor(Cuadrante.TODAY_DEFAULT_TEXT_COLOR); } } else { v.setBackgroundResource(R.drawable.list_item_background); } } //si el dia es domingo boolean isSunday = false; if (Utils.esMultiplo(position + 1, 7) && !isViewDayFocused) { isSunday = true; //v.setBackgroundColor(Cuadrante.SERVICE_DEFAULT_BG_COLOR_HOLIDAY); v.setBackgroundColor(Sp.getSundayBgColor(mContext)); dayServiceView.setTextColor(Sp.getSundayTextColor(mContext)); dayView.setTextColor(Sp.getSundayTextColor(mContext)); typeDayNoCountNaturalView.setTextColor(Sp.getSundayTextColor(mContext)); } dayView.setText(days[position]); // imprimimos la abreviatura del servicio de este dia if (daysWithServices[position].getId() > 0) { dayServiceView.setText( Cuadrante.getLengthServiceNameSubstring(mContext, daysWithServices[position].getName())); //ver el horario if (this.view_schedule) { String separator = ""; if (schedule_same_line) { separator = " / "; } else { separator = "\n"; } dayServiceView.setText(""); if (!daysWithServices[position].getStartSchedule().equals(Cuadrante.SCHEDULE_NULL) && !daysWithServices[position].getEndSchedule().equals(Cuadrante.SCHEDULE_NULL)) { dayServiceView.setText(daysWithServices[position].getStartSchedule().concat(separator) .concat(daysWithServices[position].getEndSchedule())); } if (!daysWithServices[position].getStartSchedule2().equals(Cuadrante.SCHEDULE_NULL) && !daysWithServices[position].getEndSchedule2().equals(Cuadrante.SCHEDULE_NULL)) { dayServiceView.setText(dayServiceView.getText().toString().concat("\n") .concat(daysWithServices[position].getStartSchedule2()).concat(separator) .concat(daysWithServices[position].getEndSchedule2())); } dayServiceView.setTextAppearance(v.getContext(), R.style.calendar_item_date_servicio_schedule); } else { dayServiceView.setTextAppearance(v.getContext(), R.style.calendar_item_date_servicio); } dayView.setTextAppearance(v.getContext(), R.style.calendar_item_date); if (!isViewDayFocused) {//si el dia no es el de hoy v.setBackgroundColor(Integer.parseInt(daysWithServices[position].getBgColor())); dayServiceView.setTextColor(Integer.parseInt(daysWithServices[position].getTextColor())); dayView.setTextColor(Integer.parseInt(daysWithServices[position].getTextColor())); typeDayNoCountNaturalView.setTextColor(Integer.parseInt(daysWithServices[position].getTextColor())); } else { if (Sp.getTodayColorActive(mContext)) { dayServiceView.setTextColor(Sp.getTodayTextColor(mContext)); dayView.setTextColor(Sp.getTodayTextColor(mContext)); typeDayNoCountNaturalView.setTextColor(Sp.getTodayTextColor(mContext)); } else { dayServiceView.setTextColor(Cuadrante.TODAY_DEFAULT_TEXT_COLOR); dayView.setTextColor(Cuadrante.TODAY_DEFAULT_TEXT_COLOR); typeDayNoCountNaturalView.setTextColor(Cuadrante.TODAY_DEFAULT_TEXT_COLOR); } } //si es domingo y esta activado lo del color rojo para los domingos if (isSunday && Sp.getSundayColorActive(mContext)) { v.setBackgroundColor(Sp.getSundayBgColor(mContext)); dayServiceView.setTextColor(Sp.getSundayTextColor(mContext)); dayView.setTextColor(Sp.getSundayTextColor(mContext)); typeDayNoCountNaturalView.setTextColor(Sp.getSundayTextColor(mContext)); } //tipo de dia -1 if (daysWithServices[position].getTypeDay() == 3) { typeDayNoCountNaturalView.setVisibility(View.VISIBLE); } else//da importante if (daysWithServices[position].getIsImportant() == 1) { important_image.setVisibility(View.VISIBLE); } else//derecho a manutencin if (Sp.getCommissionsManutencionActive(mContext) && daysWithComisions[position].getId() == 0) {//que no sea una comisin Comission comission = new Comission(daysWithServices[position]); switch (comission.hasManutencionOneDay()) { case 1: important_image.setVisibility(View.GONE); manutencion_media.setVisibility(View.VISIBLE); break; case 2: important_image.setVisibility(View.GONE); manutencion_entera.setVisibility(View.VISIBLE); break; } } //MyLog.d("getView", daysWithServices[position].getDate() + " textColor:" + Integer.parseInt(daysWithServices[position].getTextColor())); } else if (daysWithComisions[position].getId() > 0) { dayServiceView.setText( Cuadrante.getLengthServiceNameSubstring(mContext, Cuadrante.CALENDAR_SERVICE_COMISION)); dayServiceView.setTextAppearance(v.getContext(), R.style.textCalendarComision); //Pas //si el pas est activo, sacado de MainActivity.calendarUpdater //}else if(pas_active && !getItem(position).equals("") && pas_list.size() > 0){ } else if (pasObj.active() && pasObj.isCreateList() && !getItem(position).equals("")) { //MyLog.d(TAG, "pas active:" + pasObj.active()); //MyLog.d(TAG, "pas list:" + pasObj.isCreateList()); DateTime dtView = new DateTime(month.get(Calendar.YEAR), month.get(Calendar.MONTH) + 1, Integer.parseInt((String) getItem(position)), 0, 0); String pasText = pasObj.getDay(dtView); if (pasText != null) { dayServiceView.setText(pasText); dayServiceView.setTextAppearance(v.getContext(), R.style.calendar_item_pas); } } // create date string for comparison String date = days[position]; if (date.length() == 1) { date = "0" + date; } String monthStr = "" + (month.get(Calendar.MONTH) + 1); if (monthStr.length() == 1) { monthStr = "0" + monthStr; } return v; } public void refreshDays() { // clear items items.clear(); pasObj = new Pas(mContext); int lastDay = month.getActualMaximum(Calendar.DAY_OF_MONTH); // MyLog.d(TAG, "lastDay: " + lastDay); int firstDay = (int) month.get(Calendar.DAY_OF_WEEK); // MyLog.d(TAG, "firstDay: " + firstDay); // obtenemos todos los servicios del mes List<ServicioInfo> servicios = db.getServicesInMonth(month.get(Calendar.YEAR), month.get(Calendar.MONTH) + 1); //obtenemos todas las comisiones del mes List<ComisionInfo> comisions = db.getComisionInMonth(month.get(Calendar.YEAR), month.get(Calendar.MONTH) + 1); /** * Numero de celdas del mes, contando con las iniciales del mes pasado */ int numDays; // figure size of the array if (firstDay == 1) { numDays = lastDay + (FIRST_DAY_OF_WEEK * 6); } else { numDays = lastDay + firstDay - (FIRST_DAY_OF_WEEK + 1); } days = new String[numDays]; daysWithServices = new ServicioInfo[numDays]; daysWithComisions = new ComisionInfo[numDays]; int j = FIRST_DAY_OF_WEEK; // populate empty days before first real day if (firstDay > 1) { for (j = 0; j < firstDay - FIRST_DAY_OF_WEEK; j++) { days[j] = ""; daysWithServices[j] = new ServicioInfo(); daysWithComisions[j] = new ComisionInfo(); // MyLog.d("firstDay > 1 j", "" + j); } } else { for (j = 0; j < FIRST_DAY_OF_WEEK * 6; j++) { days[j] = ""; daysWithServices[j] = new ServicioInfo(); daysWithComisions[j] = new ComisionInfo(); } j = FIRST_DAY_OF_WEEK * 6 + 1; // sunday => 1, monday => 7 } // populate days int dayNumber = 1; DateTime dateDay = new DateTime(month.get(Calendar.YEAR), month.get(Calendar.MONTH) + 1, dayNumber, 0, 0); for (int i = j - 1; i < days.length; i++) { daysWithServices[i] = new ServicioInfo(); for (ServicioInfo servicio : servicios) { if (servicio.getDay() == dayNumber) { daysWithServices[i] = servicio; break; } } daysWithComisions[i] = new ComisionInfo(); for (ComisionInfo comision : comisions) { if (comision.getInterval().contains(dateDay)) { daysWithComisions[i] = comision; break; } } dateDay = dateDay.plusDays(1); days[i] = "" + dayNumber; dayNumber++; } } /** * Determina si el calendario hay que verse en horarios o servicios * @param view */ public void setViewSchedule(boolean view) { this.view_schedule = view; } public boolean getViewSchedule() { return this.view_schedule; } }