Skip to content

[DI] Use @Inject lateinit var for abstract classes #929

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jul 20, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ import at.bitfire.davdroid.db.Credentials
import at.bitfire.davdroid.db.SyncState
import at.bitfire.davdroid.network.HttpClient
import at.bitfire.davdroid.settings.AccountSettings
import at.bitfire.davdroid.ui.NotificationRegistry
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.android.testing.HiltAndroidRule
import dagger.hilt.android.testing.HiltAndroidTest
Expand Down Expand Up @@ -63,7 +62,7 @@ class SyncManagerTest {
lateinit var db: AppDatabase

@Inject
lateinit var notificationRegistry: NotificationRegistry
lateinit var syncManagerFactory: TestSyncManager.Factory

@Inject
lateinit var workerFactory: HiltWorkerFactory
Expand All @@ -73,7 +72,7 @@ class SyncManagerTest {
private val server = MockWebServer()

@Before
fun inject() {
fun setup() {
hiltRule.inject()

// Initialize WorkManager for instrumentation tests.
Expand All @@ -85,6 +84,8 @@ class SyncManagerTest {

// create account
assertTrue(accountManager.addAccountExplicitly(account, "test", AccountSettings.initialUserData(Credentials("test", "test"))))

server.start()
}

@After
Expand All @@ -93,35 +94,7 @@ class SyncManagerTest {

// clear annoying syncError notifications
NotificationManagerCompat.from(context).cancelAll()
}


private fun syncManager(
localCollection: LocalTestCollection,
syncResult: SyncResult = SyncResult(),
collection: Collection = mockk<Collection>() {
every { url } returns server.url("/")
}
) =
TestSyncManager(
account,
accountSettingsFactory.forAccount(account),
arrayOf(),
"TestAuthority",
HttpClient.Builder(context).build(),
syncResult,
localCollection,
collection,
context, db, notificationRegistry
)

@Before
fun startServer() {
server.start()
}

@After
fun stopServer() {
server.close()
}

Expand Down Expand Up @@ -533,4 +506,24 @@ class SyncManagerTest {
assertTrue(collection.entries.isEmpty())
}


// helpers

private fun syncManager(
localCollection: LocalTestCollection,
syncResult: SyncResult = SyncResult(),
collection: Collection = mockk<Collection>() {
every { url } returns server.url("/")
}
) = syncManagerFactory.create(
account,
accountSettingsFactory.forAccount(account),
arrayOf(),
"TestAuthority",
HttpClient.Builder(context).build(),
syncResult,
localCollection,
collection
)

}
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import org.junit.Rule
import org.junit.Test
import java.util.concurrent.atomic.AtomicInteger
import javax.inject.Inject
import javax.inject.Provider

@HiltAndroidTest
class SyncerTest {
Expand All @@ -38,6 +39,9 @@ class SyncerTest {
@Inject
lateinit var db: AppDatabase

@Inject
lateinit var testSyncer: Provider<TestSyncer>

/** use our WebDAV provider as a mock provider because it's our own and we don't need any permissions for it */
private val mockAuthority by lazy { context.getString(R.string.webdav_authority) }

Expand All @@ -51,7 +55,7 @@ class SyncerTest {

@Test
fun testOnPerformSync_runsSyncAndSetsClassLoader() {
val syncer = TestSyncer(accountSettingsFactory, context, db)
val syncer = testSyncer.get()
syncer.onPerformSync(account, arrayOf(), mockAuthority, SyncResult())

// check whether onPerformSync() actually calls sync()
Expand All @@ -62,11 +66,7 @@ class SyncerTest {
}


class TestSyncer(
accountSettingsFactory: AccountSettings.Factory,
context: Context,
db: AppDatabase
) : Syncer(accountSettingsFactory, context, db) {
class TestSyncer @Inject constructor() : Syncer() {

val syncCalled = AtomicInteger()

Expand All @@ -78,7 +78,6 @@ class SyncerTest {
provider: ContentProviderClient,
syncResult: SyncResult
) {
Thread.sleep(1000)
syncCalled.incrementAndGet()
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,37 +5,34 @@
package at.bitfire.davdroid.sync

import android.accounts.Account
import android.content.Context
import android.content.SyncResult
import at.bitfire.dav4jvm.DavCollection
import at.bitfire.dav4jvm.MultiResponseCallback
import at.bitfire.dav4jvm.Response
import at.bitfire.dav4jvm.property.caldav.GetCTag
import at.bitfire.davdroid.db.AppDatabase
import at.bitfire.davdroid.db.Collection
import at.bitfire.davdroid.db.SyncState
import at.bitfire.davdroid.network.HttpClient
import at.bitfire.davdroid.resource.LocalResource
import at.bitfire.davdroid.settings.AccountSettings
import at.bitfire.davdroid.ui.NotificationRegistry
import at.bitfire.davdroid.util.lastSegment
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import okhttp3.HttpUrl
import okhttp3.RequestBody
import okhttp3.RequestBody.Companion.toRequestBody
import org.junit.Assert.assertEquals

class TestSyncManager(
account: Account,
accountSettings: AccountSettings,
extras: Array<String>,
authority: String,
httpClient: HttpClient,
syncResult: SyncResult,
localCollection: LocalTestCollection,
collection: Collection,
context: Context,
db: AppDatabase,
notificationRegistry: NotificationRegistry
class TestSyncManager @AssistedInject constructor(
@Assisted account: Account,
@Assisted accountSettings: AccountSettings,
@Assisted extras: Array<String>,
@Assisted authority: String,
@Assisted httpClient: HttpClient,
@Assisted syncResult: SyncResult,
@Assisted localCollection: LocalTestCollection,
@Assisted collection: Collection
): SyncManager<LocalTestResource, LocalTestCollection, DavCollection>(
account,
accountSettings,
Expand All @@ -44,12 +41,23 @@ class TestSyncManager(
authority,
syncResult,
localCollection,
collection,
context,
db,
notificationRegistry
collection
) {

@AssistedFactory
interface Factory {
fun create(
account: Account,
accountSettings: AccountSettings,
extras: Array<String>,
authority: String,
httpClient: HttpClient,
syncResult: SyncResult,
localCollection: LocalTestCollection,
collection: Collection
): TestSyncManager
}

override fun prepare(): Boolean {
davCollection = DavCollection(httpClient.okHttpClient, collection.url)
return true
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,22 +7,18 @@ package at.bitfire.davdroid.sync
import android.Manifest
import android.accounts.Account
import android.content.ContentProviderClient
import android.content.Context
import android.content.SyncResult
import android.content.pm.PackageManager
import android.provider.ContactsContract
import androidx.core.content.ContextCompat
import at.bitfire.davdroid.db.AppDatabase
import at.bitfire.davdroid.db.Collection
import at.bitfire.davdroid.db.Service
import at.bitfire.davdroid.log.Logger
import at.bitfire.davdroid.network.HttpClient
import at.bitfire.davdroid.resource.LocalAddressBook
import at.bitfire.davdroid.settings.AccountSettings
import at.bitfire.davdroid.settings.Settings
import at.bitfire.davdroid.settings.SettingsManager
import at.bitfire.davdroid.util.setAndVerifyUserData
import dagger.hilt.android.qualifiers.ApplicationContext
import okhttp3.HttpUrl
import okhttp3.HttpUrl.Companion.toHttpUrl
import java.util.logging.Level
Expand All @@ -32,12 +28,9 @@ import javax.inject.Inject
* Sync logic for address books
*/
class AddressBookSyncer @Inject constructor(
accountSettingsFactory: AccountSettings.Factory,
@ApplicationContext context: Context,
db: AppDatabase,
private val contactsSyncManagerFactory: ContactsSyncManager.Factory,
private val settingsManager: SettingsManager
) : Syncer(accountSettingsFactory, context, db) {
) : Syncer() {

companion object {
const val PREVIOUS_GROUP_METHOD = "previous_group_method"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
package at.bitfire.davdroid.sync

import android.accounts.Account
import android.content.Context
import android.content.SyncResult
import android.text.format.Formatter
import at.bitfire.dav4jvm.DavCalendar
Expand All @@ -20,7 +19,6 @@ import at.bitfire.dav4jvm.property.webdav.GetETag
import at.bitfire.dav4jvm.property.webdav.SupportedReportSet
import at.bitfire.dav4jvm.property.webdav.SyncToken
import at.bitfire.davdroid.R
import at.bitfire.davdroid.db.AppDatabase
import at.bitfire.davdroid.db.Collection
import at.bitfire.davdroid.db.SyncState
import at.bitfire.davdroid.log.Logger
Expand All @@ -29,7 +27,6 @@ import at.bitfire.davdroid.resource.LocalCalendar
import at.bitfire.davdroid.resource.LocalEvent
import at.bitfire.davdroid.resource.LocalResource
import at.bitfire.davdroid.settings.AccountSettings
import at.bitfire.davdroid.ui.NotificationRegistry
import at.bitfire.davdroid.util.lastSegment
import at.bitfire.ical4android.Event
import at.bitfire.ical4android.InvalidCalendarException
Expand All @@ -38,12 +35,10 @@ import at.bitfire.ical4android.util.DateUtils
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import dagger.hilt.android.qualifiers.ApplicationContext
import net.fortuna.ical4j.model.Component
import net.fortuna.ical4j.model.component.VAlarm
import net.fortuna.ical4j.model.property.Action
import okhttp3.HttpUrl
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.RequestBody
import okhttp3.RequestBody.Companion.toRequestBody
import java.io.ByteArrayOutputStream
Expand All @@ -65,10 +60,7 @@ class CalendarSyncManager @AssistedInject constructor(
@Assisted authority: String,
@Assisted syncResult: SyncResult,
@Assisted localCalendar: LocalCalendar,
@Assisted collection: Collection,
@ApplicationContext context: Context,
db: AppDatabase,
notificationRegistry: NotificationRegistry
@Assisted collection: Collection
): SyncManager<LocalEvent, LocalCalendar, DavCalendar>(
account,
accountSettings,
Expand All @@ -77,10 +69,7 @@ class CalendarSyncManager @AssistedInject constructor(
authority,
syncResult,
localCalendar,
collection,
context,
db,
notificationRegistry
collection
) {

@AssistedFactory
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,14 @@ package at.bitfire.davdroid.sync

import android.accounts.Account
import android.content.ContentProviderClient
import android.content.Context
import android.content.SyncResult
import android.provider.CalendarContract
import at.bitfire.davdroid.db.AppDatabase
import at.bitfire.davdroid.db.Collection
import at.bitfire.davdroid.db.Service
import at.bitfire.davdroid.log.Logger
import at.bitfire.davdroid.network.HttpClient
import at.bitfire.davdroid.resource.LocalCalendar
import at.bitfire.davdroid.settings.AccountSettings
import at.bitfire.ical4android.AndroidCalendar
import dagger.hilt.android.qualifiers.ApplicationContext
import okhttp3.HttpUrl
import okhttp3.HttpUrl.Companion.toHttpUrl
import java.util.logging.Level
Expand All @@ -27,11 +23,8 @@ import javax.inject.Inject
* Sync logic for calendars
*/
class CalendarSyncer @Inject constructor(
accountSettingsFactory: AccountSettings.Factory,
@ApplicationContext context: Context,
db: AppDatabase,
private val calendarSyncManagerFactory: CalendarSyncManager.Factory
): Syncer(accountSettingsFactory, context, db) {
): Syncer() {

override fun sync(
account: Account,
Expand Down
Loading
Loading