Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Unverified Commit 4858dd92 authored by Ricki Hirner's avatar Ricki Hirner Committed by GitHub
Browse files

Move authority and ContentProvider creation to LocalDataStore (#1272)

* Move authority and content provider acquire() to LocalDataStore implementations

* Fix tests

* Update LocalCalendarStore.kt

Reroder LocalCalendarStore delete
parent b910ba25
Loading
Loading
Loading
Loading
+7 −3
Original line number Diff line number Diff line
@@ -165,9 +165,6 @@ class SyncerTest {
        override val dataStore: LocalTestStore =
            theDataStore

        override val authority: String
            get() = throw NotImplementedError()

        override val serviceType: String
            get() = throw NotImplementedError()

@@ -189,6 +186,13 @@ class SyncerTest {

    class LocalTestStore : LocalDataStore<LocalTestCollection> {

        override val authority: String
            get() = throw NotImplementedError()

        override fun acquireContentProvider(): ContentProviderClient? {
            throw NotImplementedError()
        }

        override fun create(
            provider: ContentProviderClient,
            fromCollection: Collection
+5 −3
Original line number Diff line number Diff line
@@ -34,6 +34,9 @@ class LocalAddressBookStore @Inject constructor(
    private val settings: SettingsManager
): LocalDataStore<LocalAddressBook> {

    override val authority: String
        get() = ContactsContract.AUTHORITY

    /** whether a (usually managed) setting wants all address-books to be read-only **/
    val forceAllReadOnly: Boolean
        get() = settings.getBoolean(Settings.FORCE_READ_ONLY_ADDRESSBOOKS)
@@ -67,6 +70,8 @@ class LocalAddressBookStore @Inject constructor(
        return sb.toString()
    }

    override fun acquireContentProvider() =
        context.contentResolver.acquireContentProviderClient(authority)

    override fun create(provider: ContentProviderClient, fromCollection: Collection): LocalAddressBook? {
        val service = serviceRepository.get(fromCollection.serviceId) ?: throw IllegalArgumentException("Couldn't fetch DB service from collection")
@@ -106,7 +111,6 @@ class LocalAddressBookStore @Inject constructor(
        return addressBookAccount
    }


    override fun getAll(account: Account, provider: ContentProviderClient): List<LocalAddressBook> {
        val accountManager = AccountManager.get(context)
        return accountManager.getAccountsByType(context.getString(R.string.account_type_address_book))
@@ -119,7 +123,6 @@ class LocalAddressBookStore @Inject constructor(
            }
    }


    override fun update(provider: ContentProviderClient, localCollection: LocalAddressBook, fromCollection: Collection) {
        var currentAccount = localCollection.addressBookAccount
        logger.log(Level.INFO, "Updating local address book $currentAccount from collection $fromCollection")
@@ -171,7 +174,6 @@ class LocalAddressBookStore @Inject constructor(
            }
    }


    override fun delete(localCollection: LocalAddressBook) {
        val accountManager = AccountManager.get(context)
        accountManager.removeAccountExplicitly(localCollection.addressBookAccount)
+7 −4
Original line number Diff line number Diff line
@@ -34,6 +34,12 @@ class LocalCalendarStore @Inject constructor(
    private val serviceRepository: DavServiceRepository
): LocalDataStore<LocalCalendar> {

    override val authority: String
        get() = CalendarContract.AUTHORITY

    override fun acquireContentProvider() =
        context.contentResolver.acquireContentProviderClient(authority)

    override fun create(provider: ContentProviderClient, fromCollection: Collection): LocalCalendar? {
        val service = serviceRepository.get(fromCollection.serviceId) ?: throw IllegalArgumentException("Couldn't fetch DB service from collection")
        val account = Account(service.accountName, context.getString(R.string.account_type))
@@ -67,11 +73,9 @@ class LocalCalendarStore @Inject constructor(
        return AndroidCalendar.findByID(account, provider, LocalCalendar.Factory, ContentUris.parseId(uri))
    }


    override fun getAll(account: Account, provider: ContentProviderClient) =
        AndroidCalendar.find(account, provider, LocalCalendar.Factory, "${Calendars.SYNC_EVENTS}!=0", null)


    override fun update(provider: ContentProviderClient, localCollection: LocalCalendar, fromCollection: Collection) {
        val accountSettings = accountSettingsFactory.create(localCollection.account)
        val values = valuesFromCollectionInfo(fromCollection, withColor = accountSettings.getManageCalendarColors())
@@ -114,7 +118,6 @@ class LocalCalendarStore @Inject constructor(
        }
    }


    override fun delete(localCollection: LocalCalendar) {
        logger.log(Level.INFO, "Deleting local calendar", localCollection)
        localCollection.delete()
+17 −0
Original line number Diff line number Diff line
@@ -14,6 +14,23 @@ import at.bitfire.davdroid.db.Collection
 */
interface LocalDataStore<T: LocalCollection<*>> {

    /**
     * Content provider authority for the data store.
     */
    val authority: String

    /**
     * Acquires a content provider client for the data store. The result of this call
     * should be passed to all other methods of this class.
     *
     * **The caller is responsible for closing the content provider client!**
     *
     * @return the content provider client, or `null` if the content provider could not be acquired
     *
     * @throws SecurityException on missing permissions
     */
    fun acquireContentProvider(): ContentProviderClient?

    /**
     * Creates a new local collection from the given (remote) collection info.
     *
+10 −7
Original line number Diff line number Diff line
@@ -34,6 +34,12 @@ class LocalJtxCollectionStore @Inject constructor(

    private val serviceDao = db.serviceDao()

    override val authority: String
        get() = JtxContract.AUTHORITY

    override fun acquireContentProvider() =
        context.contentResolver.acquireContentProviderClient(JtxContract.AUTHORITY)

    override fun create(provider: ContentProviderClient, fromCollection: Collection): LocalJtxCollection? {
        val service = serviceDao.get(fromCollection.serviceId) ?: throw IllegalArgumentException("Couldn't fetch DB service from collection")
        val account = Account(service.accountName, context.getString(R.string.account_type))
@@ -82,22 +88,15 @@ class LocalJtxCollectionStore @Inject constructor(
        }
    }


    override fun getAll(account: Account, provider: ContentProviderClient): List<LocalJtxCollection> =
        JtxCollection.find(account, provider, context, LocalJtxCollection.Factory, null, null)


    override fun update(provider: ContentProviderClient, localCollection: LocalJtxCollection, fromCollection: Collection) {
        val accountSettings = accountSettingsFactory.create(localCollection.account)
        val values = valuesFromCollection(fromCollection, account = localCollection.account, withColor = accountSettings.getManageCalendarColors())
        localCollection.update(values)
    }


    override fun delete(localCollection: LocalJtxCollection) {
        localCollection.delete()
    }

    override fun updateAccount(oldAccount: Account, newAccount: Account) {
        TaskProvider.acquire(context, TaskProvider.ProviderName.JtxBoard)?.use { provider ->
            val values = contentValuesOf(JtxContract.JtxCollection.ACCOUNT_NAME to newAccount.name)
@@ -106,4 +105,8 @@ class LocalJtxCollectionStore @Inject constructor(
        }
    }

    override fun delete(localCollection: LocalJtxCollection) {
        localCollection.delete()
    }

}
 No newline at end of file
Loading