converting some timestamp related fields from int to long

This commit is contained in:
tibbi 2018-11-15 11:09:09 +01:00
parent 71e066ae15
commit 847db07d66
30 changed files with 162 additions and 157 deletions

View File

@ -45,11 +45,11 @@ class EventActivity : SimpleActivity() {
private var mReminder2Minutes = 0 private var mReminder2Minutes = 0
private var mReminder3Minutes = 0 private var mReminder3Minutes = 0
private var mRepeatInterval = 0 private var mRepeatInterval = 0
private var mRepeatLimit = 0 private var mRepeatLimit = 0L
private var mRepeatRule = 0 private var mRepeatRule = 0
private var mEventTypeId = REGULAR_EVENT_TYPE_ID private var mEventTypeId = REGULAR_EVENT_TYPE_ID
private var mDialogTheme = 0 private var mDialogTheme = 0
private var mEventOccurrenceTS = 0 private var mEventOccurrenceTS = 0L
private var mEventCalendarId = STORED_LOCALLY_ONLY private var mEventCalendarId = STORED_LOCALLY_ONLY
private var wasActivityInitialized = false private var wasActivityInitialized = false
@ -89,7 +89,7 @@ class EventActivity : SimpleActivity() {
if (event != null) { if (event != null) {
mEvent = event mEvent = event
mEventOccurrenceTS = intent.getIntExtra(EVENT_OCCURRENCE_TS, 0) mEventOccurrenceTS = intent.getLongExtra(EVENT_OCCURRENCE_TS, 0L)
if (savedInstanceState == null) { if (savedInstanceState == null) {
setupEditEvent() setupEditEvent()
} }
@ -178,16 +178,16 @@ class EventActivity : SimpleActivity() {
override fun onSaveInstanceState(outState: Bundle) { override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState) super.onSaveInstanceState(outState)
outState.putInt(START_TS, mEventStartDateTime.seconds()) outState.putLong(START_TS, mEventStartDateTime.seconds())
outState.putInt(END_TS, mEventEndDateTime.seconds()) outState.putLong(END_TS, mEventEndDateTime.seconds())
outState.putInt(REMINDER_1_MINUTES, mReminder1Minutes) outState.putInt(REMINDER_1_MINUTES, mReminder1Minutes)
outState.putInt(REMINDER_2_MINUTES, mReminder2Minutes) outState.putInt(REMINDER_2_MINUTES, mReminder2Minutes)
outState.putInt(REMINDER_3_MINUTES, mReminder3Minutes) outState.putInt(REMINDER_3_MINUTES, mReminder3Minutes)
outState.putInt(REPEAT_INTERVAL, mRepeatInterval) outState.putInt(REPEAT_INTERVAL, mRepeatInterval)
outState.putInt(REPEAT_LIMIT, mRepeatLimit)
outState.putInt(REPEAT_RULE, mRepeatRule) outState.putInt(REPEAT_RULE, mRepeatRule)
outState.putLong(REPEAT_LIMIT, mRepeatLimit)
outState.putLong(EVENT_TYPE_ID, mEventTypeId) outState.putLong(EVENT_TYPE_ID, mEventTypeId)
outState.putInt(EVENT_CALENDAR_ID, mEventCalendarId) outState.putInt(EVENT_CALENDAR_ID, mEventCalendarId)
@ -196,16 +196,16 @@ class EventActivity : SimpleActivity() {
override fun onRestoreInstanceState(savedInstanceState: Bundle) { override fun onRestoreInstanceState(savedInstanceState: Bundle) {
super.onRestoreInstanceState(savedInstanceState) super.onRestoreInstanceState(savedInstanceState)
savedInstanceState.apply { savedInstanceState.apply {
mEventStartDateTime = Formatter.getDateTimeFromTS(getInt(START_TS)) mEventStartDateTime = Formatter.getDateTimeFromTS(getLong(START_TS))
mEventEndDateTime = Formatter.getDateTimeFromTS(getInt(END_TS)) mEventEndDateTime = Formatter.getDateTimeFromTS(getLong(END_TS))
mReminder1Minutes = getInt(REMINDER_1_MINUTES) mReminder1Minutes = getInt(REMINDER_1_MINUTES)
mReminder2Minutes = getInt(REMINDER_2_MINUTES) mReminder2Minutes = getInt(REMINDER_2_MINUTES)
mReminder3Minutes = getInt(REMINDER_3_MINUTES) mReminder3Minutes = getInt(REMINDER_3_MINUTES)
mRepeatInterval = getInt(REPEAT_INTERVAL) mRepeatInterval = getInt(REPEAT_INTERVAL)
mRepeatLimit = getInt(REPEAT_LIMIT)
mRepeatRule = getInt(REPEAT_RULE) mRepeatRule = getInt(REPEAT_RULE)
mRepeatLimit = getLong(REPEAT_LIMIT)
mEventTypeId = getLong(EVENT_TYPE_ID) mEventTypeId = getLong(EVENT_TYPE_ID)
mEventCalendarId = getInt(EVENT_CALENDAR_ID) mEventCalendarId = getInt(EVENT_CALENDAR_ID)
@ -226,7 +226,7 @@ class EventActivity : SimpleActivity() {
} }
private fun setupEditEvent() { private fun setupEditEvent() {
val realStart = if (mEventOccurrenceTS == 0) mEvent.startTS else mEventOccurrenceTS val realStart = if (mEventOccurrenceTS == 0L) mEvent.startTS else mEventOccurrenceTS
val duration = mEvent.endTS - mEvent.startTS val duration = mEvent.endTS - mEvent.startTS
window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN) window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN)
updateActionBarTitle(getString(R.string.edit_event)) updateActionBarTitle(getString(R.string.edit_event))
@ -255,10 +255,10 @@ class EventActivity : SimpleActivity() {
mEventCalendarId = if (isLastCaldavCalendarOK) config.lastUsedCaldavCalendarId else STORED_LOCALLY_ONLY mEventCalendarId = if (isLastCaldavCalendarOK) config.lastUsedCaldavCalendarId else STORED_LOCALLY_ONLY
if (intent.action == Intent.ACTION_EDIT || intent.action == Intent.ACTION_INSERT) { if (intent.action == Intent.ACTION_EDIT || intent.action == Intent.ACTION_INSERT) {
val startTS = (intent.getLongExtra("beginTime", System.currentTimeMillis()) / 1000).toInt() val startTS = intent.getLongExtra("beginTime", System.currentTimeMillis()) / 1000L
mEventStartDateTime = Formatter.getDateTimeFromTS(startTS) mEventStartDateTime = Formatter.getDateTimeFromTS(startTS)
val endTS = (intent.getLongExtra("endTime", System.currentTimeMillis()) / 1000).toInt() val endTS = intent.getLongExtra("endTime", System.currentTimeMillis()) / 1000L
mEventEndDateTime = Formatter.getDateTimeFromTS(endTS) mEventEndDateTime = Formatter.getDateTimeFromTS(endTS)
event_title.setText(intent.getStringExtra("title")) event_title.setText(intent.getStringExtra("title"))
@ -268,7 +268,7 @@ class EventActivity : SimpleActivity() {
event_description.movementMethod = LinkMovementMethod.getInstance() event_description.movementMethod = LinkMovementMethod.getInstance()
} }
} else { } else {
val startTS = intent.getIntExtra(NEW_EVENT_START_TS, 0) val startTS = intent.getLongExtra(NEW_EVENT_START_TS, 0L)
val dateTime = Formatter.getDateTimeFromTS(startTS) val dateTime = Formatter.getDateTimeFromTS(startTS)
mEventStartDateTime = dateTime mEventStartDateTime = dateTime
@ -341,14 +341,14 @@ class EventActivity : SimpleActivity() {
} }
} }
private fun setRepeatLimit(limit: Int) { private fun setRepeatLimit(limit: Long) {
mRepeatLimit = limit mRepeatLimit = limit
checkRepetitionLimitText() checkRepetitionLimitText()
} }
private fun checkRepetitionLimitText() { private fun checkRepetitionLimitText() {
event_repetition_limit.text = when { event_repetition_limit.text = when {
mRepeatLimit == 0 -> { mRepeatLimit == 0L -> {
event_repetition_limit_label.text = getString(R.string.repeat) event_repetition_limit_label.text = getString(R.string.repeat)
resources.getString(R.string.forever) resources.getString(R.string.forever)
} }
@ -946,7 +946,7 @@ class EventActivity : SimpleActivity() {
updateStartDateText() updateStartDateText()
checkRepeatRule() checkRepeatRule()
mEventEndDateTime = mEventStartDateTime.plusSeconds(diff) mEventEndDateTime = mEventStartDateTime.plusSeconds(diff.toInt())
updateEndTexts() updateEndTexts()
} else { } else {
mEventEndDateTime = mEventEndDateTime.withDate(year, month + 1, day) mEventEndDateTime = mEventEndDateTime.withDate(year, month + 1, day)
@ -961,7 +961,7 @@ class EventActivity : SimpleActivity() {
mEventStartDateTime = mEventStartDateTime.withHourOfDay(hours).withMinuteOfHour(minutes) mEventStartDateTime = mEventStartDateTime.withHourOfDay(hours).withMinuteOfHour(minutes)
updateStartTimeText() updateStartTimeText()
mEventEndDateTime = mEventStartDateTime.plusSeconds(diff) mEventEndDateTime = mEventStartDateTime.plusSeconds(diff.toInt())
updateEndTexts() updateEndTexts()
} else { } else {
mEventEndDateTime = mEventEndDateTime.withHourOfDay(hours).withMinuteOfHour(minutes) mEventEndDateTime = mEventEndDateTime.withHourOfDay(hours).withMinuteOfHour(minutes)

View File

@ -498,10 +498,10 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener {
date.year = 70 date.year = 70
} }
val timestamp = (date.time / 1000).toInt() val timestamp = date.time / 1000L
val source = if (birthdays) SOURCE_CONTACT_BIRTHDAY else SOURCE_CONTACT_ANNIVERSARY val source = if (birthdays) SOURCE_CONTACT_BIRTHDAY else SOURCE_CONTACT_ANNIVERSARY
val lastUpdated = cursor.getLongValue(ContactsContract.CommonDataKinds.Event.CONTACT_LAST_UPDATED_TIMESTAMP) val lastUpdated = cursor.getLongValue(ContactsContract.CommonDataKinds.Event.CONTACT_LAST_UPDATED_TIMESTAMP)
val event = Event(0, timestamp, timestamp, name, importId = contactId, flags = FLAG_ALL_DAY, repeatInterval = YEAR, val event = Event(null, timestamp, timestamp, name, importId = contactId, flags = FLAG_ALL_DAY, repeatInterval = YEAR,
eventType = eventTypeId, source = source, lastUpdated = lastUpdated) eventType = eventTypeId, source = source, lastUpdated = lastUpdated)
if (!importIDs.contains(contactId)) { if (!importIDs.contains(contactId)) {
@ -775,7 +775,7 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener {
} }
private fun openDayAt(timestamp: Long) { private fun openDayAt(timestamp: Long) {
val dayCode = Formatter.getDayCodeFromTS((timestamp / 1000).toInt()) val dayCode = Formatter.getDayCodeFromTS(timestamp / 1000L)
calendar_fab.beVisible() calendar_fab.beVisible()
config.storedView = DAILY_VIEW config.storedView = DAILY_VIEW
updateViewPager(dayCode) updateViewPager(dayCode)

View File

@ -9,7 +9,7 @@ import com.simplemobiletools.calendar.pro.R
import com.simplemobiletools.calendar.pro.R.id.event_item_holder import com.simplemobiletools.calendar.pro.R.id.event_item_holder
import com.simplemobiletools.calendar.pro.R.id.event_section_title import com.simplemobiletools.calendar.pro.R.id.event_section_title
import com.simplemobiletools.calendar.pro.extensions.config import com.simplemobiletools.calendar.pro.extensions.config
import com.simplemobiletools.calendar.pro.extensions.dbHelper import com.simplemobiletools.calendar.pro.extensions.eventsHelper
import com.simplemobiletools.calendar.pro.extensions.seconds import com.simplemobiletools.calendar.pro.extensions.seconds
import com.simplemobiletools.calendar.pro.helpers.* import com.simplemobiletools.calendar.pro.helpers.*
import com.simplemobiletools.calendar.pro.helpers.Formatter import com.simplemobiletools.calendar.pro.helpers.Formatter
@ -156,7 +156,7 @@ class EventListWidgetAdapter(val context: Context) : RemoteViewsService.RemoteVi
mediumFontSize = context.config.getFontSize() mediumFontSize = context.config.getFontSize()
val fromTS = DateTime().seconds() - context.config.displayPastEvents * 60 val fromTS = DateTime().seconds() - context.config.displayPastEvents * 60
val toTS = DateTime().plusYears(1).seconds() val toTS = DateTime().plusYears(1).seconds()
context.dbHelper.getEventsInBackground(fromTS, toTS, applyTypeFilter = true) { context.eventsHelper.getEventsSync(fromTS, toTS, applyTypeFilter = true) {
val listItems = ArrayList<ListItem>(it.size) val listItems = ArrayList<ListItem>(it.size)
val replaceDescription = context.config.replaceDescription val replaceDescription = context.config.replaceDescription
val sorted = it.sortedWith(compareBy({ it.startTS }, { it.endTS }, { it.title }, { if (replaceDescription) it.location else it.description })) val sorted = it.sortedWith(compareBy({ it.startTS }, { it.endTS }, { it.title }, { if (replaceDescription) it.location else it.description }))

View File

@ -9,7 +9,7 @@ import com.simplemobiletools.calendar.pro.fragments.WeekFragment
import com.simplemobiletools.calendar.pro.helpers.WEEK_START_TIMESTAMP import com.simplemobiletools.calendar.pro.helpers.WEEK_START_TIMESTAMP
import com.simplemobiletools.calendar.pro.interfaces.WeekFragmentListener import com.simplemobiletools.calendar.pro.interfaces.WeekFragmentListener
class MyWeekPagerAdapter(fm: FragmentManager, val mWeekTimestamps: List<Int>, val mListener: WeekFragmentListener) : FragmentStatePagerAdapter(fm) { class MyWeekPagerAdapter(fm: FragmentManager, val mWeekTimestamps: List<Long>, val mListener: WeekFragmentListener) : FragmentStatePagerAdapter(fm) {
private val mFragments = SparseArray<WeekFragment>() private val mFragments = SparseArray<WeekFragment>()
override fun getCount() = mWeekTimestamps.size override fun getCount() = mWeekTimestamps.size
@ -17,7 +17,7 @@ class MyWeekPagerAdapter(fm: FragmentManager, val mWeekTimestamps: List<Int>, va
override fun getItem(position: Int): Fragment { override fun getItem(position: Int): Fragment {
val bundle = Bundle() val bundle = Bundle()
val weekTimestamp = mWeekTimestamps[position] val weekTimestamp = mWeekTimestamps[position]
bundle.putInt(WEEK_START_TIMESTAMP, weekTimestamp) bundle.putLong(WEEK_START_TIMESTAMP, weekTimestamp)
val fragment = WeekFragment() val fragment = WeekFragment()
fragment.arguments = bundle fragment.arguments = bundle

View File

@ -16,7 +16,7 @@ import kotlinx.android.synthetic.main.dialog_repeat_limit_type_picker.view.*
import org.joda.time.DateTime import org.joda.time.DateTime
import java.util.* import java.util.*
class RepeatLimitTypePickerDialog(val activity: Activity, var repeatLimit: Int, val startTS: Int, val callback: (repeatLimit: Int) -> Unit) { class RepeatLimitTypePickerDialog(val activity: Activity, var repeatLimit: Long, val startTS: Long, val callback: (repeatLimit: Long) -> Unit) {
lateinit var dialog: AlertDialog lateinit var dialog: AlertDialog
var view: View var view: View
@ -76,14 +76,14 @@ class RepeatLimitTypePickerDialog(val activity: Activity, var repeatLimit: Int,
} else { } else {
"-$count" "-$count"
} }
callback(count.toInt()) callback(count.toLong())
} }
} }
dialog.dismiss() dialog.dismiss()
} }
private fun showRepetitionLimitDialog() { private fun showRepetitionLimitDialog() {
val repeatLimitDateTime = Formatter.getDateTimeFromTS(if (repeatLimit != 0) repeatLimit else getNowSeconds()) val repeatLimitDateTime = Formatter.getDateTimeFromTS(if (repeatLimit != 0L) repeatLimit else getNowSeconds())
val datepicker = DatePickerDialog(activity, activity.getDialogTheme(), repetitionLimitDateSetListener, repeatLimitDateTime.year, val datepicker = DatePickerDialog(activity, activity.getDialogTheme(), repetitionLimitDateSetListener, repeatLimitDateTime.year,
repeatLimitDateTime.monthOfYear - 1, repeatLimitDateTime.dayOfMonth) repeatLimitDateTime.monthOfYear - 1, repeatLimitDateTime.dayOfMonth)

View File

@ -94,7 +94,7 @@ fun Context.scheduleNextEventReminder(event: Event, dbHelper: DBHelper, activity
val now = getNowSeconds() val now = getNowSeconds()
val reminderSeconds = event.getReminders().reversed().map { it * 60 } val reminderSeconds = event.getReminders().reversed().map { it * 60 }
dbHelper.getEvents(now, now + YEAR, event.id!!, false) { eventsHelper.getEvents(now, now + YEAR, event.id!!, false) {
if (it.isNotEmpty()) { if (it.isNotEmpty()) {
for (curEvent in it) { for (curEvent in it) {
for (curReminder in reminderSeconds) { for (curReminder in reminderSeconds) {
@ -300,7 +300,7 @@ fun Context.launchNewEventIntent(dayCode: String = Formatter.getTodayCode()) {
} }
} }
fun Context.getNewEventTimestampFromCode(dayCode: String): Int { fun Context.getNewEventTimestampFromCode(dayCode: String): Long {
val currHour = DateTime(System.currentTimeMillis(), DateTimeZone.getDefault()).hourOfDay val currHour = DateTime(System.currentTimeMillis(), DateTimeZone.getDefault()).hourOfDay
val dateTime = Formatter.getLocalDateTimeFromCode(dayCode).withHourOfDay(currHour) val dateTime = Formatter.getLocalDateTimeFromCode(dayCode).withHourOfDay(currHour)
val newDateTime = dateTime.plusHours(1).withMinuteOfHour(0).withSecondOfMinute(0).withMillisOfSecond(0) val newDateTime = dateTime.plusHours(1).withMinuteOfHour(0).withSecondOfMinute(0).withMillisOfSecond(0)
@ -441,7 +441,7 @@ fun Context.getEventListItems(events: List<Event>): ArrayList<ListItem> {
return listItems return listItems
} }
fun Context.handleEventDeleting(eventIds: List<Long>, timestamps: List<Int>, action: Int) { fun Context.handleEventDeleting(eventIds: List<Long>, timestamps: List<Long>, action: Int) {
when (action) { when (action) {
DELETE_SELECTED_OCCURRENCE -> { DELETE_SELECTED_OCCURRENCE -> {
eventIds.forEachIndexed { index, value -> eventIds.forEachIndexed { index, value ->

View File

@ -2,4 +2,4 @@ package com.simplemobiletools.calendar.pro.extensions
import org.joda.time.DateTime import org.joda.time.DateTime
fun DateTime.seconds() = (millis / 1000).toInt() fun DateTime.seconds() = millis / 1000L

View File

@ -1,16 +1,8 @@
package com.simplemobiletools.calendar.pro.extensions package com.simplemobiletools.calendar.pro.extensions
import com.simplemobiletools.calendar.pro.helpers.Formatter
import com.simplemobiletools.calendar.pro.helpers.MONTH import com.simplemobiletools.calendar.pro.helpers.MONTH
import com.simplemobiletools.calendar.pro.helpers.WEEK import com.simplemobiletools.calendar.pro.helpers.WEEK
import com.simplemobiletools.calendar.pro.helpers.YEAR import com.simplemobiletools.calendar.pro.helpers.YEAR
import com.simplemobiletools.calendar.pro.models.Event
fun Int.isTsOnProperDay(event: Event): Boolean {
val dateTime = Formatter.getDateTimeFromTS(this)
val power = Math.pow(2.0, (dateTime.dayOfWeek - 1).toDouble()).toInt()
return event.repeatRule and power != 0
}
fun Int.isXWeeklyRepetition() = this != 0 && this % WEEK == 0 fun Int.isXWeeklyRepetition() = this != 0 && this % WEEK == 0

View File

@ -0,0 +1,10 @@
package com.simplemobiletools.calendar.pro.extensions
import com.simplemobiletools.calendar.pro.helpers.Formatter
import com.simplemobiletools.calendar.pro.models.Event
fun Long.isTsOnProperDay(event: Event): Boolean {
val dateTime = Formatter.getDateTimeFromTS(this)
val power = Math.pow(2.0, (dateTime.dayOfWeek - 1).toDouble()).toInt()
return event.repeatRule and power != 0
}

View File

@ -14,7 +14,7 @@ import com.simplemobiletools.calendar.pro.activities.EventActivity
import com.simplemobiletools.calendar.pro.activities.SimpleActivity import com.simplemobiletools.calendar.pro.activities.SimpleActivity
import com.simplemobiletools.calendar.pro.adapters.DayEventsAdapter import com.simplemobiletools.calendar.pro.adapters.DayEventsAdapter
import com.simplemobiletools.calendar.pro.extensions.config import com.simplemobiletools.calendar.pro.extensions.config
import com.simplemobiletools.calendar.pro.extensions.dbHelper import com.simplemobiletools.calendar.pro.extensions.eventsHelper
import com.simplemobiletools.calendar.pro.helpers.DAY_CODE import com.simplemobiletools.calendar.pro.helpers.DAY_CODE
import com.simplemobiletools.calendar.pro.helpers.EVENT_ID import com.simplemobiletools.calendar.pro.helpers.EVENT_ID
import com.simplemobiletools.calendar.pro.helpers.EVENT_OCCURRENCE_TS import com.simplemobiletools.calendar.pro.helpers.EVENT_OCCURRENCE_TS
@ -105,7 +105,7 @@ class DayFragment : Fragment() {
fun updateCalendar() { fun updateCalendar() {
val startTS = Formatter.getDayStartTS(mDayCode) val startTS = Formatter.getDayStartTS(mDayCode)
val endTS = Formatter.getDayEndTS(mDayCode) val endTS = Formatter.getDayEndTS(mDayCode)
context?.dbHelper?.getEvents(startTS, endTS) { context?.eventsHelper?.getEvents(startTS, endTS) {
receivedEvents(it) receivedEvents(it)
} }
} }

View File

@ -30,8 +30,8 @@ class EventListFragment : MyFragmentHolder(), RefreshRecyclerViewListener {
private var MIN_EVENTS_TRESHOLD = 30 private var MIN_EVENTS_TRESHOLD = 30
private var mEvents = ArrayList<Event>() private var mEvents = ArrayList<Event>()
private var minFetchedTS = 0 private var minFetchedTS = 0L
private var maxFetchedTS = 0 private var maxFetchedTS = 0L
private var wereInitialEventsAdded = false private var wereInitialEventsAdded = false
private var use24HourFormat = false private var use24HourFormat = false
@ -76,7 +76,7 @@ class EventListFragment : MyFragmentHolder(), RefreshRecyclerViewListener {
maxFetchedTS = DateTime().plusMonths(6).seconds() maxFetchedTS = DateTime().plusMonths(6).seconds()
} }
context!!.dbHelper.getEvents(minFetchedTS, maxFetchedTS) { context!!.eventsHelper.getEvents(minFetchedTS, maxFetchedTS) {
if (it.size >= MIN_EVENTS_TRESHOLD) { if (it.size >= MIN_EVENTS_TRESHOLD) {
receivedEvents(it, false) receivedEvents(it, false)
} else { } else {
@ -84,7 +84,7 @@ class EventListFragment : MyFragmentHolder(), RefreshRecyclerViewListener {
minFetchedTS -= FETCH_INTERVAL minFetchedTS -= FETCH_INTERVAL
maxFetchedTS += FETCH_INTERVAL maxFetchedTS += FETCH_INTERVAL
} }
context!!.dbHelper.getEvents(minFetchedTS, maxFetchedTS) { context!!.eventsHelper.getEvents(minFetchedTS, maxFetchedTS) {
mEvents = it mEvents = it
receivedEvents(mEvents, false, !wereInitialEventsAdded) receivedEvents(mEvents, false, !wereInitialEventsAdded)
} }
@ -150,7 +150,7 @@ class EventListFragment : MyFragmentHolder(), RefreshRecyclerViewListener {
private fun fetchPreviousPeriod() { private fun fetchPreviousPeriod() {
val oldMinFetchedTS = minFetchedTS - 1 val oldMinFetchedTS = minFetchedTS - 1
minFetchedTS -= FETCH_INTERVAL minFetchedTS -= FETCH_INTERVAL
context!!.dbHelper.getEvents(minFetchedTS, oldMinFetchedTS) { context!!.eventsHelper.getEvents(minFetchedTS, oldMinFetchedTS) {
mEvents.addAll(0, it) mEvents.addAll(0, it)
receivedEvents(mEvents, false) receivedEvents(mEvents, false)
} }
@ -159,7 +159,7 @@ class EventListFragment : MyFragmentHolder(), RefreshRecyclerViewListener {
private fun fetchNextPeriod(scrollAfterUpdating: Boolean) { private fun fetchNextPeriod(scrollAfterUpdating: Boolean) {
val oldMaxFetchedTS = maxFetchedTS + 1 val oldMaxFetchedTS = maxFetchedTS + 1
maxFetchedTS += FETCH_INTERVAL maxFetchedTS += FETCH_INTERVAL
context!!.dbHelper.getEvents(oldMaxFetchedTS, maxFetchedTS) { context!!.eventsHelper.getEvents(oldMaxFetchedTS, maxFetchedTS) {
mEvents.addAll(it) mEvents.addAll(it)
receivedEvents(mEvents, scrollAfterUpdating) receivedEvents(mEvents, scrollAfterUpdating)
} }

View File

@ -39,7 +39,7 @@ class WeekFragment : Fragment(), WeeklyCalendar {
private val PLUS_FADEOUT_DELAY = 5000L private val PLUS_FADEOUT_DELAY = 5000L
var mListener: WeekFragmentListener? = null var mListener: WeekFragmentListener? = null
private var mWeekTimestamp = 0 private var mWeekTimestamp = 0L
private var mRowHeight = 0f private var mRowHeight = 0f
private var minScrollY = -1 private var minScrollY = -1
private var maxScrollY = -1 private var maxScrollY = -1
@ -75,7 +75,7 @@ class WeekFragment : Fragment(), WeeklyCalendar {
mConfig = context!!.config mConfig = context!!.config
mRowHeight = mRes.getDimension(R.dimen.weekly_view_row_height) mRowHeight = mRes.getDimension(R.dimen.weekly_view_row_height)
minScrollY = (mRowHeight * mConfig.startWeeklyAt).toInt() minScrollY = (mRowHeight * mConfig.startWeeklyAt).toInt()
mWeekTimestamp = arguments!!.getInt(WEEK_START_TIMESTAMP) mWeekTimestamp = arguments!!.getLong(WEEK_START_TIMESTAMP)
dimPastEvents = mConfig.dimPastEvents dimPastEvents = mConfig.dimPastEvents
primaryColor = context!!.getAdjustedPrimaryColor() primaryColor = context!!.getAdjustedPrimaryColor()
allDayRows.add(HashSet()) allDayRows.add(HashSet())

View File

@ -28,8 +28,8 @@ class WeekFragmentsHolder : MyFragmentHolder(), WeekFragmentListener {
private var weekHolder: ViewGroup? = null private var weekHolder: ViewGroup? = null
private var defaultWeeklyPage = 0 private var defaultWeeklyPage = 0
private var thisWeekTS = 0 private var thisWeekTS = 0L
private var currentWeekTS = 0 private var currentWeekTS = 0L
private var isGoToTodayVisible = false private var isGoToTodayVisible = false
private var weekScrollY = 0 private var weekScrollY = 0
@ -95,15 +95,15 @@ class WeekFragmentsHolder : MyFragmentHolder(), WeekFragmentListener {
updateActionBarTitle() updateActionBarTitle()
} }
private fun getWeekTimestamps(targetSeconds: Int): List<Int> { private fun getWeekTimestamps(targetSeconds: Long): List<Long> {
val weekTSs = ArrayList<Int>(PREFILLED_WEEKS) val weekTSs = ArrayList<Long>(PREFILLED_WEEKS)
for (i in -PREFILLED_WEEKS / 2..PREFILLED_WEEKS / 2) { for (i in -PREFILLED_WEEKS / 2..PREFILLED_WEEKS / 2) {
weekTSs.add(Formatter.getDateTimeFromTS(targetSeconds).plusWeeks(i).seconds()) weekTSs.add(Formatter.getDateTimeFromTS(targetSeconds).plusWeeks(i).seconds())
} }
return weekTSs return weekTSs
} }
private fun setupWeeklyActionbarTitle(timestamp: Int) { private fun setupWeeklyActionbarTitle(timestamp: Long) {
val startDateTime = Formatter.getDateTimeFromTS(timestamp) val startDateTime = Formatter.getDateTimeFromTS(timestamp)
val endDateTime = Formatter.getDateTimeFromTS(timestamp + WEEK_SECONDS) val endDateTime = Formatter.getDateTimeFromTS(timestamp + WEEK_SECONDS)
val startMonthName = Formatter.getMonthName(context!!, startDateTime.monthOfYear) val startMonthName = Formatter.getMonthName(context!!, startDateTime.monthOfYear)

View File

@ -183,8 +183,8 @@ class CalDAVHelper(val context: Context) {
val id = cursor.getLongValue(CalendarContract.Events._ID) val id = cursor.getLongValue(CalendarContract.Events._ID)
val title = cursor.getStringValue(CalendarContract.Events.TITLE) ?: "" val title = cursor.getStringValue(CalendarContract.Events.TITLE) ?: ""
val description = cursor.getStringValue(CalendarContract.Events.DESCRIPTION) ?: "" val description = cursor.getStringValue(CalendarContract.Events.DESCRIPTION) ?: ""
val startTS = (cursor.getLongValue(CalendarContract.Events.DTSTART) / 1000).toInt() val startTS = cursor.getLongValue(CalendarContract.Events.DTSTART) / 1000L
var endTS = (cursor.getLongValue(CalendarContract.Events.DTEND) / 1000).toInt() var endTS = cursor.getLongValue(CalendarContract.Events.DTEND) / 1000L
val allDay = cursor.getIntValue(CalendarContract.Events.ALL_DAY) val allDay = cursor.getIntValue(CalendarContract.Events.ALL_DAY)
val rrule = cursor.getStringValue(CalendarContract.Events.RRULE) ?: "" val rrule = cursor.getStringValue(CalendarContract.Events.RRULE) ?: ""
val location = cursor.getStringValue(CalendarContract.Events.EVENT_LOCATION) ?: "" val location = cursor.getStringValue(CalendarContract.Events.EVENT_LOCATION) ?: ""
@ -192,7 +192,7 @@ class CalDAVHelper(val context: Context) {
val originalInstanceTime = cursor.getLongValue(CalendarContract.Events.ORIGINAL_INSTANCE_TIME) val originalInstanceTime = cursor.getLongValue(CalendarContract.Events.ORIGINAL_INSTANCE_TIME)
val reminders = getCalDAVEventReminders(id) val reminders = getCalDAVEventReminders(id)
if (endTS == 0) { if (endTS == 0L) {
val duration = cursor.getStringValue(CalendarContract.Events.DURATION) ?: "" val duration = cursor.getStringValue(CalendarContract.Events.DURATION) ?: ""
endTS = startTS + Parser().parseDurationSeconds(duration) endTS = startTS + Parser().parseDurationSeconds(duration)
} }
@ -234,7 +234,7 @@ class CalDAVHelper(val context: Context) {
val parentEventId = context.eventsDB.getEventIdWithImportId(parentImportId) val parentEventId = context.eventsDB.getEventIdWithImportId(parentImportId)
if (parentEventId != null) { if (parentEventId != null) {
event.parentId = parentEventId event.parentId = parentEventId
eventsHelper.addEventRepeatException(parentEventId, (originalInstanceTime / 1000).toInt(), false, event.importId) eventsHelper.addEventRepeatException(parentEventId, originalInstanceTime / 1000L, false, event.importId)
} }
} }
@ -353,7 +353,7 @@ class CalDAVHelper(val context: Context) {
val dur = Math.max(1, (event.endTS - event.startTS) / DAY) val dur = Math.max(1, (event.endTS - event.startTS) / DAY)
"P${dur}D" "P${dur}D"
} else { } else {
Parser().getDurationCode((event.endTS - event.startTS) / 60) Parser().getDurationCode((event.endTS - event.startTS) / 60L)
} }
} }
@ -373,7 +373,7 @@ class CalDAVHelper(val context: Context) {
} }
@SuppressLint("MissingPermission") @SuppressLint("MissingPermission")
fun insertEventRepeatException(event: Event, occurrenceTS: Int): Long { fun insertEventRepeatException(event: Event, occurrenceTS: Long): Long {
val uri = CalendarContract.Events.CONTENT_URI val uri = CalendarContract.Events.CONTENT_URI
val values = fillEventRepeatExceptionValues(event, occurrenceTS) val values = fillEventRepeatExceptionValues(event, occurrenceTS)
val newUri = context.contentResolver.insert(uri, values) val newUri = context.contentResolver.insert(uri, values)
@ -381,7 +381,7 @@ class CalDAVHelper(val context: Context) {
return java.lang.Long.parseLong(newUri.lastPathSegment) return java.lang.Long.parseLong(newUri.lastPathSegment)
} }
private fun fillEventRepeatExceptionValues(event: Event, occurrenceTS: Int): ContentValues { private fun fillEventRepeatExceptionValues(event: Event, occurrenceTS: Long): ContentValues {
return ContentValues().apply { return ContentValues().apply {
put(CalendarContract.Events.CALENDAR_ID, event.getCalDAVCalendarId()) put(CalendarContract.Events.CALENDAR_ID, event.getCalDAVCalendarId())
put(CalendarContract.Events.DTSTART, occurrenceTS) put(CalendarContract.Events.DTSTART, occurrenceTS)

View File

@ -143,4 +143,4 @@ const val DELETE_SELECTED_OCCURRENCE = 0
const val DELETE_FUTURE_OCCURRENCES = 1 const val DELETE_FUTURE_OCCURRENCES = 1
const val DELETE_ALL_OCCURRENCES = 2 const val DELETE_ALL_OCCURRENCES = 2
fun getNowSeconds() = (System.currentTimeMillis() / 1000).toInt() fun getNowSeconds() = System.currentTimeMillis() / 1000L

View File

@ -55,49 +55,7 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont
override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {} override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {}
fun getEvents(fromTS: Int, toTS: Int, eventId: Long = -1L, applyTypeFilter: Boolean = true, callback: (events: ArrayList<Event>) -> Unit) { fun getRepeatableEventsFor(fromTS: Long, toTS: Long, eventId: Long = -1L, applyTypeFilter: Boolean = false): List<Event> {
Thread {
getEventsInBackground(fromTS, toTS, eventId, applyTypeFilter, callback)
}.start()
}
fun getEventsInBackground(fromTS: Int, toTS: Int, eventId: Long = -1L, applyTypeFilter: Boolean, callback: (events: ArrayList<Event>) -> Unit) {
var events = ArrayList<Event>()
//var selection = "$COL_START_TS <= ? AND $COL_END_TS >= ? AND $COL_REPEAT_INTERVAL IS NULL AND $COL_START_TS != 0"
var selection = "$COL_START_TS <= ? AND $COL_END_TS >= ? AND $COL_START_TS != 0"
if (eventId != -1L) {
selection += " AND $MAIN_TABLE_NAME.$COL_ID = $eventId"
}
if (applyTypeFilter) {
val displayEventTypes = context.config.displayEventTypes
if (displayEventTypes.isEmpty()) {
callback(ArrayList())
return
} else {
val types = TextUtils.join(",", displayEventTypes)
selection += " AND $COL_EVENT_TYPE IN ($types)"
}
}
val selectionArgs = arrayOf(toTS.toString(), fromTS.toString())
val cursor = getEventsCursor(selection, selectionArgs)
events.addAll(fillEvents(cursor))
//events.addAll(getRepeatableEventsFor(fromTS, toTS, eventId, applyTypeFilter))
events.addAll(getAllDayEvents(fromTS, eventId, applyTypeFilter))
events = events
.asSequence()
.distinct()
.filterNot { context.eventsHelper.getEventRepetitionIgnoredOccurrences(it).contains(Formatter.getDayCodeFromTS(it.startTS)) }
.toMutableList() as ArrayList<Event>
callback(events)
}
fun getRepeatableEventsFor(fromTS: Int, toTS: Int, eventId: Long = -1L, applyTypeFilter: Boolean = false): List<Event> {
val newEvents = ArrayList<Event>() val newEvents = ArrayList<Event>()
//var selection = "$COL_REPEAT_INTERVAL != 0 AND $COL_START_TS <= $toTS AND $COL_START_TS != 0" //var selection = "$COL_REPEAT_INTERVAL != 0 AND $COL_START_TS <= $toTS AND $COL_START_TS != 0"
var selection = "$COL_START_TS <= $toTS AND $COL_START_TS != 0" var selection = "$COL_START_TS <= $toTS AND $COL_START_TS != 0"
@ -115,7 +73,7 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont
} }
val events = getEvents(selection) val events = getEvents(selection)
val startTimes = LongSparseArray<Int>() val startTimes = LongSparseArray<Long>()
events.forEach { events.forEach {
startTimes.put(it.id!!, it.startTS) startTimes.put(it.id!!, it.startTS)
if (it.repeatLimit >= 0) { if (it.repeatLimit >= 0) {
@ -128,10 +86,10 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont
return newEvents return newEvents
} }
private fun getEventsRepeatingTillDateOrForever(fromTS: Int, toTS: Int, startTimes: LongSparseArray<Int>, event: Event): ArrayList<Event> { private fun getEventsRepeatingTillDateOrForever(fromTS: Long, toTS: Long, startTimes: LongSparseArray<Long>, event: Event): ArrayList<Event> {
val original = event.copy() val original = event.copy()
val events = ArrayList<Event>() val events = ArrayList<Event>()
while (event.startTS <= toTS && (event.repeatLimit == 0 || event.repeatLimit >= event.startTS)) { while (event.startTS <= toTS && (event.repeatLimit == 0L || event.repeatLimit >= event.startTS)) {
if (event.endTS >= fromTS) { if (event.endTS >= fromTS) {
if (event.repeatInterval.isXWeeklyRepetition()) { if (event.repeatInterval.isXWeeklyRepetition()) {
if (event.startTS.isTsOnProperDay(event)) { if (event.startTS.isTsOnProperDay(event)) {
@ -180,7 +138,7 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont
return events return events
} }
private fun getEventsRepeatingXTimes(fromTS: Int, toTS: Int, startTimes: LongSparseArray<Int>, event: Event): ArrayList<Event> { private fun getEventsRepeatingXTimes(fromTS: Long, toTS: Long, startTimes: LongSparseArray<Long>, event: Event): ArrayList<Event> {
val original = event.copy() val original = event.copy()
val events = ArrayList<Event>() val events = ArrayList<Event>()
while (event.repeatLimit < 0 && event.startTS <= toTS) { while (event.repeatLimit < 0 && event.startTS <= toTS) {
@ -222,7 +180,7 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont
return events return events
} }
private fun getAllDayEvents(fromTS: Int, eventId: Long = -1L, applyTypeFilter: Boolean = false): List<Event> { private fun getAllDayEvents(fromTS: Long, eventId: Long = -1L, applyTypeFilter: Boolean = false): List<Event> {
val events = ArrayList<Event>() val events = ArrayList<Event>()
var selection = "($COL_FLAGS & $FLAG_ALL_DAY) != 0" var selection = "($COL_FLAGS & $FLAG_ALL_DAY) != 0"
if (eventId != -1L) if (eventId != -1L)
@ -326,14 +284,14 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont
if (cursor.moveToFirst()) { if (cursor.moveToFirst()) {
do { do {
val id = cursor.getLongValue(COL_ID) val id = cursor.getLongValue(COL_ID)
val startTS = cursor.getIntValue(COL_START_TS) val startTS = cursor.getLongValue(COL_START_TS)
val endTS = cursor.getIntValue(COL_END_TS) val endTS = cursor.getLongValue(COL_END_TS)
val reminder1Minutes = cursor.getIntValue(COL_REMINDER_MINUTES) val reminder1Minutes = cursor.getIntValue(COL_REMINDER_MINUTES)
val reminder2Minutes = cursor.getIntValue(COL_REMINDER_MINUTES_2) val reminder2Minutes = cursor.getIntValue(COL_REMINDER_MINUTES_2)
val reminder3Minutes = cursor.getIntValue(COL_REMINDER_MINUTES_3) val reminder3Minutes = cursor.getIntValue(COL_REMINDER_MINUTES_3)
val repeatInterval = 0 val repeatInterval = 0
var repeatRule = 0 var repeatRule = 0
val repeatLimit = 0 val repeatLimit = 0L
val title = cursor.getStringValue(COL_TITLE) val title = cursor.getStringValue(COL_TITLE)
val location = cursor.getStringValue(COL_LOCATION) val location = cursor.getStringValue(COL_LOCATION)
val description = cursor.getStringValue(COL_DESCRIPTION) val description = cursor.getStringValue(COL_DESCRIPTION)

View File

@ -181,7 +181,7 @@ class EventsHelper(val context: Context) {
deleteEvents(eventIds, true) deleteEvents(eventIds, true)
} }
fun addEventRepeatLimit(eventId: Long, limitTS: Int) { fun addEventRepeatLimit(eventId: Long, limitTS: Long) {
val time = Formatter.getDateTimeFromTS(limitTS) val time = Formatter.getDateTimeFromTS(limitTS)
eventRepetitionsDB.updateEventRepetitionLimit(limitTS - time.hourOfDay, eventId) eventRepetitionsDB.updateEventRepetitionLimit(limitTS - time.hourOfDay, eventId)
@ -212,7 +212,7 @@ class EventsHelper(val context: Context) {
}.start() }.start()
} }
fun addEventRepeatException(parentEventId: Long, occurrenceTS: Int, addToCalDAV: Boolean, childImportId: String? = null) { fun addEventRepeatException(parentEventId: Long, occurrenceTS: Long, addToCalDAV: Boolean, childImportId: String? = null) {
fillExceptionValues(parentEventId, occurrenceTS, addToCalDAV, childImportId) { fillExceptionValues(parentEventId, occurrenceTS, addToCalDAV, childImportId) {
context.eventRepetitionExceptionsDB.insert(it) context.eventRepetitionExceptionsDB.insert(it)
@ -223,7 +223,7 @@ class EventsHelper(val context: Context) {
} }
} }
private fun fillExceptionValues(parentEventId: Long, occurrenceTS: Int, addToCalDAV: Boolean, childImportId: String?, callback: (eventRepetitionException: EventRepetitionException) -> Unit) { private fun fillExceptionValues(parentEventId: Long, occurrenceTS: Long, addToCalDAV: Boolean, childImportId: String?, callback: (eventRepetitionException: EventRepetitionException) -> Unit) {
val childEvent = eventsDB.getEventWithId(parentEventId) ?: return val childEvent = eventsDB.getEventWithId(parentEventId) ?: return
childEvent.apply { childEvent.apply {
@ -253,4 +253,46 @@ class EventsHelper(val context: Context) {
}.start() }.start()
} }
} }
fun getEvents(fromTS: Long, toTS: Long, eventId: Long = -1L, applyTypeFilter: Boolean = true, callback: (events: ArrayList<Event>) -> Unit) {
Thread {
getEventsSync(fromTS, toTS, eventId, applyTypeFilter, callback)
}.start()
}
fun getEventsSync(fromTS: Long, toTS: Long, eventId: Long = -1L, applyTypeFilter: Boolean, callback: (events: ArrayList<Event>) -> Unit) {
/*var events = ArrayList<Event>()
var selection = "$COL_START_TS <= ? AND $COL_END_TS >= ? AND $COL_REPEAT_INTERVAL IS NULL AND $COL_START_TS != 0"
var selection = "$COL_START_TS <= ? AND $COL_END_TS >= ? AND $COL_START_TS != 0"
if (eventId != -1L) {
selection += " AND $MAIN_TABLE_NAME.$COL_ID = $eventId"
}
if (applyTypeFilter) {
val displayEventTypes = context.config.displayEventTypes
if (displayEventTypes.isEmpty()) {
callback(ArrayList())
return
} else {
val types = TextUtils.join(",", displayEventTypes)
selection += " AND $COL_EVENT_TYPE IN ($types)"
}
}
val selectionArgs = arrayOf(toTS.toString(), fromTS.toString())
val cursor = getEventsCursor(selection, selectionArgs)
events.addAll(fillEvents(cursor))
events.addAll(getRepeatableEventsFor(fromTS, toTS, eventId, applyTypeFilter))
events.addAll(getAllDayEvents(fromTS, eventId, applyTypeFilter))
events = events
.asSequence()
.distinct()
.filterNot { context.eventsHelper.getEventRepetitionIgnoredOccurrences(it).contains(Formatter.getDayCodeFromTS(it.startTS)) }
.toMutableList() as ArrayList<Event>
callback(events)*/
}
} }

View File

@ -46,7 +46,7 @@ object Formatter {
date date
} }
fun getLongestDate(ts: Int) = getDateTimeFromTS(ts).toString(LONGEST_PATTERN) fun getLongestDate(ts: Long) = getDateTimeFromTS(ts).toString(LONGEST_PATTERN)
fun getDate(context: Context, dateTime: DateTime, addDayOfWeek: Boolean = true) = getDayTitle(context, getDayCodeFromDateTime(dateTime), addDayOfWeek) fun getDate(context: Context, dateTime: DateTime, addDayOfWeek: Boolean = true) = getDayTitle(context, getDayCodeFromDateTime(dateTime), addDayOfWeek)
@ -68,7 +68,7 @@ object Formatter {
fun getLocalDateTimeFromCode(dayCode: String) = DateTimeFormat.forPattern(DAYCODE_PATTERN).withZone(DateTimeZone.getDefault()).parseLocalDate(dayCode).toDateTimeAtStartOfDay() fun getLocalDateTimeFromCode(dayCode: String) = DateTimeFormat.forPattern(DAYCODE_PATTERN).withZone(DateTimeZone.getDefault()).parseLocalDate(dayCode).toDateTimeAtStartOfDay()
fun getTimeFromTS(context: Context, ts: Int) = getTime(context, getDateTimeFromTS(ts)) fun getTimeFromTS(context: Context, ts: Long) = getTime(context, getDateTimeFromTS(ts))
fun getDayStartTS(dayCode: String) = getLocalDateTimeFromCode(dayCode).seconds() fun getDayStartTS(dayCode: String) = getLocalDateTimeFromCode(dayCode).seconds()
@ -76,11 +76,11 @@ object Formatter {
fun getDayCodeFromDateTime(dateTime: DateTime) = dateTime.toString(DAYCODE_PATTERN) fun getDayCodeFromDateTime(dateTime: DateTime) = dateTime.toString(DAYCODE_PATTERN)
fun getDateFromTS(ts: Int) = LocalDate(ts * 1000L, DateTimeZone.getDefault()) fun getDateFromTS(ts: Long) = LocalDate(ts * 1000L, DateTimeZone.getDefault())
fun getDateTimeFromTS(ts: Int) = DateTime(ts * 1000L, DateTimeZone.getDefault()) fun getDateTimeFromTS(ts: Long) = DateTime(ts * 1000L, DateTimeZone.getDefault())
fun getUTCDateTimeFromTS(ts: Int) = DateTime(ts * 1000L, DateTimeZone.UTC) fun getUTCDateTimeFromTS(ts: Long) = DateTime(ts * 1000L, DateTimeZone.UTC)
// use manually translated month names, as DateFormat and Joda have issues with a lot of languages // use manually translated month names, as DateFormat and Joda have issues with a lot of languages
fun getMonthName(context: Context, id: Int) = context.resources.getStringArray(R.array.months)[id - 1] fun getMonthName(context: Context, id: Int) = context.resources.getStringArray(R.array.months)[id - 1]
@ -94,7 +94,7 @@ object Formatter {
return "${dateTime.toString(DAYCODE_PATTERN)}T${dateTime.toString(TIME_PATTERN)}Z" return "${dateTime.toString(DAYCODE_PATTERN)}T${dateTime.toString(TIME_PATTERN)}Z"
} }
fun getDayCodeFromTS(ts: Int): String { fun getDayCodeFromTS(ts: Long): String {
val daycode = getDateTimeFromTS(ts).toString(DAYCODE_PATTERN) val daycode = getDateTimeFromTS(ts).toString(DAYCODE_PATTERN)
return if (daycode.isNotEmpty()) { return if (daycode.isNotEmpty()) {
daycode daycode
@ -103,5 +103,5 @@ object Formatter {
} }
} }
fun getShiftedImportTimestamp(ts: Int) = getUTCDateTimeFromTS(ts).withTime(13, 0, 0, 0).withZoneRetainFields(DateTimeZone.getDefault()).seconds() fun getShiftedImportTimestamp(ts: Long) = getUTCDateTimeFromTS(ts).withTime(13, 0, 0, 0).withZoneRetainFields(DateTimeZone.getDefault()).seconds()
} }

View File

@ -86,7 +86,7 @@ class IcsExporter {
out.apply { out.apply {
writeLn(BEGIN_ALARM) writeLn(BEGIN_ALARM)
writeLn("$ACTION$DISPLAY") writeLn("$ACTION$DISPLAY")
writeLn("$TRIGGER-${Parser().getDurationCode(minutes)}") writeLn("$TRIGGER-${Parser().getDurationCode(minutes.toLong())}")
writeLn(END_ALARM) writeLn(END_ALARM)
} }
} }

View File

@ -17,17 +17,17 @@ class IcsImporter(val activity: SimpleActivity) {
IMPORT_FAIL, IMPORT_OK, IMPORT_PARTIAL IMPORT_FAIL, IMPORT_OK, IMPORT_PARTIAL
} }
private var curStart = -1 private var curStart = -1L
private var curEnd = -1 private var curEnd = -1L
private var curTitle = "" private var curTitle = ""
private var curLocation = "" private var curLocation = ""
private var curDescription = "" private var curDescription = ""
private var curImportId = "" private var curImportId = ""
private var curFlags = 0 private var curFlags = 0
private var curReminderMinutes = ArrayList<Int>() private var curReminderMinutes = ArrayList<Int>()
private var curRepeatExceptions = ArrayList<Int>() private var curRepeatExceptions = ArrayList<Long>()
private var curRepeatInterval = 0 private var curRepeatInterval = 0
private var curRepeatLimit = 0 private var curRepeatLimit = 0L
private var curRepeatRule = 0 private var curRepeatRule = 0
private var curEventTypeId = REGULAR_EVENT_TYPE_ID private var curEventTypeId = REGULAR_EVENT_TYPE_ID
private var curLastModified = 0L private var curLastModified = 0L
@ -126,11 +126,11 @@ class IcsImporter(val activity: SimpleActivity) {
curReminderMinutes.add(curReminderTriggerMinutes) curReminderMinutes.add(curReminderTriggerMinutes)
} }
} else if (line == END_EVENT) { } else if (line == END_EVENT) {
if (curStart != -1 && curEnd == -1) { if (curStart != -1L && curEnd == -1L) {
curEnd = curStart curEnd = curStart
} }
if (curTitle.isEmpty() || curStart == -1) { if (curTitle.isEmpty() || curStart == -1L) {
continue continue
} }
@ -191,7 +191,7 @@ class IcsImporter(val activity: SimpleActivity) {
} }
} }
private fun getTimestamp(fullString: String): Int { private fun getTimestamp(fullString: String): Long {
return try { return try {
if (fullString.startsWith(';')) { if (fullString.startsWith(';')) {
val value = fullString.substring(fullString.lastIndexOf(':') + 1) val value = fullString.substring(fullString.lastIndexOf(':') + 1)
@ -244,8 +244,8 @@ class IcsImporter(val activity: SimpleActivity) {
} }
private fun resetValues() { private fun resetValues() {
curStart = -1 curStart = -1L
curEnd = -1 curEnd = -1L
curTitle = "" curTitle = ""
curLocation = "" curLocation = ""
curDescription = "" curDescription = ""
@ -254,7 +254,7 @@ class IcsImporter(val activity: SimpleActivity) {
curReminderMinutes = ArrayList() curReminderMinutes = ArrayList()
curRepeatExceptions = ArrayList() curRepeatExceptions = ArrayList()
curRepeatInterval = 0 curRepeatInterval = 0
curRepeatLimit = 0 curRepeatLimit = 0L
curRepeatRule = 0 curRepeatRule = 0
curEventTypeId = REGULAR_EVENT_TYPE_ID curEventTypeId = REGULAR_EVENT_TYPE_ID
curLastModified = 0L curLastModified = 0L

View File

@ -2,7 +2,7 @@ package com.simplemobiletools.calendar.pro.helpers
import android.content.Context import android.content.Context
import com.simplemobiletools.calendar.pro.extensions.config import com.simplemobiletools.calendar.pro.extensions.config
import com.simplemobiletools.calendar.pro.extensions.dbHelper import com.simplemobiletools.calendar.pro.extensions.eventsHelper
import com.simplemobiletools.calendar.pro.extensions.seconds import com.simplemobiletools.calendar.pro.extensions.seconds
import com.simplemobiletools.calendar.pro.interfaces.MonthlyCalendar import com.simplemobiletools.calendar.pro.interfaces.MonthlyCalendar
import com.simplemobiletools.calendar.pro.models.DayMonthly import com.simplemobiletools.calendar.pro.models.DayMonthly
@ -24,7 +24,7 @@ class MonthlyCalendarImpl(val callback: MonthlyCalendar, val context: Context) {
mTargetDate = targetDate mTargetDate = targetDate
val startTS = mTargetDate.minusDays(7).seconds() val startTS = mTargetDate.minusDays(7).seconds()
val endTS = mTargetDate.plusDays(43).seconds() val endTS = mTargetDate.plusDays(43).seconds()
context.dbHelper.getEvents(startTS, endTS) { context.eventsHelper.getEvents(startTS, endTS) {
gotEvents(it) gotEvents(it)
} }
} }

View File

@ -12,11 +12,11 @@ import org.joda.time.format.DateTimeFormat
class Parser { class Parser {
// from RRULE:FREQ=DAILY;COUNT=5 to Daily, 5x... // from RRULE:FREQ=DAILY;COUNT=5 to Daily, 5x...
fun parseRepeatInterval(fullString: String, startTS: Int): EventRepetition { fun parseRepeatInterval(fullString: String, startTS: Long): EventRepetition {
val parts = fullString.split(";").filter { it.isNotEmpty() } val parts = fullString.split(";").filter { it.isNotEmpty() }
var repeatInterval = 0 var repeatInterval = 0
var repeatRule = 0 var repeatRule = 0
var repeatLimit = 0 var repeatLimit = 0L
for (part in parts) { for (part in parts) {
val keyValue = part.split("=") val keyValue = part.split("=")
@ -31,7 +31,7 @@ class Parser {
repeatRule = REPEAT_SAME_DAY repeatRule = REPEAT_SAME_DAY
} }
} else if (key == COUNT) { } else if (key == COUNT) {
repeatLimit = -value.toInt() repeatLimit = -value.toLong()
} else if (key == UNTIL) { } else if (key == UNTIL) {
repeatLimit = parseDateTimeValue(value) repeatLimit = parseDateTimeValue(value)
} else if (key == INTERVAL) { } else if (key == INTERVAL) {
@ -76,7 +76,7 @@ class Parser {
return newRepeatRule return newRepeatRule
} }
fun parseDateTimeValue(value: String): Int { fun parseDateTimeValue(value: String): Long {
val edited = value.replace("T", "").replace("Z", "") val edited = value.replace("T", "").replace("Z", "")
return if (edited.length == 14) { return if (edited.length == 14) {
parseLongFormat(edited, value.endsWith("Z")) parseLongFormat(edited, value.endsWith("Z"))
@ -86,7 +86,7 @@ class Parser {
} }
} }
private fun parseLongFormat(digitString: String, useUTC: Boolean): Int { private fun parseLongFormat(digitString: String, useUTC: Boolean): Long {
val dateTimeFormat = DateTimeFormat.forPattern("yyyyMMddHHmmss") val dateTimeFormat = DateTimeFormat.forPattern("yyyyMMddHHmmss")
val dateTimeZone = if (useUTC) DateTimeZone.UTC else DateTimeZone.getDefault() val dateTimeZone = if (useUTC) DateTimeZone.UTC else DateTimeZone.getDefault()
return dateTimeFormat.parseDateTime(digitString).withZoneRetainFields(dateTimeZone).seconds() return dateTimeFormat.parseDateTime(digitString).withZoneRetainFields(dateTimeZone).seconds()
@ -121,7 +121,7 @@ class Parser {
} }
private fun getRepeatLimitString(event: Event) = when { private fun getRepeatLimitString(event: Event) = when {
event.repeatLimit == 0 -> "" event.repeatLimit == 0L -> ""
event.repeatLimit < 0 -> ";$COUNT=${-event.repeatLimit}" event.repeatLimit < 0 -> ";$COUNT=${-event.repeatLimit}"
else -> ";$UNTIL=${Formatter.getDayCodeFromTS(event.repeatLimit)}" else -> ";$UNTIL=${Formatter.getDayCodeFromTS(event.repeatLimit)}"
} }
@ -202,7 +202,7 @@ class Parser {
private fun getDurationValue(duration: String, char: String) = Regex("[0-9]+(?=$char)").find(duration)?.value?.toInt() ?: 0 private fun getDurationValue(duration: String, char: String) = Regex("[0-9]+(?=$char)").find(duration)?.value?.toInt() ?: 0
// from 65 to P0DT1H5M0S // from 65 to P0DT1H5M0S
fun getDurationCode(minutes: Int): String { fun getDurationCode(minutes: Long): String {
var days = 0 var days = 0
var hours = 0 var hours = 0
var remainder = minutes var remainder = minutes

View File

@ -1,7 +1,7 @@
package com.simplemobiletools.calendar.pro.helpers package com.simplemobiletools.calendar.pro.helpers
import android.content.Context import android.content.Context
import com.simplemobiletools.calendar.pro.extensions.dbHelper import com.simplemobiletools.calendar.pro.extensions.eventsHelper
import com.simplemobiletools.calendar.pro.interfaces.WeeklyCalendar import com.simplemobiletools.calendar.pro.interfaces.WeeklyCalendar
import com.simplemobiletools.calendar.pro.models.Event import com.simplemobiletools.calendar.pro.models.Event
import com.simplemobiletools.commons.helpers.WEEK_SECONDS import com.simplemobiletools.commons.helpers.WEEK_SECONDS
@ -10,9 +10,9 @@ import java.util.*
class WeeklyCalendarImpl(val callback: WeeklyCalendar, val context: Context) { class WeeklyCalendarImpl(val callback: WeeklyCalendar, val context: Context) {
var mEvents = ArrayList<Event>() var mEvents = ArrayList<Event>()
fun updateWeeklyCalendar(weekStartTS: Int) { fun updateWeeklyCalendar(weekStartTS: Long) {
val endTS = weekStartTS + WEEK_SECONDS val endTS = weekStartTS + WEEK_SECONDS
context.dbHelper.getEvents(weekStartTS, endTS) { context.eventsHelper.getEvents(weekStartTS, endTS) {
mEvents = it mEvents = it
callback.updateWeeklyCalendar(it) callback.updateWeeklyCalendar(it)
} }

View File

@ -2,7 +2,7 @@ package com.simplemobiletools.calendar.pro.helpers
import android.content.Context import android.content.Context
import android.util.SparseArray import android.util.SparseArray
import com.simplemobiletools.calendar.pro.extensions.dbHelper import com.simplemobiletools.calendar.pro.extensions.eventsHelper
import com.simplemobiletools.calendar.pro.extensions.seconds import com.simplemobiletools.calendar.pro.extensions.seconds
import com.simplemobiletools.calendar.pro.interfaces.YearlyCalendar import com.simplemobiletools.calendar.pro.interfaces.YearlyCalendar
import com.simplemobiletools.calendar.pro.models.DayYearly import com.simplemobiletools.calendar.pro.models.DayYearly
@ -16,7 +16,7 @@ class YearlyCalendarImpl(val callback: YearlyCalendar, val context: Context, val
val startDateTime = DateTime().withTime(0, 0, 0, 0).withDate(year, 1, 1) val startDateTime = DateTime().withTime(0, 0, 0, 0).withDate(year, 1, 1)
val startTS = startDateTime.seconds() val startTS = startDateTime.seconds()
val endTS = startDateTime.plusYears(1).minusSeconds(1).seconds() val endTS = startDateTime.plusYears(1).minusSeconds(1).seconds()
context.dbHelper.getEvents(startTS, endTS) { context.eventsHelper.getEvents(startTS, endTS) {
gotEvents(it) gotEvents(it)
} }
} }

View File

@ -15,5 +15,5 @@ interface EventRepetitionsDao {
fun deleteEventRepetitionsOfEvent(eventId: Long) fun deleteEventRepetitionsOfEvent(eventId: Long)
@Query("UPDATE event_repetitions SET repeat_limit = :repeatLimit WHERE event_id = :eventId") @Query("UPDATE event_repetitions SET repeat_limit = :repeatLimit WHERE event_id = :eventId")
fun updateEventRepetitionLimit(repeatLimit: Int, eventId: Long) fun updateEventRepetitionLimit(repeatLimit: Long, eventId: Long)
} }

View File

@ -17,6 +17,9 @@ interface EventsDao {
@Query("SELECT id FROM events") @Query("SELECT id FROM events")
fun getEventIds(): List<Long> fun getEventIds(): List<Long>
@Query("SELECT * FROM events WHERE start_ts <= :startTS AND end_ts >= :endTS AND start_ts != 0")
fun getEventsFromTo(startTS: Long, endTS: Long): List<Event>
@Query("SELECT id FROM events WHERE import_id = :importId") @Query("SELECT id FROM events WHERE import_id = :importId")
fun getEventIdWithImportId(importId: String): Long? fun getEventIdWithImportId(importId: String): Long?

View File

@ -15,8 +15,8 @@ import java.io.Serializable
@Entity(tableName = "events", indices = [(Index(value = ["id"], unique = true))]) @Entity(tableName = "events", indices = [(Index(value = ["id"], unique = true))])
data class Event( data class Event(
@PrimaryKey(autoGenerate = true) var id: Long?, @PrimaryKey(autoGenerate = true) var id: Long?,
@ColumnInfo(name = "start_ts") var startTS: Int = 0, @ColumnInfo(name = "start_ts") var startTS: Long = 0L,
@ColumnInfo(name = "end_ts") var endTS: Int = 0, @ColumnInfo(name = "end_ts") var endTS: Long = 0L,
@ColumnInfo(name = "title") var title: String = "", @ColumnInfo(name = "title") var title: String = "",
@ColumnInfo(name = "location") var location: String = "", @ColumnInfo(name = "location") var location: String = "",
@ColumnInfo(name = "description") var description: String = "", @ColumnInfo(name = "description") var description: String = "",
@ -25,7 +25,7 @@ data class Event(
@ColumnInfo(name = "reminder_3_minutes") var reminder3Minutes: Int = -1, @ColumnInfo(name = "reminder_3_minutes") var reminder3Minutes: Int = -1,
@ColumnInfo(name = "repeat_interval") var repeatInterval: Int = 0, @ColumnInfo(name = "repeat_interval") var repeatInterval: Int = 0,
@ColumnInfo(name = "repeat_rule") var repeatRule: Int = 0, @ColumnInfo(name = "repeat_rule") var repeatRule: Int = 0,
@ColumnInfo(name = "repeat_limit") var repeatLimit: Int = 0, @ColumnInfo(name = "repeat_limit") var repeatLimit: Long = 0L,
@ColumnInfo(name = "import_id") var importId: String = "", @ColumnInfo(name = "import_id") var importId: String = "",
@ColumnInfo(name = "flags") var flags: Int = 0, @ColumnInfo(name = "flags") var flags: Int = 0,
@ColumnInfo(name = "event_type") var eventType: Long = REGULAR_EVENT_TYPE_ID, @ColumnInfo(name = "event_type") var eventType: Long = REGULAR_EVENT_TYPE_ID,
@ -118,7 +118,7 @@ data class Event(
fun getReminders() = setOf(reminder1Minutes, reminder2Minutes, reminder3Minutes).filter { it != REMINDER_OFF } fun getReminders() = setOf(reminder1Minutes, reminder2Minutes, reminder3Minutes).filter { it != REMINDER_OFF }
// properly return the start time of all-day events as midnight // properly return the start time of all-day events as midnight
fun getEventStartTS(): Int { fun getEventStartTS(): Long {
return if (getIsAllDay()) { return if (getIsAllDay()) {
Formatter.getDateTimeFromTS(startTS).withTime(0, 0, 0, 0).seconds() Formatter.getDateTimeFromTS(startTS).withTime(0, 0, 0, 0).seconds()
} else { } else {
@ -139,7 +139,7 @@ data class Event(
fun getEventRepetition() = EventRepetition(null, id!!, repeatInterval, repeatRule, repeatLimit) fun getEventRepetition() = EventRepetition(null, id!!, repeatInterval, repeatRule, repeatLimit)
// check if its the proper week, for events repeating every x weeks // check if its the proper week, for events repeating every x weeks
fun isOnProperWeek(startTimes: LongSparseArray<Int>): Boolean { fun isOnProperWeek(startTimes: LongSparseArray<Long>): Boolean {
val initialWeekOfYear = Formatter.getDateTimeFromTS(startTimes[id!!]!!).weekOfWeekyear val initialWeekOfYear = Formatter.getDateTimeFromTS(startTimes[id!!]!!).weekOfWeekyear
val currentWeekOfYear = Formatter.getDateTimeFromTS(startTS).weekOfWeekyear val currentWeekOfYear = Formatter.getDateTimeFromTS(startTS).weekOfWeekyear
return (currentWeekOfYear - initialWeekOfYear) % (repeatInterval / WEEK) == 0 return (currentWeekOfYear - initialWeekOfYear) % (repeatInterval / WEEK) == 0

View File

@ -11,4 +11,4 @@ data class EventRepetition(
@ColumnInfo(name = "event_id") val eventId: Long, @ColumnInfo(name = "event_id") val eventId: Long,
@ColumnInfo(name = "repeat_interval") val repeatInterval: Int, @ColumnInfo(name = "repeat_interval") val repeatInterval: Int,
@ColumnInfo(name = "repeat_rule") val repeatRule: Int, @ColumnInfo(name = "repeat_rule") val repeatRule: Int,
@ColumnInfo(name = "repeat_limit") val repeatLimit: Int) @ColumnInfo(name = "repeat_limit") val repeatLimit: Long)

View File

@ -1,4 +1,4 @@
package com.simplemobiletools.calendar.pro.models package com.simplemobiletools.calendar.pro.models
data class ListEvent(var id: Long, var startTS: Int, var endTS: Int, var title: String, var description: String, var isAllDay: Boolean, var color: Int, data class ListEvent(var id: Long, var startTS: Long, var endTS: Long, var title: String, var description: String, var isAllDay: Boolean, var color: Int,
var location: String, var isPastEvent: Boolean, var isRepeatable: Boolean) : ListItem() var location: String, var isPastEvent: Boolean, var isRepeatable: Boolean) : ListItem()

View File

@ -1,4 +1,4 @@
package com.simplemobiletools.calendar.pro.models package com.simplemobiletools.calendar.pro.models
data class MonthViewEvent(val id: Long, val title: String, val startTS: Int, val color: Int, val startDayIndex: Int, val daysCnt: Int, val originalStartDayIndex: Int, data class MonthViewEvent(val id: Long, val title: String, val startTS: Long, val color: Int, val startDayIndex: Int, val daysCnt: Int, val originalStartDayIndex: Int,
val isAllDay: Boolean, val isPastEvent: Boolean) val isAllDay: Boolean, val isPastEvent: Boolean)