package com.byagowi.persiancalendar.view.fragment;
import android.annotation.TargetApi;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.provider.CalendarContract;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v4.view.ViewPager;
import android.support.v7.widget.AppCompatImageView;
import android.support.v7.widget.CardView;
import android.text.TextUtils;
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.RelativeLayout;
import android.widget.TextView;
import com.byagowi.persiancalendar.Constants;
import com.byagowi.persiancalendar.R;
import com.byagowi.persiancalendar.adapter.CalendarAdapter;
import com.byagowi.persiancalendar.util.Utils;
import com.byagowi.persiancalendar.view.dialog.SelectDayDialog;
import com.github.praytimes.Clock;
import com.github.praytimes.Coordinate;
import com.github.praytimes.PrayTime;
import com.github.praytimes.PrayTimesCalculator;
import java.util.Calendar;
import java.util.Date;
import java.util.Map;
import calendar.CivilDate;
import calendar.DateConverter;
import calendar.PersianDate;
public class CalendarFragment extends Fragment
implements View.OnClickListener, ViewPager.OnPageChangeListener {
private ViewPager monthViewPager;
private Utils utils;
private Calendar calendar = Calendar.getInstance();
private Coordinate coordinate;
private PrayTimesCalculator prayTimesCalculator;
private TextView fajrTextView;
private TextView dhuhrTextView;
private TextView asrTextView;
private TextView maghribTextView;
private TextView ishaTextView;
private TextView sunriseTextView;
private TextView sunsetTextView;
private TextView midnightTextView;
private TextView weekDayName;
private TextView gregorianDate;
private TextView islamicDate;
private TextView shamsiDate;
private TextView eventTitle;
private TextView holidayTitle;
private TextView today;
private AppCompatImageView todayIcon;
private AppCompatImageView moreOwghat;
private CardView owghat;
private CardView event;
private RelativeLayout fajrLayout;
private RelativeLayout sunriseLayout;
private RelativeLayout dhuhrLayout;
private RelativeLayout asrLayout;
private RelativeLayout sunsetLayout;
private RelativeLayout maghribLayout;
private RelativeLayout ishaLayout;
private RelativeLayout midnightLayout;
private int viewPagerPosition;
@Nullable
@Override
public View onCreateView(
LayoutInflater inflater,
@Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
setHasOptionsMenu(true);
View view = inflater.inflate(R.layout.fragment_calendar, container, false);
utils = Utils.getInstance(getContext());
utils.clearYearWarnFlag();
viewPagerPosition = 0;
fajrLayout = (RelativeLayout) view.findViewById(R.id.fajrLayout);
sunriseLayout = (RelativeLayout) view.findViewById(R.id.sunriseLayout);
dhuhrLayout = (RelativeLayout) view.findViewById(R.id.dhuhrLayout);
asrLayout = (RelativeLayout) view.findViewById(R.id.asrLayout);
sunsetLayout = (RelativeLayout) view.findViewById(R.id.sunsetLayout);
maghribLayout = (RelativeLayout) view.findViewById(R.id.maghribLayout);
ishaLayout = (RelativeLayout) view.findViewById(R.id.ishaLayout);
midnightLayout = (RelativeLayout) view.findViewById(R.id.midnightLayout);
gregorianDate = (TextView) view.findViewById(R.id.gregorian_date);
utils.setFont(gregorianDate);
islamicDate = (TextView) view.findViewById(R.id.islamic_date);
utils.setFont(islamicDate);
shamsiDate = (TextView) view.findViewById(R.id.shamsi_date);
utils.setFont(shamsiDate);
weekDayName = (TextView) view.findViewById(R.id.week_day_name);
utils.setFont(weekDayName);
today = (TextView) view.findViewById(R.id.today);
todayIcon = (AppCompatImageView) view.findViewById(R.id.today_icon);
fajrTextView = (TextView) view.findViewById(R.id.fajr);
utils.setFont(fajrTextView);
utils.setFontAndShape((TextView) view.findViewById(R.id.fajrText));
dhuhrTextView = (TextView) view.findViewById(R.id.dhuhr);
utils.setFont(dhuhrTextView);
utils.setFontAndShape((TextView) view.findViewById(R.id.dhuhrText));
asrTextView = (TextView) view.findViewById(R.id.asr);
utils.setFont(asrTextView);
utils.setFontAndShape((TextView) view.findViewById(R.id.asrText));
maghribTextView = (TextView) view.findViewById(R.id.maghrib);
utils.setFont(maghribTextView);
utils.setFontAndShape((TextView) view.findViewById(R.id.maghribText));
ishaTextView = (TextView) view.findViewById(R.id.isgha);
utils.setFont(ishaTextView);
utils.setFontAndShape((TextView) view.findViewById(R.id.ishaText));
sunriseTextView = (TextView) view.findViewById(R.id.sunrise);
utils.setFont(sunriseTextView);
utils.setFontAndShape((TextView) view.findViewById(R.id.sunriseText));
sunsetTextView = (TextView) view.findViewById(R.id.sunset);
utils.setFont(sunsetTextView);
utils.setFontAndShape((TextView) view.findViewById(R.id.sunsetText));
midnightTextView = (TextView) view.findViewById(R.id.midnight);
utils.setFont(midnightTextView);
utils.setFontAndShape((TextView) view.findViewById(R.id.midnightText));
moreOwghat = (AppCompatImageView) view.findViewById(R.id.more_owghat);
eventTitle = (TextView) view.findViewById(R.id.event_title);
utils.setFont(eventTitle);
holidayTitle = (TextView) view.findViewById(R.id.holiday_title);
utils.setFont(holidayTitle);
owghat = (CardView) view.findViewById(R.id.owghat);
event = (CardView) view.findViewById(R.id.cardEvent);
monthViewPager = (ViewPager) view.findViewById(R.id.calendar_pager);
coordinate = utils.getCoordinate();
prayTimesCalculator = new PrayTimesCalculator(utils.getCalculationMethod());
monthViewPager.setAdapter(new CalendarAdapter(getChildFragmentManager()));
monthViewPager.setCurrentItem(Constants.MONTHS_LIMIT / 2);
monthViewPager.addOnPageChangeListener(this);
owghat.setOnClickListener(this);
today.setOnClickListener(this);
todayIcon.setOnClickListener(this);
gregorianDate.setOnClickListener(this);
islamicDate.setOnClickListener(this);
shamsiDate.setOnClickListener(this);
utils.setFontAndShape((TextView) view.findViewById(R.id.event_card_title));
utils.setFontAndShape((TextView) view.findViewById(R.id.today));
utils.setFontAndShape((TextView) view.findViewById(R.id.owghat_text));
String cityName = utils.getCityName(false);
if (!TextUtils.isEmpty(cityName)) {
((TextView) view.findViewById(R.id.owghat_text))
.append(" (" + utils.shape(cityName) + ")");
}
// This will immediately be replaced by the same functionality on fragment but is here to
// make sure enough space is dedicated to actionbar's title and subtitle, kinda hack anyway
PersianDate today = utils.getToday();
utils.setActivityTitleAndSubtitle(getActivity(), utils.getMonthName(today),
utils.formatNumber(today.getYear()));
return view;
}
public void changeMonth(int position) {
monthViewPager.setCurrentItem(monthViewPager.getCurrentItem() + position, true);
}
public void selectDay(PersianDate persianDate) {
weekDayName.setText(utils.shape(utils.getWeekDayName(persianDate)));
shamsiDate.setText(utils.shape(utils.dateToString(persianDate)));
CivilDate civilDate = DateConverter.persianToCivil(persianDate);
gregorianDate.setText(utils.shape(utils.dateToString(civilDate)));
islamicDate.setText(utils.shape(utils.dateToString(
DateConverter.civilToIslamic(civilDate, utils.getIslamicOffset()))));
if (utils.getToday().equals(persianDate)) {
today.setVisibility(View.GONE);
todayIcon.setVisibility(View.GONE);
if (utils.iranTime) {
weekDayName.setText(weekDayName.getText() +
utils.shape(" (" + getString(R.string.iran_time) + ")"));
}
} else {
today.setVisibility(View.VISIBLE);
todayIcon.setVisibility(View.VISIBLE);
}
setOwghat(civilDate);
showEvent(persianDate);
}
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
public void addEventOnCalendar(PersianDate persianDate) {
Intent intent = new Intent(Intent.ACTION_INSERT);
intent.setData(CalendarContract.Events.CONTENT_URI);
CivilDate civil = DateConverter.persianToCivil(persianDate);
intent.putExtra(CalendarContract.Events.DESCRIPTION,
utils.dayTitleSummary(persianDate));
Calendar time = Calendar.getInstance();
time.set(civil.getYear(), civil.getMonth() - 1, civil.getDayOfMonth());
intent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME,
time.getTimeInMillis());
intent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME,
time.getTimeInMillis());
intent.putExtra(CalendarContract.EXTRA_EVENT_ALL_DAY, true);
startActivity(intent);
}
private void showEvent(PersianDate persianDate) {
String holidays = utils.getEventsTitle(persianDate, true);
String events = utils.getEventsTitle(persianDate, false);
event.setVisibility(View.GONE);
holidayTitle.setVisibility(View.GONE);
eventTitle.setVisibility(View.GONE);
if (!TextUtils.isEmpty(holidays)) {
holidayTitle.setText(utils.shape(holidays));
holidayTitle.setVisibility(View.VISIBLE);
event.setVisibility(View.VISIBLE);
}
if (!TextUtils.isEmpty(events)) {
eventTitle.setText(utils.shape(events));
eventTitle.setVisibility(View.VISIBLE);
event.setVisibility(View.VISIBLE);
}
}
private void setOwghat(CivilDate civilDate) {
if (coordinate == null) {
return;
}
calendar.set(civilDate.getYear(), civilDate.getMonth() - 1, civilDate.getDayOfMonth());
Date date = calendar.getTime();
Map<PrayTime, Clock> prayTimes = prayTimesCalculator.calculate(date, coordinate);
fajrTextView.setText(utils.getPersianFormattedClock(prayTimes.get(PrayTime.FAJR)));
sunriseTextView.setText(utils.getPersianFormattedClock(prayTimes.get(PrayTime.SUNRISE)));
dhuhrTextView.setText(utils.getPersianFormattedClock(prayTimes.get(PrayTime.DHUHR)));
asrTextView.setText(utils.getPersianFormattedClock(prayTimes.get(PrayTime.ASR)));
sunsetTextView.setText(utils.getPersianFormattedClock(prayTimes.get(PrayTime.SUNSET)));
maghribTextView.setText(utils.getPersianFormattedClock(prayTimes.get(PrayTime.MAGHRIB)));
ishaTextView.setText(utils.getPersianFormattedClock(prayTimes.get(PrayTime.ISHA)));
midnightTextView.setText(utils.getPersianFormattedClock(prayTimes.get(PrayTime.MIDNIGHT)));
owghat.setVisibility(View.VISIBLE);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.owghat:
fajrLayout.setVisibility(View.VISIBLE);
sunriseLayout.setVisibility(View.VISIBLE);
dhuhrLayout.setVisibility(View.VISIBLE);
asrLayout.setVisibility(View.VISIBLE);
sunsetLayout.setVisibility(View.VISIBLE);
maghribLayout.setVisibility(View.VISIBLE);
ishaLayout.setVisibility(View.VISIBLE);
midnightLayout.setVisibility(View.VISIBLE);
moreOwghat.setVisibility(View.GONE);
break;
case R.id.today:
case R.id.today_icon:
bringTodayYearMonth();
break;
case R.id.islamic_date:
case R.id.shamsi_date:
case R.id.gregorian_date:
utils.copyToClipboard(v);
break;
}
}
private void bringTodayYearMonth() {
Intent intent = new Intent(Constants.BROADCAST_INTENT_TO_MONTH_FRAGMENT);
intent.putExtra(Constants.BROADCAST_FIELD_TO_MONTH_FRAGMENT,
Constants.BROADCAST_TO_MONTH_FRAGMENT_RESET_DAY);
intent.putExtra(Constants.BROADCAST_FIELD_SELECT_DAY, -1);
LocalBroadcastManager.getInstance(getContext()).sendBroadcast(intent);
if (monthViewPager.getCurrentItem() != Constants.MONTHS_LIMIT / 2) {
monthViewPager.setCurrentItem(Constants.MONTHS_LIMIT / 2);
}
selectDay(utils.getToday());
}
public void bringDate(PersianDate date) {
PersianDate today = utils.getToday();
viewPagerPosition =
(today.getYear() - date.getYear()) * 12 + today.getMonth() - date.getMonth();
monthViewPager.setCurrentItem(viewPagerPosition + Constants.MONTHS_LIMIT / 2);
Intent intent = new Intent(Constants.BROADCAST_INTENT_TO_MONTH_FRAGMENT);
intent.putExtra(Constants.BROADCAST_FIELD_TO_MONTH_FRAGMENT, viewPagerPosition);
intent.putExtra(Constants.BROADCAST_FIELD_SELECT_DAY, date.getDayOfMonth());
LocalBroadcastManager.getInstance(getContext()).sendBroadcast(intent);
selectDay(date);
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
viewPagerPosition = position - Constants.MONTHS_LIMIT / 2;
Intent intent = new Intent(Constants.BROADCAST_INTENT_TO_MONTH_FRAGMENT);
intent.putExtra(Constants.BROADCAST_FIELD_TO_MONTH_FRAGMENT, viewPagerPosition);
intent.putExtra(Constants.BROADCAST_FIELD_SELECT_DAY, -1);
LocalBroadcastManager.getInstance(getContext()).sendBroadcast(intent);
today.setVisibility(View.VISIBLE);
todayIcon.setVisibility(View.VISIBLE);
}
@Override
public void onPageScrollStateChanged(int state) {
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
menu.clear();
inflater.inflate(R.menu.action_button, menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.go_to:
SelectDayDialog dialog = new SelectDayDialog();
dialog.show(getChildFragmentManager(), SelectDayDialog.class.getName());
break;
default:
break;
}
return true;
}
public int getViewPagerPosition() {
return viewPagerPosition;
}
}