package me.ji5.data;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Parcel;
import android.os.Parcelable;
import android.provider.CalendarContract;
import android.text.TextUtils;
import android.text.format.DateUtils;
import android.widget.Toast;
import java.text.Collator;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Comparator;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
import me.ji5.utils.CalendarContentResolver;
import me.ji5.utils.IcuCalendarUtil;
import me.ji5.utils.Log;
import me.ji5.utils.MiscUtil;
/**
* Created by ohjongin on 14. 1. 2.
*/
public class GoogleEvent implements Parcelable {
protected final static boolean DEBUG_LOG = false;
public static final String PARSE_CLASSNAME = "EventBirth";
public long mId;
public long mCalendarId;
public String mTitle;
public String mDescription;
public long mDtStart;
public long mDtEnd;
public String mEventLocation;
public String mCustomAppPackage;
public String mParseObjectId;
public long mDtStartLunar;
public long mComingBirthLunar;
public static String[] EVENT_PROJECTION = new String[] {
CalendarContract.Events._ID,
CalendarContract.Events.CALENDAR_ID,
CalendarContract.Events.TITLE,
CalendarContract.Events.DESCRIPTION,
CalendarContract.Events.DTSTART,
CalendarContract.Events.DTEND,
CalendarContract.Events.EVENT_LOCATION,
CalendarContract.Events.CUSTOM_APP_PACKAGE,
CalendarContract.Events.HAS_ALARM,
CalendarContract.Events.ALL_DAY};
public GoogleEvent() {
}
public static GoogleEvent getInstance(Cursor cursor) {
GoogleEvent event = new GoogleEvent();
try {
event.mId = cursor.getLong(cursor.getColumnIndexOrThrow(CalendarContract.Events._ID));
event.mCalendarId = cursor.getLong(cursor.getColumnIndexOrThrow(CalendarContract.Events.CALENDAR_ID));
event.mTitle = cursor.getString(cursor.getColumnIndexOrThrow(CalendarContract.Events.TITLE));
event.mDescription = cursor.getString(cursor.getColumnIndexOrThrow(CalendarContract.Events.DESCRIPTION));
event.mDtStart = cursor.getLong(cursor.getColumnIndexOrThrow(CalendarContract.Events.DTSTART));
event.mDtEnd = cursor.getLong(cursor.getColumnIndexOrThrow(CalendarContract.Events.DTEND));
event.mEventLocation = cursor.getString(cursor.getColumnIndexOrThrow(CalendarContract.Events.EVENT_LOCATION));
event.mCustomAppPackage = cursor.getString(cursor.getColumnIndexOrThrow(CalendarContract.Events.CUSTOM_APP_PACKAGE));
event.calcDate();
} catch (Exception e) {
e.printStackTrace();
}
return event;
}
public Uri insert(Context context, Uri content_uri) {
ContentValues values = new ContentValues();
ContentResolver cr = context.getContentResolver();
values.put(CalendarContract.Events.DTSTART, mDtStart);
values.put(CalendarContract.Events.DTEND, mDtEnd);
values.put(CalendarContract.Events.TITLE, mTitle);
values.put(CalendarContract.Events.DESCRIPTION, mDescription + "\n" + "만 " + MiscUtil.getInternationalAge(mDtStart, System.currentTimeMillis()) + "세 생일");
values.put(CalendarContract.Events.CALENDAR_ID, mCalendarId);
values.put(CalendarContract.Events.CUSTOM_APP_PACKAGE, context.getPackageName());
values.put(CalendarContract.Events.ALL_DAY, 1);
values.put(CalendarContract.Events.EVENT_LOCATION, mEventLocation);
values.put(CalendarContract.Events.EVENT_TIMEZONE, TimeZone.getDefault().getID());
Uri uri = cr.insert(content_uri, values);
return uri;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeLong(this.mId);
dest.writeLong(this.mCalendarId);
dest.writeString(this.mTitle);
dest.writeString(this.mDescription);
dest.writeLong(this.mDtStart);
dest.writeLong(this.mDtEnd);
dest.writeString(this.mEventLocation);
dest.writeString(this.mParseObjectId);
dest.writeString(this.mCustomAppPackage);
dest.writeStringArray(this.EVENT_PROJECTION);
}
private GoogleEvent(Parcel in) {
this.mId = in.readLong();
this.mCalendarId = in.readLong();
this.mTitle = in.readString();
this.mDescription = in.readString();
this.mDtStart = in.readLong();
this.mDtEnd = in.readLong();
this.mEventLocation = in.readString();
this.mParseObjectId = in.readString();
this.mCustomAppPackage = in.readString();
this.EVENT_PROJECTION = in.createStringArray();
}
public static Parcelable.Creator<GoogleEvent> CREATOR = new Parcelable.Creator<GoogleEvent>() {
public GoogleEvent createFromParcel(Parcel source) {
return new GoogleEvent(source);
}
public GoogleEvent[] newArray(int size) {
return new GoogleEvent[size];
}
};
public GoogleEvent calcDate() {
// 올해 음력 생일 계산을 위한 오늘 날짜
final Calendar cal_today = Calendar.getInstance();
cal_today.setTime(new Date());
GoogleEvent event = calcDate(cal_today.get(Calendar.YEAR));
if (event.mComingBirthLunar < cal_today.getTimeInMillis()) {
event.calcDate(cal_today.get(Calendar.YEAR) + 1);
}
return event;
}
public GoogleEvent calcDate(int year) {
// 올해 음력 생일 계산을 위한 오늘 날짜
final Calendar cal_today = Calendar.getInstance();
cal_today.setTime(new Date());
// 양력 생일
Calendar cal_birth = Calendar.getInstance();
cal_birth.setTimeInMillis(mDtStart);
// 양력 생일로부터 음력 생일과 금년도 음력 생일 날짜를 계산
Calendar cal_birth_lunar = IcuCalendarUtil.getLunarCalendar(cal_birth);
// 올해 생일
Calendar coming_birth = Calendar.getInstance();
coming_birth.set(year, cal_birth_lunar.get(Calendar.MONTH), cal_birth_lunar.get(Calendar.DAY_OF_MONTH));
// 올해 음력 생일
Calendar cal_coming_birth_lunar = IcuCalendarUtil.getCalendarFromLunar(coming_birth.get(Calendar.YEAR), cal_birth_lunar.get(Calendar.MONTH) + 1, cal_birth_lunar.get(Calendar.DAY_OF_MONTH));
mDtStartLunar = cal_birth_lunar.getTimeInMillis();
mComingBirthLunar = cal_coming_birth_lunar.getTimeInMillis();
return this;
}
public long findEventId(Context context) {
CalendarContentResolver ccr = new CalendarContentResolver(context);
long start = mComingBirthLunar - DateUtils.DAY_IN_MILLIS;
long end = mComingBirthLunar + DateUtils.DAY_IN_MILLIS;
String selection = "((" + CalendarContract.Events.DTSTART + " >= " + start + ") AND (" + CalendarContract.Events.DTEND + " <= " + end + ") AND (" + CalendarContract.Events.TITLE + "='" + mTitle.trim() + "'))";
ArrayList<GoogleEvent> eventList = ccr.getEventList(selection);
if (DEBUG_LOG) Log.e("event.mComingBirthLunar: " + MiscUtil.getDateString(null, mComingBirthLunar) + ", " + mComingBirthLunar);
if (eventList.size() > 0) {
this.mId = eventList.get(0).mId;
}
return (eventList.size() > 0) ? eventList.get(0).mId : -1;
}
public long addToCalendar(Context context) {
this.mId = addToCalendar(context, this);
return this.mId;
}
public int getYear() {
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(mComingBirthLunar);
return cal.get(Calendar.YEAR);
}
public static long addToCalendar(Context context, GoogleEvent event) {
long event_id = -1;
if (TextUtils.isEmpty(event.mTitle)) {
Toast.makeText(context, "이벤트 제목이 유효하지 않아서 추가하지 못했습니다.", Toast.LENGTH_LONG).show();
return event_id;
}
CalendarContentResolver ccr = new CalendarContentResolver(context);
long start = event.mComingBirthLunar - DateUtils.DAY_IN_MILLIS;
long end = event.mComingBirthLunar + DateUtils.DAY_IN_MILLIS;
String selection = "((" + CalendarContract.Events.DTSTART + " >= " + start + ") AND (" + CalendarContract.Events.DTEND + " <= " + end + ") AND (" + CalendarContract.Events.TITLE + "='" + event.mTitle.trim() + "'))";
ArrayList<GoogleEvent> eventList = ccr.getEventList(selection);
if (DEBUG_LOG) Log.e("event.mComingBirthLunar: " + MiscUtil.getDateString(null, event.mComingBirthLunar) + ", " + event.mComingBirthLunar);
if (eventList.size() < 1) {
event_id = ccr.addEvent(event);
if (event_id < 0) {
Toast.makeText(context, "이벤트(" + event.mTitle + ") 추가 중에 알수 없는 오류가 발생했습니다.", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(context, "이벤트(" + event.mTitle + ")를 구글캘린더에 추가하였습니다. 네트워크 상황에 따라 반영에 시간 지연이 있을 수 있습니다.", Toast.LENGTH_LONG).show();
}
} else {
Toast.makeText(context, "동일한 이름(" + event.mTitle + ")의 이벤트가 존재합니다.", Toast.LENGTH_LONG).show();
Intent intent = new Intent(Intent.ACTION_VIEW);
// Android 2.2+
intent.setData(Uri.parse("content://com.android.calendar/events/" + String.valueOf(eventList.get(0).mId)));
// Android 2.1 and below.
// intent.setData(Uri.parse("content://calendar/events/" + String.valueOf(calendarEventID)));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
event.mId = event_id;
return event_id;
}
//Comparator 를 만든다.
public final static Comparator<GoogleEvent> compareTitle = new Comparator<GoogleEvent>() {
private final Collator collator = Collator.getInstance();
@Override
public int compare(GoogleEvent obj1,GoogleEvent obj2) {
return collator.compare(obj1.mTitle, obj2.mTitle);
}
};
//Comparator 를 만든다.
public final static Comparator<GoogleEvent> compareBirth = new Comparator<GoogleEvent>() {
@Override
public int compare(GoogleEvent obj1,GoogleEvent obj2) {
return Long.valueOf(obj1.mDtStart).compareTo(Long.valueOf(obj2.mDtStart));
}
};
//Comparator 를 만든다.
public final static Comparator<GoogleEvent> compareRecent = new Comparator<GoogleEvent>() {
@Override
public int compare(GoogleEvent obj1,GoogleEvent obj2) {
obj1.calcDate();
obj2.calcDate();
return Long.valueOf(obj1.mComingBirthLunar).compareTo(Long.valueOf(obj2.mComingBirthLunar));
}
};
public String toString() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy년 M월 d일 (EEE)", Locale.KOREA);
StringBuilder sb = new StringBuilder();
sb.append("id:" + mId);
sb.append(", title:" + mTitle);
sb.append(", calendar_id:" + mCalendarId);
sb.append(", dtstart:" + sdf.format(new Date(mDtStart)) + ", " + mDtStart);
sb.append(", dtend:" + sdf.format(new Date(mDtEnd)) + ", " + mDtEnd);
sb.append(", mComingBirthLunar:" + sdf.format(new Date(mComingBirthLunar)) + ", " + mComingBirthLunar);
sb.append(", mDtStartLunar:" + sdf.format(new Date(mDtStartLunar)) + ", " + mDtStartLunar);
sb.append(", app:" + mCustomAppPackage);
return sb.toString();
}
public boolean equals(GoogleEvent event) {
boolean result = false;
if (event != null
&& mTitle.equals(event.mTitle)
&& mDtStart == event.mDtStart) result = true;
return result;
}
@Override
public GoogleEvent clone() {
GoogleEvent event = new GoogleEvent();
event.mId = this.mId;
event.mTitle = new String(this.mTitle);
event.mDtStart = this.mDtStart;
event.mDtEnd = this.mDtEnd;
event.mDescription = new String(this.mDescription);
event.mCalendarId = this.mCalendarId;
event.mCustomAppPackage = new String(this.mCustomAppPackage);
event.mEventLocation = new String(this.mEventLocation);
return event;
}
}