Skip to content

Commit

Permalink
add DaggerAndroidWorker (demo inject to worker using dagger-android)
Browse files Browse the repository at this point in the history
  • Loading branch information
nlgtuankiet committed Jun 5, 2020
1 parent ca68feb commit 0468632
Show file tree
Hide file tree
Showing 7 changed files with 83 additions and 10 deletions.
1 change: 1 addition & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
3 changes: 3 additions & 0 deletions app/src/main/java/com/sample/daggerworkmanagersample/DI.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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
]
Expand Down
Original file line number Diff line number Diff line change
@@ -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
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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<Class<out ListenableWorker>, @JvmSuppressWildcards Provider<ChildWorkerFactory>>
) : 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)
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -16,5 +16,10 @@ class MainActivity : Activity() {
OneTimeWorkRequestBuilder<HelloWorldWorker>().build()
)
}
findViewById<Button>(R.id.hello_button2).setOnClickListener {
WorkManager.getInstance(this).enqueue(
OneTimeWorkRequestBuilder<DaggerAndroidWorker>().build()
)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,15 @@ package com.sample.daggerworkmanagersample

import android.app.Application
import androidx.work.Configuration
import dagger.android.AndroidInjector
import dagger.android.DispatchingAndroidInjector
import dagger.android.HasAndroidInjector
import javax.inject.Inject

class SampleApplication : Application(), Configuration.Provider {
class SampleApplication : Application(), Configuration.Provider, HasAndroidInjector {

@Inject
lateinit var androidInjector: DispatchingAndroidInjector<Any>

private lateinit var sampleComponent: SampleComponent

Expand All @@ -17,4 +24,8 @@ class SampleApplication : Application(), Configuration.Provider {
val factory: SampleWorkerFactory = sampleComponent.factory()
return Configuration.Builder().setWorkerFactory(factory).build()
}

override fun androidInjector(): AndroidInjector<Any> {
return androidInjector
}
}
8 changes: 8 additions & 0 deletions app/src/main/res/layout/activity_main.xml
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,12 @@
android:layout_marginTop="64dp"
android:text="Enqueue HelloWorldWorker" />

<Button
android:id="@+id/hello_button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="64dp"
android:text="Enqueue DaggerAndroidWorker" />

</LinearLayout>

0 comments on commit 0468632

Please sign in to comment.