Skip to content

Commit 3354cd1

Browse files
authored
Merge pull request #4312 from vector-im/feature/fga/hilt_app_migration
Migrate App DI framework to Hilt
2 parents 79d5631 + e1f4e4f commit 3354cd1

File tree

261 files changed

+1864
-2864
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

261 files changed

+1864
-2864
lines changed

build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ buildscript {
1717
// https://developer.android.com/studio/releases/gradle-plugin
1818
classpath libs.gradle.gradlePlugin
1919
classpath libs.gradle.kotlinPlugin
20+
classpath libs.gradle.hiltPlugin
2021
classpath 'com.google.gms:google-services:4.3.10'
2122
classpath 'org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:3.3'
2223
classpath 'com.google.android.gms:oss-licenses-plugin:0.10.4'

changelog.d/3888.misc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Migrate app DI framework to Hilt

dependencies.gradle

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,9 @@ def androidxTest = "1.4.0"
3434
ext.libs = [
3535
gradle : [
3636
'gradlePlugin' : "com.android.tools.build:gradle:$gradle",
37-
'kotlinPlugin' : "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin"
37+
'kotlinPlugin' : "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin",
38+
'hiltPlugin' : "com.google.dagger:hilt-android-gradle-plugin:$dagger"
39+
3840
],
3941
jetbrains : [
4042
'coroutinesCore' : "org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlinCoroutines",
@@ -72,7 +74,9 @@ ext.libs = [
7274
],
7375
dagger : [
7476
'dagger' : "com.google.dagger:dagger:$dagger",
75-
'daggerCompiler' : "com.google.dagger:dagger-compiler:$dagger"
77+
'daggerCompiler' : "com.google.dagger:dagger-compiler:$dagger",
78+
'hilt' : "com.google.dagger:hilt-android:$dagger",
79+
'hiltCompiler' : "com.google.dagger:hilt-compiler:$dagger"
7680
],
7781
squareup : [
7882
'moshi' : "com.squareup.moshi:moshi-adapters:$moshi",

docs/hilt_migration.md

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
Useful links:
2+
- https://dagger.dev/hilt/migration-guide
3+
- https://dagger.dev/hilt/quick-start
4+
5+
Hilt is built on top of Dagger 2 and simplify usage by removing needs to create components manually.
6+
7+
When you create a new feature, you should have the following:
8+
9+
Annotate your Activity with @AndroidEntryPoint
10+
If you have a BottomSheetFragment => Annotate it with @AndroidEntryPoint
11+
Otherwise => Add your Fragment to the FragmentModule
12+
Add your ViewModel.Factory to the MavericksViewModelModule
13+
Makes sure your ViewModel as the following code:
14+
15+
```
16+
@AssistedFactory
17+
interface Factory: MavericksAssistedViewModelFactory<MyViewModel, MyViewState> {
18+
override fun create(initialState: MyViewState): MyViewModel
19+
}
20+
21+
companion object : MavericksViewModelFactory<MyViewModel, MyViewState> by hiltMavericksViewModelFactory()
22+
```
23+
24+
## Some remarks
25+
26+
@MavericksViewModelScope dependencies can't be injected inside Fragments/Activities
27+
You can only inject @Singleton, @MavericksViewModelScope or unscoped dependencies inside Maverick ViewModels
28+
You can access some specific dependencies from Singleton component by using
29+
```
30+
context.singletonEntryPoint()
31+
```
32+
Be aware that only the app has been migrated to Hilt and not the SDK.
33+

vector/build.gradle

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ apply plugin: 'kotlin-android'
66
apply plugin: 'kotlin-parcelize'
77
apply plugin: 'kotlin-kapt'
88
apply plugin: 'placeholder-resolver'
9+
apply plugin: 'dagger.hilt.android.plugin'
910

1011
kapt {
1112
correctErrorTypes = true
@@ -456,8 +457,8 @@ dependencies {
456457
implementation 'nl.dionsegijn:konfetti:1.3.2'
457458
implementation 'com.github.jetradarmobile:android-snowfall:1.2.1'
458459
// DI
459-
implementation libs.dagger.dagger
460-
kapt libs.dagger.daggerCompiler
460+
implementation libs.dagger.hilt
461+
kapt libs.dagger.hiltCompiler
461462

462463
// gplay flavor only
463464
gplayImplementation('com.google.firebase:firebase-messaging:22.0.0') {

vector/src/debug/java/im/vector/app/features/debug/DebugMenuActivity.kt

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@ import android.os.Build
2424
import androidx.core.app.NotificationCompat
2525
import androidx.core.app.Person
2626
import androidx.core.content.getSystemService
27+
import dagger.hilt.android.AndroidEntryPoint
2728
import im.vector.app.R
2829
import im.vector.app.core.di.ActiveSessionHolder
29-
import im.vector.app.core.di.ScreenComponent
3030
import im.vector.app.core.extensions.registerStartForActivityResult
3131
import im.vector.app.core.platform.VectorBaseActivity
3232
import im.vector.app.core.utils.PERMISSIONS_FOR_TAKING_PHOTO
@@ -50,17 +50,14 @@ import org.matrix.android.sdk.internal.crypto.verification.qrcode.toQrCodeData
5050
import timber.log.Timber
5151
import javax.inject.Inject
5252

53+
@AndroidEntryPoint
5354
class DebugMenuActivity : VectorBaseActivity<ActivityDebugMenuBinding>() {
5455

5556
override fun getBinding() = ActivityDebugMenuBinding.inflate(layoutInflater)
5657

5758
@Inject
5859
lateinit var activeSessionHolder: ActiveSessionHolder
5960

60-
override fun injectWith(injector: ScreenComponent) {
61-
injector.inject(this)
62-
}
63-
6461
private lateinit var buffer: ByteArray
6562

6663
override fun initUiAndData() {

vector/src/fdroid/java/im/vector/app/fdroid/features/settings/troubleshoot/TestBackgroundRestrictions.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,15 @@ package im.vector.app.fdroid.features.settings.troubleshoot
1818
import android.content.Intent
1919
import android.net.ConnectivityManager
2020
import androidx.activity.result.ActivityResultLauncher
21-
import androidx.appcompat.app.AppCompatActivity
2221
import androidx.core.content.getSystemService
2322
import androidx.core.net.ConnectivityManagerCompat
23+
import androidx.fragment.app.FragmentActivity
2424
import im.vector.app.R
2525
import im.vector.app.core.resources.StringProvider
2626
import im.vector.app.features.settings.troubleshoot.TroubleshootTest
2727
import javax.inject.Inject
2828

29-
class TestBackgroundRestrictions @Inject constructor(private val context: AppCompatActivity,
29+
class TestBackgroundRestrictions @Inject constructor(private val context: FragmentActivity,
3030
private val stringProvider: StringProvider) :
3131
TroubleshootTest(R.string.settings_troubleshoot_test_bg_restricted_title) {
3232

vector/src/fdroid/java/im/vector/app/fdroid/features/settings/troubleshoot/TestBatteryOptimization.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ package im.vector.app.fdroid.features.settings.troubleshoot
1717

1818
import android.content.Intent
1919
import androidx.activity.result.ActivityResultLauncher
20-
import androidx.appcompat.app.AppCompatActivity
20+
import androidx.fragment.app.FragmentActivity
2121
import im.vector.app.R
2222
import im.vector.app.core.resources.StringProvider
2323
import im.vector.app.core.utils.isIgnoringBatteryOptimizations
@@ -26,7 +26,7 @@ import im.vector.app.features.settings.troubleshoot.TroubleshootTest
2626
import javax.inject.Inject
2727

2828
class TestBatteryOptimization @Inject constructor(
29-
private val context: AppCompatActivity,
29+
private val context: FragmentActivity,
3030
private val stringProvider: StringProvider
3131
) : TroubleshootTest(R.string.settings_troubleshoot_test_battery_title) {
3232

vector/src/fdroid/java/im/vector/app/fdroid/receiver/AlarmSyncBroadcastReceiver.kt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import android.content.Intent
2424
import android.os.Build
2525
import androidx.core.content.ContextCompat
2626
import androidx.core.content.getSystemService
27-
import im.vector.app.core.di.HasVectorInjector
27+
import im.vector.app.core.extensions.singletonEntryPoint
2828
import im.vector.app.core.services.VectorSyncService
2929
import org.matrix.android.sdk.internal.session.sync.job.SyncService
3030
import timber.log.Timber
@@ -33,9 +33,8 @@ class AlarmSyncBroadcastReceiver : BroadcastReceiver() {
3333

3434
override fun onReceive(context: Context, intent: Intent) {
3535
Timber.d("## Sync: AlarmSyncBroadcastReceiver received intent")
36-
val vectorPreferences = (context.applicationContext as? HasVectorInjector)
37-
?.injector()
38-
?.takeIf { it.activeSessionHolder().getSafeActiveSession() != null }
36+
val vectorPreferences = context.singletonEntryPoint()
37+
.takeIf { it.activeSessionHolder().getSafeActiveSession() != null }
3938
?.vectorPreferences()
4039
?: return Unit.also { Timber.v("No active session, so don't launch sync service.") }
4140

vector/src/fdroid/java/im/vector/app/fdroid/receiver/OnApplicationUpgradeOrRebootReceiver.kt

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,22 +20,19 @@ package im.vector.app.fdroid.receiver
2020
import android.content.BroadcastReceiver
2121
import android.content.Context
2222
import android.content.Intent
23-
import im.vector.app.core.di.HasVectorInjector
24-
import im.vector.app.core.extensions.vectorComponent
23+
import im.vector.app.core.extensions.singletonEntryPoint
2524
import im.vector.app.fdroid.BackgroundSyncStarter
2625
import timber.log.Timber
2726

2827
class OnApplicationUpgradeOrRebootReceiver : BroadcastReceiver() {
2928

3029
override fun onReceive(context: Context, intent: Intent) {
3130
Timber.v("## onReceive() ${intent.action}")
32-
val appContext = context.applicationContext
33-
if (appContext is HasVectorInjector) {
31+
val singletonEntryPoint = context.singletonEntryPoint()
3432
BackgroundSyncStarter.start(
3533
context,
36-
appContext.vectorComponent().vectorPreferences(),
37-
appContext.injector().activeSessionHolder()
34+
singletonEntryPoint.vectorPreferences(),
35+
singletonEntryPoint.activeSessionHolder()
3836
)
39-
}
4037
}
4138
}

0 commit comments

Comments
 (0)