196 lines
7.9 KiB
Kotlin

package com.tommasoberlose.anotherwidget.util
import android.Manifest
import android.annotation.SuppressLint
import android.content.ContentUris
import android.content.Context
import android.content.Intent
import android.content.SharedPreferences
import android.net.Uri
import android.preference.PreferenceManager
import android.provider.CalendarContract
import android.util.Log
import android.util.TimeUtils
import android.widget.Toast
import com.tommasoberlose.anotherwidget.R
import com.tommasoberlose.anotherwidget.`object`.CalendarSelector
import com.tommasoberlose.anotherwidget.`object`.Constants
import com.tommasoberlose.anotherwidget.`object`.Event
import io.realm.Realm
import me.everything.providers.android.calendar.CalendarProvider
import me.everything.providers.android.contacts.ContactsProvider
import java.util.*
import java.util.concurrent.TimeUnit
import kotlin.Comparator
import kotlin.collections.ArrayList
/**
* Created by tommaso on 08/10/17.
*/
object CalendarUtil {
fun updateEventList(context: Context) {
val SP: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)
if (SP.getBoolean(Constants.PREF_SHOW_EVENTS, true)) {
val eventList = ArrayList<Event>()
val now = Calendar.getInstance()
val limit = Calendar.getInstance()
when (SP.getInt(Constants.PREF_SHOW_UNTIL, 1)) {
0 -> limit.add(Calendar.HOUR, 3)
1 -> limit.add(Calendar.HOUR, 6)
2 -> limit.add(Calendar.HOUR, 12)
3 -> limit.add(Calendar.DAY_OF_MONTH, 1)
4 -> limit.add(Calendar.DAY_OF_MONTH, 3)
5 -> limit.add(Calendar.DAY_OF_MONTH, 7)
6 -> limit.add(Calendar.MINUTE, 30)
7 -> limit.add(Calendar.HOUR, 1)
else -> limit.add(Calendar.HOUR, 6)
}
val builder = CalendarContract.Instances.CONTENT_URI.buildUpon()
ContentUris.appendId(builder, now.timeInMillis)
ContentUris.appendId(builder, limit.timeInMillis)
if (!Util.checkGrantedPermission(context, Manifest.permission.READ_CALENDAR)) {
resetNextEventData(context)
} else {
val provider = CalendarProvider(context)
val instances = provider.getInstances(now.timeInMillis, limit.timeInMillis).list
for (instance in instances) {
val e = provider.getEvent(instance.eventId)
if (e != null && (SP.getBoolean(Constants.PREF_CALENDAR_ALL_DAY, false) || !e.allDay) && !(SP.getString(Constants.PREF_CALENDAR_FILTER, "").contains(" " + e.calendarId + ",")) && (SP.getBoolean(Constants.PREF_SHOW_DECLINED_EVENTS, true) || !e.selfAttendeeStatus.equals(CalendarContract.Attendees.ATTENDEE_STATUS_DECLINED))) {
if (e.allDay) {
val start = Calendar.getInstance()
start.timeInMillis = instance.begin
val end = Calendar.getInstance()
end.timeInMillis = instance.end
instance.begin = start.timeInMillis - start.timeZone.getOffset(start.timeInMillis)
instance.end = end.timeInMillis - end.timeZone.getOffset(end.timeInMillis)
}
eventList.add(Event(e.id.toInt(), e.title, instance.begin, instance.end, e.calendarId.toInt(), e.allDay, e.eventLocation?: ""))
}
}
if (eventList.isEmpty()) {
resetNextEventData(context)
} else {
eventList.sortWith(Comparator { event: Event, event1: Event ->
if (event.allDay && event1.allDay) {
event.startDate.compareTo(event1.startDate)
} else if (event.allDay) {
1
} else if (event1.allDay) {
-1
} else {
event1.startDate.compareTo(event.startDate)
}
})
saveEvents(context, eventList)
saveNextEventData(context, eventList[0])
}
}
} else {
resetNextEventData(context)
}
}
fun getCalendarList(context: Context): List<me.everything.providers.android.calendar.Calendar> {
val calendarList = ArrayList<me.everything.providers.android.calendar.Calendar>()
if (!Util.checkGrantedPermission(context, Manifest.permission.READ_CALENDAR)) {
return calendarList
}
val provider = CalendarProvider(context)
return provider.calendars.list
}
fun saveEvents(context: Context, eventList: ArrayList<Event>) {
Realm.init(context)
val db = Realm.getDefaultInstance()
db.executeTransaction { realm ->
realm.where(Event::class.java).findAll().deleteAllFromRealm()
realm.copyToRealm(eventList)
}
}
@SuppressLint("ApplySharedPref")
fun resetNextEventData(context: Context) {
val SP: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)
SP.edit()
.remove(Constants.PREF_NEXT_EVENT_ID)
.remove(Constants.PREF_NEXT_EVENT_NAME)
.remove(Constants.PREF_NEXT_EVENT_START_DATE)
.remove(Constants.PREF_NEXT_EVENT_END_DATE)
.remove(Constants.PREF_NEXT_EVENT_ALL_DAY)
.remove(Constants.PREF_NEXT_EVENT_CALENDAR_ID)
.remove(Constants.PREF_NEXT_EVENT_LOCATION)
.commit()
Util.updateWidget(context)
}
@SuppressLint("ApplySharedPref")
fun saveNextEventData(context: Context, event: Event) {
val SP: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)
SP.edit()
.putInt(Constants.PREF_NEXT_EVENT_ID, event.id)
.commit()
Util.updateWidget(context)
}
fun getNextEvent(context: Context): Event {
val SP: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)
Realm.init(context)
val db = Realm.getDefaultInstance()
val nextEvent = db.where(Event::class.java).equalTo("id", SP.getInt(Constants.PREF_NEXT_EVENT_ID, 0)).findFirst()
return if (nextEvent != null) {
nextEvent
} else {
val eventList = db.where(Event::class.java).findAll()
eventList[0]?: Event()
}
}
@SuppressLint("ApplySharedPref")
fun goToNextEvent(context: Context) {
Realm.init(context)
val db = Realm.getDefaultInstance()
val SP: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)
val eventList = db.where(Event::class.java).findAll()
var found = false
for (e in eventList) {
if (e.id == SP.getInt(Constants.PREF_NEXT_EVENT_ID, 0)) {
if (eventList.indexOf(e) < eventList.size - 1) {
SP.edit()
.putInt(Constants.PREF_NEXT_EVENT_ID, eventList[eventList.indexOf(e) + 1]?.id ?: 0)
.commit()
} else {
SP.edit()
.putInt(Constants.PREF_NEXT_EVENT_ID, eventList[0]?.id ?: 0)
.commit()
}
found = true
break
}
}
if (!found) {
SP.edit()
.putInt(Constants.PREF_NEXT_EVENT_ID, eventList[0]?.id ?: 0)
.commit()
}
context.sendBroadcast(Intent(Constants.ACTION_TIME_UPDATE))
}
fun getEventsCount(context: Context): Int {
Realm.init(context)
val db = Realm.getDefaultInstance()
return db.where(Event::class.java).findAll().size
}
}