Don't allow subclassing of AndroidCalendar anymore; remove AndroidCalendarFactory (#23)

This commit is contained in:
Ricki Hirner authored and GitHub committed 2025-06-27 17:35:49 +02:00
1 parent dd6e3a2fb3
commit 1a613d5d3c
7 files changed
+26 -66

No files matched your search

@@ -79,7 +79,7 @@ class AndroidCalendarTest {
assertNotNull(uri)
// query calendar
val calendar = AndroidCalendar.findByID(testAccount, provider, TestCalendar.Factory, ContentUris.parseId(uri))
val calendar = AndroidCalendar.findByID(testAccount, provider, ContentUris.parseId(uri))
assertNotNull(calendar)
// delete calendar
@@ -101,7 +101,7 @@ class AndroidEventTest {
private val tzDefault = DateUtils.ical4jTimeZone(tzIdDefault)
private lateinit var calendarUri: Uri
private lateinit var calendar: TestCalendar
private lateinit var calendar: AndroidCalendar
@Before
fun prepare() {
@@ -1439,7 +1439,7 @@ class AndroidEventTest {
private fun populateAndroidEvent(
automaticDates: Boolean,
destinationCalendar: TestCalendar = calendar,
destinationCalendar: AndroidCalendar = calendar,
asSyncAdapter: Boolean = false,
insertCallback: (id: Long) -> Unit = {},
extendedProperties: Map<String, String> = emptyMap(),
@@ -1481,7 +1481,7 @@ class AndroidEventTest {
private fun populateEvent(
automaticDates: Boolean,
destinationCalendar: TestCalendar = calendar,
destinationCalendar: AndroidCalendar = calendar,
asSyncAdapter: Boolean = false,
insertCallback: (id: Long) -> Unit = {},
extendedProperties: Map<String, String> = emptyMap(),
@@ -1943,7 +1943,7 @@ class AndroidEventTest {
}
private fun populateReminder(destinationCalendar: TestCalendar = calendar, builder: ContentValues.() -> Unit): VAlarm? {
private fun populateReminder(destinationCalendar: AndroidCalendar = calendar, builder: ContentValues.() -> Unit): VAlarm? {
populateEvent(true, destinationCalendar = destinationCalendar, insertCallback = { id ->
val reminderValues = ContentValues()
reminderValues.put(Reminders.EVENT_ID, id)
@@ -12,34 +12,21 @@ import android.content.ContentUris
import android.content.ContentValues
import android.provider.CalendarContract
import at.bitfire.ical4android.AndroidCalendar
import at.bitfire.ical4android.AndroidCalendarFactory
class TestCalendar(
account: Account,
providerClient: ContentProviderClient,
id: Long
) : AndroidCalendar(account, providerClient, id) {
object TestCalendar {
companion object {
fun findOrCreate(account: Account, provider: ContentProviderClient): TestCalendar {
val calendars = AndroidCalendar.find(account, provider, Factory, null, null)
return if (calendars.isEmpty()) {
val values = ContentValues(3)
values.put(CalendarContract.Calendars.NAME, "TestCalendar")
values.put(CalendarContract.Calendars.CALENDAR_DISPLAY_NAME, "ical4android Test Calendar")
values.put(CalendarContract.Calendars.ALLOWED_REMINDERS, CalendarContract.Reminders.METHOD_DEFAULT)
val uri = AndroidCalendar.create(account, provider, values)
fun findOrCreate(account: Account, provider: ContentProviderClient): AndroidCalendar {
val calendars = AndroidCalendar.find(account, provider, null, null)
return if (calendars.isEmpty()) {
val values = ContentValues(3)
values.put(CalendarContract.Calendars.NAME, "TestCalendar")
values.put(CalendarContract.Calendars.CALENDAR_DISPLAY_NAME, "ical4android Test Calendar")
values.put(CalendarContract.Calendars.ALLOWED_REMINDERS, CalendarContract.Reminders.METHOD_DEFAULT)
val uri = AndroidCalendar.create(account, provider, values)
TestCalendar(account, provider, ContentUris.parseId(uri))
} else
calendars.first()
}
AndroidCalendar(account, provider, ContentUris.parseId(uri))
} else
calendars.first()
}
object Factory: AndroidCalendarFactory<TestCalendar> {
override fun newInstance(account: Account, provider: ContentProviderClient, id: Long) =
TestCalendar(account, provider, id)
}
}
}
@@ -31,7 +31,7 @@ import java.util.logging.Logger
* Communicates with the Android Contacts Provider which uses an SQLite
* database to store the events.
*/
open class AndroidCalendar(
class AndroidCalendar(
val account: Account,
val provider: ContentProviderClient,
@@ -215,19 +215,18 @@ open class AndroidCalendar(
provider.delete(Colors.CONTENT_URI.asSyncAdapter(account), null, null)
}
fun <T : AndroidCalendar> findByID(
fun findByID(
account: Account,
provider: ContentProviderClient,
factory: AndroidCalendarFactory<T>,
id: Long
): T {
): AndroidCalendar {
val iterCalendars = CalendarEntity.newEntityIterator(
provider.query(ContentUris.withAppendedId(CalendarEntity.CONTENT_URI, id).asSyncAdapter(account), null, null, null, null)
)
try {
if (iterCalendars.hasNext()) {
val values = iterCalendars.next().entityValues
val calendar = factory.newInstance(account, provider, id)
val calendar = AndroidCalendar(account, provider, id)
calendar.populate(values)
return calendar
}
@@ -237,21 +236,20 @@ open class AndroidCalendar(
throw FileNotFoundException()
}
fun <T : AndroidCalendar> find(
fun find(
account: Account,
provider: ContentProviderClient,
factory: AndroidCalendarFactory<T>,
where: String?,
whereArgs: Array<String>?
): List<T> {
): List<AndroidCalendar> {
val iterCalendars = CalendarEntity.newEntityIterator(
provider.query(CalendarEntity.CONTENT_URI.asSyncAdapter(account), null, where, whereArgs, null)
)
try {
val calendars = LinkedList<T>()
val calendars = LinkedList<AndroidCalendar>()
while (iterCalendars.hasNext()) {
val values = iterCalendars.next().entityValues
val calendar = factory.newInstance(account, provider, values.getAsLong(Calendars._ID))
val calendar = AndroidCalendar(account, provider, values.getAsLong(Calendars._ID))
calendar.populate(values)
calendars += calendar
}
@@ -263,11 +261,4 @@ open class AndroidCalendar(
}
// default factory (will be removed as soon as AndroidCalendar is not open anymore)
object Factory : AndroidCalendarFactory<AndroidCalendar> {
override fun newInstance(account: Account, provider: ContentProviderClient, id: Long) =
AndroidCalendar(account, provider, id)
}
}
@@ -1,16 +0,0 @@
/*
* This file is part of bitfireAT/synctools which is released under GPLv3.
* Copyright © All Contributors. See the LICENSE and AUTHOR files in the root directory for details.
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package at.bitfire.ical4android
import android.accounts.Account
import android.content.ContentProviderClient
interface AndroidCalendarFactory<out T : AndroidCalendar> {
fun newInstance(account: Account, provider: ContentProviderClient, id: Long): T
}
@@ -173,7 +173,6 @@ class AndroidEvent(
// calculate some scheduling properties
val groupScheduled = e.subValues.any { it.uri == Attendees.CONTENT_URI }
val isOrganizer = (e.entityValues.getAsInteger(Events.IS_ORGANIZER) ?: 0) != 0
populateEvent(e.entityValues.removeBlankStrings(), groupScheduled)
@@ -110,7 +110,6 @@ class InitCalendarProviderRule private constructor() : ExternalResource() {
AndroidCalendar.Companion.findByID(
account,
provider,
AndroidCalendar.Factory,
ContentUris.parseId(uri)
)
} catch (e: Exception) {