package com.byagowi.persiancalendar.adapter; import android.content.Context; import android.os.Build; import android.support.v4.content.ContextCompat; import android.support.v7.widget.RecyclerView; import android.util.TypedValue; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import com.byagowi.persiancalendar.Constants; import com.byagowi.persiancalendar.R; import com.byagowi.persiancalendar.entity.DayEntity; import com.byagowi.persiancalendar.util.Utils; import com.byagowi.persiancalendar.view.fragment.MonthFragment; import java.util.List; public class MonthAdapter extends RecyclerView.Adapter<MonthAdapter.ViewHolder> { private Context context; private MonthFragment monthFragment; private final int TYPE_HEADER = 0; private final int TYPE_DAY = 1; private List<DayEntity> days; private int selectedDay = -1; private boolean persianDigit; private Utils utils; private TypedValue colorHoliday = new TypedValue(); private TypedValue colorTextHoliday = new TypedValue(); private TypedValue colorPrimary = new TypedValue(); private TypedValue colorDayName = new TypedValue(); private final int firstDayDayOfWeek; private final int totalDays; public MonthAdapter(Context context, MonthFragment monthFragment, List<DayEntity> days) { firstDayDayOfWeek = days.get(0).getDayOfWeek(); totalDays = days.size(); this.monthFragment = monthFragment; this.context = context; this.days = days; utils = Utils.getInstance(context); persianDigit = utils.isPersianDigitSelected(); context.getTheme().resolveAttribute(R.attr.colorHoliday, colorHoliday, true); context.getTheme().resolveAttribute(R.attr.colorTextHoliday, colorTextHoliday, true); context.getTheme().resolveAttribute(R.attr.colorPrimary, colorPrimary, true); context.getTheme().resolveAttribute(R.attr.colorTextDayName, colorDayName, true); } public void clearSelectedDay() { selectedDay = -1; notifyDataSetChanged(); } public void selectDay(int dayOfMonth) { selectedDay = dayOfMonth + 6 + firstDayDayOfWeek; notifyDataSetChanged(); } public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener { TextView num; View today; View selectDay; View event; public ViewHolder(View itemView) { super(itemView); num = (TextView) itemView.findViewById(R.id.num); today = itemView.findViewById(R.id.today); selectDay = itemView.findViewById(R.id.select_day); event = itemView.findViewById(R.id.event); itemView.setOnClickListener(this); itemView.setOnLongClickListener(this); } @Override public void onClick(View v) { int position = getAdapterPosition(); position += 6 - (position % 7) * 2; if (totalDays < position - 6 - firstDayDayOfWeek) { return; } if (position - 7 - firstDayDayOfWeek >= 0) { monthFragment.onClickItem(days .get(position - 7 - firstDayDayOfWeek) .getPersianDate()); selectedDay = position; notifyDataSetChanged(); } } @Override public boolean onLongClick(View v) { int position = getAdapterPosition(); position += 6 - (position % 7) * 2; if (totalDays < position - 6 - firstDayDayOfWeek) { return false; } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { try { monthFragment.onLongClickItem(days .get(position - 7 - firstDayDayOfWeek) .getPersianDate()); } catch (Exception e) { // Ignore it for now // I guess it will occur on CyanogenMod phones // where Google extra things is not installed } } return false; } } @Override public MonthAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View v = LayoutInflater.from(context).inflate(R.layout.item_day, parent, false); return new ViewHolder(v); } @Override public void onBindViewHolder(MonthAdapter.ViewHolder holder, int position) { position += 6 - (position % 7) * 2; if (totalDays < position - 6 - firstDayDayOfWeek) { return; } if (!isPositionHeader(position)) { if (position - 7 - firstDayDayOfWeek >= 0) { holder.num.setText(days.get(position - 7 - days.get(0).getDayOfWeek()).getNum()); holder.num.setVisibility(View.VISIBLE); if (persianDigit) { holder.num.setTextSize(25); } else { holder.num.setTextSize(20); } if (days.get(position - 7 - firstDayDayOfWeek).isHoliday()) { holder.num.setTextColor(ContextCompat.getColor(context, colorHoliday.resourceId)); } else { holder.num.setTextColor(ContextCompat.getColor(context, R.color.dark_text_day)); } if (days.get(position - 7 - firstDayDayOfWeek).isEvent()) { holder.event.setVisibility(View.VISIBLE); } else { holder.event.setVisibility(View.GONE); } if (days.get(position - 7 - firstDayDayOfWeek).isToday()) { holder.today.setVisibility(View.VISIBLE); } else { holder.today.setVisibility(View.GONE); } if (position == selectedDay) { holder.selectDay.setVisibility(View.VISIBLE); if (days.get(position - 7 - firstDayDayOfWeek).isHoliday()) { holder.num.setTextColor(ContextCompat.getColor(context, colorTextHoliday.resourceId)); } else { holder.num.setTextColor(ContextCompat.getColor(context, colorPrimary.resourceId)); } } else { holder.selectDay.setVisibility(View.GONE); } } else { holder.today.setVisibility(View.GONE); holder.selectDay.setVisibility(View.GONE); holder.num.setVisibility(View.GONE); holder.event.setVisibility(View.GONE); } utils.setFontAndShape(holder.num); } else { holder.num.setText(Constants.FIRST_CHAR_OF_DAYS_OF_WEEK_NAME[position]); holder.num.setTextColor(ContextCompat.getColor(context, colorDayName.resourceId)); holder.num.setTextSize(20); holder.today.setVisibility(View.GONE); holder.selectDay.setVisibility(View.GONE); holder.event.setVisibility(View.GONE); holder.num.setVisibility(View.VISIBLE); utils.setFont(holder.num); } } @Override public int getItemCount() { return 7 * 7; // days of week * month view rows } @Override public int getItemViewType(int position) { if (isPositionHeader(position)) { return TYPE_HEADER; } else { return TYPE_DAY; } } private boolean isPositionHeader(int position) { return position < 7; } }