From 04686321f04c9ffe41fe32e3039b46d5559b94e5 Mon Sep 17 00:00:00 2001 From: nlgtuankiet Date: Fri, 5 Jun 2020 14:06:07 +0700 Subject: [PATCH] add DaggerAndroidWorker (demo inject to worker using dagger-android) --- app/build.gradle | 1 + .../com/sample/daggerworkmanagersample/DI.kt | 3 ++ .../DaggerAndroidWorker.kt | 42 +++++++++++++++++++ .../HelloWorldWorker.kt | 21 ++++++---- .../daggerworkmanagersample/MainActivity.kt | 5 +++ .../SampleApplication.kt | 13 +++++- app/src/main/res/layout/activity_main.xml | 8 ++++ 7 files changed, 83 insertions(+), 10 deletions(-) create mode 100644 app/src/main/java/com/sample/daggerworkmanagersample/DaggerAndroidWorker.kt diff --git a/app/build.gradle b/app/build.gradle index 80a1b03..45e1777 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -32,6 +32,7 @@ dependencies { // Dagger implementation "com.google.dagger:dagger-android:$dagger_version" kapt "com.google.dagger:dagger-compiler:$dagger_version" + kapt "com.google.dagger:dagger-android-processor:$dagger_version" // Work Manager implementation "androidx.work:work-runtime-ktx:2.3.4" diff --git a/app/src/main/java/com/sample/daggerworkmanagersample/DI.kt b/app/src/main/java/com/sample/daggerworkmanagersample/DI.kt index e5c3621..0c64913 100644 --- a/app/src/main/java/com/sample/daggerworkmanagersample/DI.kt +++ b/app/src/main/java/com/sample/daggerworkmanagersample/DI.kt @@ -6,12 +6,15 @@ import dagger.Binds import dagger.Component import dagger.MapKey import dagger.Module +import dagger.android.AndroidInjectionModule import dagger.android.AndroidInjector import dagger.multibindings.IntoMap import kotlin.reflect.KClass @Component( modules = [ + AndroidInjectionModule::class, + DaggerAndroidWorker.Module::class, SampleAssistedInjectModule::class, WorkerBindingModule::class ] diff --git a/app/src/main/java/com/sample/daggerworkmanagersample/DaggerAndroidWorker.kt b/app/src/main/java/com/sample/daggerworkmanagersample/DaggerAndroidWorker.kt new file mode 100644 index 0000000..59bbbff --- /dev/null +++ b/app/src/main/java/com/sample/daggerworkmanagersample/DaggerAndroidWorker.kt @@ -0,0 +1,42 @@ +package com.sample.daggerworkmanagersample + +import android.content.Context +import android.util.Log +import androidx.work.Worker +import androidx.work.WorkerParameters +import dagger.android.ContributesAndroidInjector +import dagger.android.HasAndroidInjector +import javax.inject.Inject + + +object ContextInjection { + @JvmStatic + fun inject(to: Any, with: Context) { + (with.applicationContext as HasAndroidInjector).androidInjector().inject(to) + } +} + +class DaggerAndroidWorker( + context: Context, + params: WorkerParameters +) : Worker(context, params) { + + @Inject + lateinit var foo: Foo + + init { + ContextInjection.inject(to = this, with = context) + } + + override fun doWork(): Result { + Log.d("DaggerAndroidWorker", "Injected foo: $foo") + return Result.success() + } + + + @dagger.Module + interface Module { + @ContributesAndroidInjector + fun worker(): DaggerAndroidWorker + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sample/daggerworkmanagersample/HelloWorldWorker.kt b/app/src/main/java/com/sample/daggerworkmanagersample/HelloWorldWorker.kt index cca8700..da0d8cf 100644 --- a/app/src/main/java/com/sample/daggerworkmanagersample/HelloWorldWorker.kt +++ b/app/src/main/java/com/sample/daggerworkmanagersample/HelloWorldWorker.kt @@ -2,10 +2,7 @@ package com.sample.daggerworkmanagersample import android.content.Context import android.util.Log -import androidx.work.ListenableWorker -import androidx.work.Worker -import androidx.work.WorkerFactory -import androidx.work.WorkerParameters +import androidx.work.* import com.squareup.inject.assisted.Assisted import com.squareup.inject.assisted.AssistedInject import javax.inject.Inject @@ -33,19 +30,25 @@ interface ChildWorkerFactory { fun create(appContext: Context, params: WorkerParameters): ListenableWorker } +/** + * If there is no worker found, return null to use the default behaviour of [WorkManager] + * (create worker using refection) + * + * @see WorkerFactory.createWorkerWithDefaultFallback + */ class SampleWorkerFactory @Inject constructor( private val workerFactories: Map, @JvmSuppressWildcards Provider> ) : WorkerFactory() { + override fun createWorker( appContext: Context, workerClassName: String, workerParameters: WorkerParameters ): ListenableWorker? { - val foundEntry = - workerFactories.entries.find { Class.forName(workerClassName).isAssignableFrom(it.key) } - val factoryProvider = foundEntry?.value - ?: throw IllegalArgumentException("unknown worker class name: $workerClassName") - return factoryProvider.get().create(appContext, workerParameters) + val foundEntry = workerFactories.entries + .find { Class.forName(workerClassName).isAssignableFrom(it.key) } + ?: return null + return foundEntry.value.get().create(appContext, workerParameters) } } diff --git a/app/src/main/java/com/sample/daggerworkmanagersample/MainActivity.kt b/app/src/main/java/com/sample/daggerworkmanagersample/MainActivity.kt index 62d5757..c05ecb5 100644 --- a/app/src/main/java/com/sample/daggerworkmanagersample/MainActivity.kt +++ b/app/src/main/java/com/sample/daggerworkmanagersample/MainActivity.kt @@ -16,5 +16,10 @@ class MainActivity : Activity() { OneTimeWorkRequestBuilder().build() ) } + findViewById