Skip to content

Instantly share code, notes, and snippets.

@TinasheMzondiwa
Last active February 14, 2024 08:29
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save TinasheMzondiwa/a3712b00c2cb24b5870a621142ad16bd to your computer and use it in GitHub Desktop.
Save TinasheMzondiwa/a3712b00c2cb24b5870a621142ad16bd to your computer and use it in GitHub Desktop.
Android Dagger 2 Setup with Work Manager
import androidx.work.Worker
import dagger.Module
import dagger.android.AndroidInjector
import dagger.android.ContributesAndroidInjector
import dagger.multibindings.Multibinds
object AndroidWorkerInjection {
fun inject(worker: Worker) {
val application = worker.applicationContext
if (application !is HasWorkerInjector) {
throw RuntimeException(
"${application.javaClass.canonicalName} does not implement ${HasWorkerInjector::class.java.canonicalName}")
}
val workerInjector = (application as HasWorkerInjector).workerInjector()
workerInjector.inject(worker)
}
}
interface HasWorkerInjector {
fun workerInjector(): AndroidInjector<Worker>
}
@Module
abstract class AndroidWorkerInjectionModule {
@Multibinds
abstract fun workerInjectorFactories(): Map<Class<out Worker>, AndroidInjector.Factory<out Worker>>
@ContributesAndroidInjector
abstract fun bindExampleWorker(): ExampleWorker
}
import android.content.Context
import androidx.work.Worker
import androidx.work.WorkerParameters
import javax.inject.Inject
class ExampleWorker(context: Context, workerParams: WorkerParameters) : Worker(context, workerParams) {
@Inject
lateinit var dependency: SomeDependency
override fun doWork(): Result {
AndroidWorkerInjection.inject(this)
// Do work using [dependency]
return Result.success()
}
}
import android.app.Application
import androidx.work.Worker
import javax.inject.Inject
class MyApp : Application() : HasWorkerInjector {
@Inject
lateinit var workerInjector: DispatchingAndroidInjector<Worker>
override fun workerInjector(): AndroidInjector<Worker> = workerInjector
override fun onCreate() {
super.onCreate()
// Setup Dagger
DaggerMyAppComponent.builder()
.application(this)
.build()
.inject(this)
}
}
import dagger.BindsInstance
import dagger.Component
import dagger.android.AndroidInjectionModule
import dagger.android.support.AndroidSupportInjectionModule
import javax.inject.Singleton
@Singleton
@Component(
modules = [AndroidWorkerInjectionModule::class]
)
interface MyAppComponent {
@Component.Builder
interface Builder {
@BindsInstance
fun application(app: MyApp): Builder
fun build(): MyAppComponent
}
fun inject(app: MyApp)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment