Worker Injection
Tangle is able to leverage Dagger's AssistedInject functionality to perform constructor injection
on your Workers. The @TangleWorker
annotation will automatically multi-bind any Worker,
allowing you to create it via the TangleWorkerFactory
.
import android.content.Context
import androidx.work.CoroutineWorker
import androidx.work.WorkerParameters
import dagger.assisted.Assisted
import dagger.assisted.AssistedInject
import tangle.work.TangleWorker
@TangleWorker
class MyWorker @AssistedInject constructor(
@Assisted context: Context,
@Assisted params: WorkerParameters,
val repository: MyRepository
) : CoroutineWorker(context,params){
override suspend fun doWork(): Result {
// ...
}
}
TangleGraph
must be initialized as early as possible -- typically in Application.onCreate()
.
TangleWorkerFactory
will then be automatically added to the application-scoped component.
Use an instance of TangleWorkerFactory
in your WorkManager
configuration.
import android.app.Application
import androidx.work.Configuration
import tangle.inject.TangleGraph
import tangle.work.TangleWorkerFactory
import javax.inject.Inject
class MyApplication : Application(), Configuration.Provider {
@Inject lateinit var workerFactory: TangleWorkerFactory
override fun onCreate() {
super.onCreate()
val myAppComponent = DaggerAppComponent.factory()
.create(this)
TangleGraph.init(myAppComponent)
// inject your application class after initializing TangleGraph
(myAppComponent as MyApplicationComponent).inject(this)
}
override fun getWorkManagerConfiguration(): Configuration {
return Configuration.Builder()
.setWorkerFactory(workerFactory)
.build()
}
}