Skip to content

Commit f4c02d4

Browse files
authored
[DI] Use @Inject lateinit var for abstract classes (#929)
* Use @Inject lateinit var for abstract classes (subclasses have @Inject constructor) * Fix tests
1 parent fafa358 commit f4c02d4

File tree

13 files changed

+98
-149
lines changed

13 files changed

+98
-149
lines changed

app/src/androidTest/kotlin/at/bitfire/davdroid/sync/SyncManagerTest.kt

+24-31
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ import at.bitfire.davdroid.db.Credentials
2525
import at.bitfire.davdroid.db.SyncState
2626
import at.bitfire.davdroid.network.HttpClient
2727
import at.bitfire.davdroid.settings.AccountSettings
28-
import at.bitfire.davdroid.ui.NotificationRegistry
2928
import dagger.hilt.android.qualifiers.ApplicationContext
3029
import dagger.hilt.android.testing.HiltAndroidRule
3130
import dagger.hilt.android.testing.HiltAndroidTest
@@ -63,7 +62,7 @@ class SyncManagerTest {
6362
lateinit var db: AppDatabase
6463

6564
@Inject
66-
lateinit var notificationRegistry: NotificationRegistry
65+
lateinit var syncManagerFactory: TestSyncManager.Factory
6766

6867
@Inject
6968
lateinit var workerFactory: HiltWorkerFactory
@@ -73,7 +72,7 @@ class SyncManagerTest {
7372
private val server = MockWebServer()
7473

7574
@Before
76-
fun inject() {
75+
fun setup() {
7776
hiltRule.inject()
7877

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

8685
// create account
8786
assertTrue(accountManager.addAccountExplicitly(account, "test", AccountSettings.initialUserData(Credentials("test", "test"))))
87+
88+
server.start()
8889
}
8990

9091
@After
@@ -93,35 +94,7 @@ class SyncManagerTest {
9394

9495
// clear annoying syncError notifications
9596
NotificationManagerCompat.from(context).cancelAll()
96-
}
97-
98-
99-
private fun syncManager(
100-
localCollection: LocalTestCollection,
101-
syncResult: SyncResult = SyncResult(),
102-
collection: Collection = mockk<Collection>() {
103-
every { url } returns server.url("/")
104-
}
105-
) =
106-
TestSyncManager(
107-
account,
108-
accountSettingsFactory.forAccount(account),
109-
arrayOf(),
110-
"TestAuthority",
111-
HttpClient.Builder(context).build(),
112-
syncResult,
113-
localCollection,
114-
collection,
115-
context, db, notificationRegistry
116-
)
117-
118-
@Before
119-
fun startServer() {
120-
server.start()
121-
}
12297

123-
@After
124-
fun stopServer() {
12598
server.close()
12699
}
127100

@@ -533,4 +506,24 @@ class SyncManagerTest {
533506
assertTrue(collection.entries.isEmpty())
534507
}
535508

509+
510+
// helpers
511+
512+
private fun syncManager(
513+
localCollection: LocalTestCollection,
514+
syncResult: SyncResult = SyncResult(),
515+
collection: Collection = mockk<Collection>() {
516+
every { url } returns server.url("/")
517+
}
518+
) = syncManagerFactory.create(
519+
account,
520+
accountSettingsFactory.forAccount(account),
521+
arrayOf(),
522+
"TestAuthority",
523+
HttpClient.Builder(context).build(),
524+
syncResult,
525+
localCollection,
526+
collection
527+
)
528+
536529
}

app/src/androidTest/kotlin/at/bitfire/davdroid/sync/SyncerTest.kt

+6-7
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import org.junit.Rule
2121
import org.junit.Test
2222
import java.util.concurrent.atomic.AtomicInteger
2323
import javax.inject.Inject
24+
import javax.inject.Provider
2425

2526
@HiltAndroidTest
2627
class SyncerTest {
@@ -38,6 +39,9 @@ class SyncerTest {
3839
@Inject
3940
lateinit var db: AppDatabase
4041

42+
@Inject
43+
lateinit var testSyncer: Provider<TestSyncer>
44+
4145
/** use our WebDAV provider as a mock provider because it's our own and we don't need any permissions for it */
4246
private val mockAuthority by lazy { context.getString(R.string.webdav_authority) }
4347

@@ -51,7 +55,7 @@ class SyncerTest {
5155

5256
@Test
5357
fun testOnPerformSync_runsSyncAndSetsClassLoader() {
54-
val syncer = TestSyncer(accountSettingsFactory, context, db)
58+
val syncer = testSyncer.get()
5559
syncer.onPerformSync(account, arrayOf(), mockAuthority, SyncResult())
5660

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

6468

65-
class TestSyncer(
66-
accountSettingsFactory: AccountSettings.Factory,
67-
context: Context,
68-
db: AppDatabase
69-
) : Syncer(accountSettingsFactory, context, db) {
69+
class TestSyncer @Inject constructor() : Syncer() {
7070

7171
val syncCalled = AtomicInteger()
7272

@@ -78,7 +78,6 @@ class SyncerTest {
7878
provider: ContentProviderClient,
7979
syncResult: SyncResult
8080
) {
81-
Thread.sleep(1000)
8281
syncCalled.incrementAndGet()
8382
}
8483

app/src/androidTest/kotlin/at/bitfire/davdroid/sync/TestSyncManager.kt

+27-19
Original file line numberDiff line numberDiff line change
@@ -5,37 +5,34 @@
55
package at.bitfire.davdroid.sync
66

77
import android.accounts.Account
8-
import android.content.Context
98
import android.content.SyncResult
109
import at.bitfire.dav4jvm.DavCollection
1110
import at.bitfire.dav4jvm.MultiResponseCallback
1211
import at.bitfire.dav4jvm.Response
1312
import at.bitfire.dav4jvm.property.caldav.GetCTag
14-
import at.bitfire.davdroid.db.AppDatabase
1513
import at.bitfire.davdroid.db.Collection
1614
import at.bitfire.davdroid.db.SyncState
1715
import at.bitfire.davdroid.network.HttpClient
1816
import at.bitfire.davdroid.resource.LocalResource
1917
import at.bitfire.davdroid.settings.AccountSettings
20-
import at.bitfire.davdroid.ui.NotificationRegistry
2118
import at.bitfire.davdroid.util.lastSegment
19+
import dagger.assisted.Assisted
20+
import dagger.assisted.AssistedFactory
21+
import dagger.assisted.AssistedInject
2222
import okhttp3.HttpUrl
2323
import okhttp3.RequestBody
2424
import okhttp3.RequestBody.Companion.toRequestBody
2525
import org.junit.Assert.assertEquals
2626

27-
class TestSyncManager(
28-
account: Account,
29-
accountSettings: AccountSettings,
30-
extras: Array<String>,
31-
authority: String,
32-
httpClient: HttpClient,
33-
syncResult: SyncResult,
34-
localCollection: LocalTestCollection,
35-
collection: Collection,
36-
context: Context,
37-
db: AppDatabase,
38-
notificationRegistry: NotificationRegistry
27+
class TestSyncManager @AssistedInject constructor(
28+
@Assisted account: Account,
29+
@Assisted accountSettings: AccountSettings,
30+
@Assisted extras: Array<String>,
31+
@Assisted authority: String,
32+
@Assisted httpClient: HttpClient,
33+
@Assisted syncResult: SyncResult,
34+
@Assisted localCollection: LocalTestCollection,
35+
@Assisted collection: Collection
3936
): SyncManager<LocalTestResource, LocalTestCollection, DavCollection>(
4037
account,
4138
accountSettings,
@@ -44,12 +41,23 @@ class TestSyncManager(
4441
authority,
4542
syncResult,
4643
localCollection,
47-
collection,
48-
context,
49-
db,
50-
notificationRegistry
44+
collection
5145
) {
5246

47+
@AssistedFactory
48+
interface Factory {
49+
fun create(
50+
account: Account,
51+
accountSettings: AccountSettings,
52+
extras: Array<String>,
53+
authority: String,
54+
httpClient: HttpClient,
55+
syncResult: SyncResult,
56+
localCollection: LocalTestCollection,
57+
collection: Collection
58+
): TestSyncManager
59+
}
60+
5361
override fun prepare(): Boolean {
5462
davCollection = DavCollection(httpClient.okHttpClient, collection.url)
5563
return true

app/src/main/kotlin/at/bitfire/davdroid/sync/AddressBookSyncer.kt

+1-8
Original file line numberDiff line numberDiff line change
@@ -7,22 +7,18 @@ package at.bitfire.davdroid.sync
77
import android.Manifest
88
import android.accounts.Account
99
import android.content.ContentProviderClient
10-
import android.content.Context
1110
import android.content.SyncResult
1211
import android.content.pm.PackageManager
1312
import android.provider.ContactsContract
1413
import androidx.core.content.ContextCompat
15-
import at.bitfire.davdroid.db.AppDatabase
1614
import at.bitfire.davdroid.db.Collection
1715
import at.bitfire.davdroid.db.Service
1816
import at.bitfire.davdroid.log.Logger
1917
import at.bitfire.davdroid.network.HttpClient
2018
import at.bitfire.davdroid.resource.LocalAddressBook
21-
import at.bitfire.davdroid.settings.AccountSettings
2219
import at.bitfire.davdroid.settings.Settings
2320
import at.bitfire.davdroid.settings.SettingsManager
2421
import at.bitfire.davdroid.util.setAndVerifyUserData
25-
import dagger.hilt.android.qualifiers.ApplicationContext
2622
import okhttp3.HttpUrl
2723
import okhttp3.HttpUrl.Companion.toHttpUrl
2824
import java.util.logging.Level
@@ -32,12 +28,9 @@ import javax.inject.Inject
3228
* Sync logic for address books
3329
*/
3430
class AddressBookSyncer @Inject constructor(
35-
accountSettingsFactory: AccountSettings.Factory,
36-
@ApplicationContext context: Context,
37-
db: AppDatabase,
3831
private val contactsSyncManagerFactory: ContactsSyncManager.Factory,
3932
private val settingsManager: SettingsManager
40-
) : Syncer(accountSettingsFactory, context, db) {
33+
) : Syncer() {
4134

4235
companion object {
4336
const val PREVIOUS_GROUP_METHOD = "previous_group_method"

app/src/main/kotlin/at/bitfire/davdroid/sync/CalendarSyncManager.kt

+2-13
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
package at.bitfire.davdroid.sync
66

77
import android.accounts.Account
8-
import android.content.Context
98
import android.content.SyncResult
109
import android.text.format.Formatter
1110
import at.bitfire.dav4jvm.DavCalendar
@@ -20,7 +19,6 @@ import at.bitfire.dav4jvm.property.webdav.GetETag
2019
import at.bitfire.dav4jvm.property.webdav.SupportedReportSet
2120
import at.bitfire.dav4jvm.property.webdav.SyncToken
2221
import at.bitfire.davdroid.R
23-
import at.bitfire.davdroid.db.AppDatabase
2422
import at.bitfire.davdroid.db.Collection
2523
import at.bitfire.davdroid.db.SyncState
2624
import at.bitfire.davdroid.log.Logger
@@ -29,7 +27,6 @@ import at.bitfire.davdroid.resource.LocalCalendar
2927
import at.bitfire.davdroid.resource.LocalEvent
3028
import at.bitfire.davdroid.resource.LocalResource
3129
import at.bitfire.davdroid.settings.AccountSettings
32-
import at.bitfire.davdroid.ui.NotificationRegistry
3330
import at.bitfire.davdroid.util.lastSegment
3431
import at.bitfire.ical4android.Event
3532
import at.bitfire.ical4android.InvalidCalendarException
@@ -38,12 +35,10 @@ import at.bitfire.ical4android.util.DateUtils
3835
import dagger.assisted.Assisted
3936
import dagger.assisted.AssistedFactory
4037
import dagger.assisted.AssistedInject
41-
import dagger.hilt.android.qualifiers.ApplicationContext
4238
import net.fortuna.ical4j.model.Component
4339
import net.fortuna.ical4j.model.component.VAlarm
4440
import net.fortuna.ical4j.model.property.Action
4541
import okhttp3.HttpUrl
46-
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
4742
import okhttp3.RequestBody
4843
import okhttp3.RequestBody.Companion.toRequestBody
4944
import java.io.ByteArrayOutputStream
@@ -65,10 +60,7 @@ class CalendarSyncManager @AssistedInject constructor(
6560
@Assisted authority: String,
6661
@Assisted syncResult: SyncResult,
6762
@Assisted localCalendar: LocalCalendar,
68-
@Assisted collection: Collection,
69-
@ApplicationContext context: Context,
70-
db: AppDatabase,
71-
notificationRegistry: NotificationRegistry
63+
@Assisted collection: Collection
7264
): SyncManager<LocalEvent, LocalCalendar, DavCalendar>(
7365
account,
7466
accountSettings,
@@ -77,10 +69,7 @@ class CalendarSyncManager @AssistedInject constructor(
7769
authority,
7870
syncResult,
7971
localCalendar,
80-
collection,
81-
context,
82-
db,
83-
notificationRegistry
72+
collection
8473
) {
8574

8675
@AssistedFactory

app/src/main/kotlin/at/bitfire/davdroid/sync/CalendarSyncer.kt

+1-8
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,14 @@ package at.bitfire.davdroid.sync
66

77
import android.accounts.Account
88
import android.content.ContentProviderClient
9-
import android.content.Context
109
import android.content.SyncResult
1110
import android.provider.CalendarContract
12-
import at.bitfire.davdroid.db.AppDatabase
1311
import at.bitfire.davdroid.db.Collection
1412
import at.bitfire.davdroid.db.Service
1513
import at.bitfire.davdroid.log.Logger
1614
import at.bitfire.davdroid.network.HttpClient
1715
import at.bitfire.davdroid.resource.LocalCalendar
18-
import at.bitfire.davdroid.settings.AccountSettings
1916
import at.bitfire.ical4android.AndroidCalendar
20-
import dagger.hilt.android.qualifiers.ApplicationContext
2117
import okhttp3.HttpUrl
2218
import okhttp3.HttpUrl.Companion.toHttpUrl
2319
import java.util.logging.Level
@@ -27,11 +23,8 @@ import javax.inject.Inject
2723
* Sync logic for calendars
2824
*/
2925
class CalendarSyncer @Inject constructor(
30-
accountSettingsFactory: AccountSettings.Factory,
31-
@ApplicationContext context: Context,
32-
db: AppDatabase,
3326
private val calendarSyncManagerFactory: CalendarSyncManager.Factory
34-
): Syncer(accountSettingsFactory, context, db) {
27+
): Syncer() {
3528

3629
override fun sync(
3730
account: Account,

0 commit comments

Comments
 (0)