fix "Delete all events" for cases when there is a huge amount of events

This commit is contained in:
tibbi 2018-12-03 12:09:33 +01:00
parent 365c400505
commit bf8283985f
3 changed files with 31 additions and 12 deletions

View File

@ -0,0 +1,16 @@
package com.simplemobiletools.calendar.pro.extensions
import com.simplemobiletools.calendar.pro.helpers.CHOPPED_LIST_DEFAULT_SIZE
// inspired by https://stackoverflow.com/questions/2895342/java-how-can-i-split-an-arraylist-in-multiple-small-arraylists/2895365#2895365
fun MutableList<Long>.getChoppedList(chunkSize: Int = CHOPPED_LIST_DEFAULT_SIZE): ArrayList<ArrayList<Long>> {
val parts = ArrayList<ArrayList<Long>>()
val listSize = this.size
var i = 0
while (i < listSize) {
val newList = subList(i, Math.min(listSize, i + chunkSize)).toMutableList() as ArrayList<Long>
parts.add(newList)
i += chunkSize
}
return parts
}

View File

@ -16,6 +16,7 @@ const val WEEK_START_DATE_TIME = "week_start_date_time"
const val CALDAV = "Caldav"
const val VIEW_TO_OPEN = "view_to_open"
const val REGULAR_EVENT_TYPE_ID = 1L
const val CHOPPED_LIST_DEFAULT_SIZE = 100
const val MONTHLY_VIEW = 1
const val YEARLY_VIEW = 2

View File

@ -132,21 +132,23 @@ class EventsHelper(val context: Context) {
return
}
val eventsWithImportId = eventsDB.getEventsByIdsWithImportIds(ids)
eventsDB.deleteEvents(ids)
ids.getChoppedList().forEach {
val eventsWithImportId = eventsDB.getEventsByIdsWithImportIds(it)
eventsDB.deleteEvents(it)
ids.forEach {
context.cancelNotification(it)
}
if (deleteFromCalDAV && config.caldavSync) {
eventsWithImportId.forEach {
context.calDAVHelper.deleteCalDAVEvent(it)
it.forEach {
context.cancelNotification(it)
}
}
deleteChildEvents(ids, deleteFromCalDAV)
context.updateWidgets()
if (deleteFromCalDAV && config.caldavSync) {
eventsWithImportId.forEach {
context.calDAVHelper.deleteCalDAVEvent(it)
}
}
deleteChildEvents(it, deleteFromCalDAV)
context.updateWidgets()
}
}
private fun deleteChildEvents(ids: MutableList<Long>, deleteFromCalDAV: Boolean) {