diff --git a/app/build.gradle b/app/build.gradle
index 86d7b282..359932f9 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -112,7 +112,9 @@ dependencies {
rx_java_version = "2.2.4",
rx_kolin_version = "2.2.0",
ktx_version = "1.0.1",
- rx_lint_version = '1.7.0'
+ rx_lint_version = '1.7.0',
+ work_version = "1.0.0",
+ assisted_inject_version = "0.3.2"
fileTree(dir: "libs", include: ["*.jar"])
androidTestImplementation("androidx.test.espresso:espresso-core:$espresso_core_version", {
@@ -131,10 +133,14 @@ dependencies {
implementation "androidx.constraintlayout:constraintlayout:$constraint_layout_version"
implementation 'androidx.multidex:multidex:2.0.1'
+ // Dagger
implementation "com.google.dagger:dagger-android:$dagger_version"
implementation "com.google.dagger:dagger-android-support:$dagger_version"
kapt "com.google.dagger:dagger-compiler:$dagger_version"
kapt "com.google.dagger:dagger-android-processor:$dagger_version"
+ // Assisted Inject
+ implementation "com.squareup.inject:assisted-inject-annotations-dagger2:$assisted_inject_version"
+ kapt "com.squareup.inject:assisted-inject-processor-dagger2:$assisted_inject_version"
implementation "net.hockeyapp.android:HockeySDK:$hockey_sdk_version"
implementation "com.jakewharton.timber:timber:$timber_version"
@@ -154,6 +160,9 @@ dependencies {
implementation "io.reactivex.rxjava2:rxjava:$rx_java_version"
implementation "io.reactivex.rxjava2:rxkotlin:$rx_kolin_version"
+ // Work manager
+ implementation "android.arch.work:work-runtime-ktx:$work_version"
+
// Testing
testImplementation "junit:junit:$junit_version"
// required if you want to use Mockito for unit tests
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 515d6cbc..57216f22 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -25,6 +25,13 @@
android:value="${apiKey}"
tools:replace="android:value"/>
+
+
+
diff --git a/app/src/main/java/dk/nodes/template/domain/tasks/SampleTask.kt b/app/src/main/java/dk/nodes/template/domain/tasks/SampleTask.kt
new file mode 100644
index 00000000..f6a3dac0
--- /dev/null
+++ b/app/src/main/java/dk/nodes/template/domain/tasks/SampleTask.kt
@@ -0,0 +1,24 @@
+package dk.nodes.template.domain.tasks
+
+import android.content.Context
+import androidx.work.Worker
+import androidx.work.WorkerParameters
+import com.squareup.inject.assisted.Assisted
+import com.squareup.inject.assisted.AssistedInject
+import dk.nodes.template.domain.repositories.PostRepository
+import dk.nodes.template.injection.factories.ChildWorkerFactory
+import timber.log.Timber
+
+class SampleTask @AssistedInject constructor(
+ @Assisted params: WorkerParameters,
+ @Assisted context: Context,
+ private val postRepository: PostRepository
+) : Worker(context, params) {
+ override fun doWork(): Result {
+ Timber.d("postRepository injected!")
+ return Result.success()
+ }
+
+ @AssistedInject.Factory
+ interface Factory : ChildWorkerFactory
+}
\ No newline at end of file
diff --git a/app/src/main/java/dk/nodes/template/inititializers/WorkManagerInitializer.kt b/app/src/main/java/dk/nodes/template/inititializers/WorkManagerInitializer.kt
new file mode 100644
index 00000000..00a175be
--- /dev/null
+++ b/app/src/main/java/dk/nodes/template/inititializers/WorkManagerInitializer.kt
@@ -0,0 +1,14 @@
+package dk.nodes.template.inititializers
+
+import android.app.Application
+import androidx.work.Configuration
+import androidx.work.WorkManager
+import androidx.work.WorkerFactory
+import javax.inject.Inject
+
+class WorkManagerInitializer @Inject constructor(private val workerFactory: WorkerFactory) :
+ AppInitializer {
+ override fun init(app: Application) {
+ WorkManager.initialize(app, Configuration.Builder().setWorkerFactory(workerFactory).build())
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/dk/nodes/template/injection/ViewModelKey.kt b/app/src/main/java/dk/nodes/template/injection/annotations/ViewModelKey.kt
similarity index 86%
rename from app/src/main/java/dk/nodes/template/injection/ViewModelKey.kt
rename to app/src/main/java/dk/nodes/template/injection/annotations/ViewModelKey.kt
index d4ff9c3a..25eac561 100644
--- a/app/src/main/java/dk/nodes/template/injection/ViewModelKey.kt
+++ b/app/src/main/java/dk/nodes/template/injection/annotations/ViewModelKey.kt
@@ -1,4 +1,4 @@
-package dk.nodes.template.injection
+package dk.nodes.template.injection.annotations
import androidx.lifecycle.ViewModel
import dagger.MapKey
diff --git a/app/src/main/java/dk/nodes/template/injection/annotations/WorkerKey.kt b/app/src/main/java/dk/nodes/template/injection/annotations/WorkerKey.kt
new file mode 100644
index 00000000..25c1cb4c
--- /dev/null
+++ b/app/src/main/java/dk/nodes/template/injection/annotations/WorkerKey.kt
@@ -0,0 +1,10 @@
+package dk.nodes.template.injection.annotations
+
+import androidx.work.ListenableWorker
+import dagger.MapKey
+import kotlin.reflect.KClass
+
+@MapKey
+@Retention(AnnotationRetention.RUNTIME)
+@Target(AnnotationTarget.FUNCTION)
+annotation class WorkerKey(val value: KClass)
\ No newline at end of file
diff --git a/app/src/main/java/dk/nodes/template/injection/components/AppComponent.kt b/app/src/main/java/dk/nodes/template/injection/components/AppComponent.kt
index 1a253268..6168e811 100644
--- a/app/src/main/java/dk/nodes/template/injection/components/AppComponent.kt
+++ b/app/src/main/java/dk/nodes/template/injection/components/AppComponent.kt
@@ -16,7 +16,8 @@ import dk.nodes.template.injection.modules.*
InteractorModule::class,
RestModule::class,
RestRepositoryModule::class,
- StorageModule::class
+ StorageModule::class,
+ TasksModule::class
]
)
@AppScope
diff --git a/app/src/main/java/dk/nodes/template/injection/factories/ChildWorkerFactory.kt b/app/src/main/java/dk/nodes/template/injection/factories/ChildWorkerFactory.kt
new file mode 100644
index 00000000..f3e6e1bb
--- /dev/null
+++ b/app/src/main/java/dk/nodes/template/injection/factories/ChildWorkerFactory.kt
@@ -0,0 +1,9 @@
+package dk.nodes.template.injection.factories
+
+import android.content.Context
+import androidx.work.ListenableWorker
+import androidx.work.WorkerParameters
+
+interface ChildWorkerFactory {
+ fun create(context: Context, params: WorkerParameters): ListenableWorker
+}
\ No newline at end of file
diff --git a/app/src/main/java/dk/nodes/template/injection/DaggerViewModelFactory.kt b/app/src/main/java/dk/nodes/template/injection/factories/DaggerViewModelFactory.kt
similarity index 95%
rename from app/src/main/java/dk/nodes/template/injection/DaggerViewModelFactory.kt
rename to app/src/main/java/dk/nodes/template/injection/factories/DaggerViewModelFactory.kt
index 99a75c7c..cb5d9dc2 100644
--- a/app/src/main/java/dk/nodes/template/injection/DaggerViewModelFactory.kt
+++ b/app/src/main/java/dk/nodes/template/injection/factories/DaggerViewModelFactory.kt
@@ -1,4 +1,4 @@
-package dk.nodes.template.injection
+package dk.nodes.template.injection.factories
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
diff --git a/app/src/main/java/dk/nodes/template/injection/factories/DaggerWorkerFactory.kt b/app/src/main/java/dk/nodes/template/injection/factories/DaggerWorkerFactory.kt
new file mode 100644
index 00000000..202619b4
--- /dev/null
+++ b/app/src/main/java/dk/nodes/template/injection/factories/DaggerWorkerFactory.kt
@@ -0,0 +1,24 @@
+package dk.nodes.template.injection.factories
+
+import android.content.Context
+import androidx.work.ListenableWorker
+import androidx.work.WorkerFactory
+import androidx.work.WorkerParameters
+import javax.inject.Inject
+import javax.inject.Provider
+
+class DaggerWorkerFactory @Inject constructor(
+ private val creators: Map, @JvmSuppressWildcards Provider>
+) : WorkerFactory() {
+ override fun createWorker(
+ context: Context,
+ workerClassName: String,
+ workerParameters: WorkerParameters
+ ): ListenableWorker? {
+ val workerClass = Class.forName(workerClassName)
+ val foundEntry = creators.entries.find { workerClass.isAssignableFrom(it.key) }
+ val factory = foundEntry?.value
+ ?: throw IllegalArgumentException("unknown worker class name: $workerClassName")
+ return factory.get().create(context, workerParameters)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/dk/nodes/template/injection/modules/AppModule.kt b/app/src/main/java/dk/nodes/template/injection/modules/AppModule.kt
index e0840e29..9976cfe6 100644
--- a/app/src/main/java/dk/nodes/template/injection/modules/AppModule.kt
+++ b/app/src/main/java/dk/nodes/template/injection/modules/AppModule.kt
@@ -7,6 +7,7 @@ import dk.nodes.template.App
import dk.nodes.template.inititializers.AppInitializers
import dk.nodes.template.inititializers.NStackInitializer
import dk.nodes.template.inititializers.TimberInitializer
+import dk.nodes.template.inititializers.WorkManagerInitializer
@Module
class AppModule {
@@ -16,8 +17,9 @@ class AppModule {
@Provides
fun provideInitializers(
nStackInitializer: NStackInitializer,
- timberInitializer: TimberInitializer
+ timberInitializer: TimberInitializer,
+ workManagerInitializer: WorkManagerInitializer
): AppInitializers {
- return AppInitializers(nStackInitializer, timberInitializer)
+ return AppInitializers(nStackInitializer, timberInitializer, workManagerInitializer)
}
}
\ No newline at end of file
diff --git a/app/src/main/java/dk/nodes/template/injection/modules/TaskModule.kt b/app/src/main/java/dk/nodes/template/injection/modules/TaskModule.kt
new file mode 100644
index 00000000..483b4695
--- /dev/null
+++ b/app/src/main/java/dk/nodes/template/injection/modules/TaskModule.kt
@@ -0,0 +1,13 @@
+package dk.nodes.template.injection.modules
+
+import androidx.work.WorkManager
+import dagger.Module
+import dagger.Provides
+import dk.nodes.arch.domain.injection.scopes.AppScope
+
+@Module(includes = [WorkerBindingModule::class, TasksAssistedModule::class])
+class TasksModule {
+ @Provides
+ @AppScope
+ fun provideWorkManager(): WorkManager = WorkManager.getInstance()
+}
\ No newline at end of file
diff --git a/app/src/main/java/dk/nodes/template/injection/modules/TasksAssistedModule.kt b/app/src/main/java/dk/nodes/template/injection/modules/TasksAssistedModule.kt
new file mode 100644
index 00000000..83f90c60
--- /dev/null
+++ b/app/src/main/java/dk/nodes/template/injection/modules/TasksAssistedModule.kt
@@ -0,0 +1,8 @@
+package dk.nodes.template.injection.modules
+
+import com.squareup.inject.assisted.dagger2.AssistedModule
+import dagger.Module
+
+@Module(includes = [AssistedInject_TasksAssistedModule::class])
+@AssistedModule
+interface TasksAssistedModule
\ No newline at end of file
diff --git a/app/src/main/java/dk/nodes/template/injection/modules/ViewModelBuilder.kt b/app/src/main/java/dk/nodes/template/injection/modules/ViewModelBuilder.kt
index d8d75c4e..a96f3947 100644
--- a/app/src/main/java/dk/nodes/template/injection/modules/ViewModelBuilder.kt
+++ b/app/src/main/java/dk/nodes/template/injection/modules/ViewModelBuilder.kt
@@ -3,7 +3,7 @@ package dk.nodes.template.injection.modules
import androidx.lifecycle.ViewModelProvider
import dagger.Binds
import dagger.Module
-import dk.nodes.template.injection.DaggerViewModelFactory
+import dk.nodes.template.injection.factories.DaggerViewModelFactory
import dk.nodes.template.presentation.ui.main.MainActivityBuilder
@Module(
diff --git a/app/src/main/java/dk/nodes/template/injection/modules/WorkerBindingModule.kt b/app/src/main/java/dk/nodes/template/injection/modules/WorkerBindingModule.kt
new file mode 100644
index 00000000..5ae6e1db
--- /dev/null
+++ b/app/src/main/java/dk/nodes/template/injection/modules/WorkerBindingModule.kt
@@ -0,0 +1,24 @@
+package dk.nodes.template.injection.modules
+
+import androidx.work.WorkerFactory
+import dagger.Binds
+import dagger.Module
+import dagger.multibindings.IntoMap
+import dk.nodes.arch.domain.injection.scopes.AppScope
+import dk.nodes.template.domain.tasks.SampleTask
+import dk.nodes.template.injection.annotations.WorkerKey
+import dk.nodes.template.injection.factories.ChildWorkerFactory
+import dk.nodes.template.injection.factories.DaggerWorkerFactory
+
+@Module
+interface WorkerBindingModule {
+
+ @AppScope
+ @Binds
+ fun bindWorkerFactory(factory: DaggerWorkerFactory): WorkerFactory
+
+ @Binds
+ @IntoMap
+ @WorkerKey(SampleTask::class)
+ fun bindSampleTask(factory: SampleTask.Factory): ChildWorkerFactory
+}
\ No newline at end of file
diff --git a/app/src/main/java/dk/nodes/template/presentation/ui/main/MainActivityBuilder.kt b/app/src/main/java/dk/nodes/template/presentation/ui/main/MainActivityBuilder.kt
index 9d151e6d..200945be 100644
--- a/app/src/main/java/dk/nodes/template/presentation/ui/main/MainActivityBuilder.kt
+++ b/app/src/main/java/dk/nodes/template/presentation/ui/main/MainActivityBuilder.kt
@@ -5,7 +5,7 @@ import dagger.Binds
import dagger.Module
import dagger.android.ContributesAndroidInjector
import dagger.multibindings.IntoMap
-import dk.nodes.template.injection.ViewModelKey
+import dk.nodes.template.injection.annotations.ViewModelKey
@Module
internal abstract class MainActivityBuilder {
diff --git a/app/src/main/java/dk/nodes/template/presentation/ui/main/MainActivityViewModel.kt b/app/src/main/java/dk/nodes/template/presentation/ui/main/MainActivityViewModel.kt
index 2481de37..dad006d3 100644
--- a/app/src/main/java/dk/nodes/template/presentation/ui/main/MainActivityViewModel.kt
+++ b/app/src/main/java/dk/nodes/template/presentation/ui/main/MainActivityViewModel.kt
@@ -34,8 +34,4 @@ class MainActivityViewModel @Inject constructor(
)
}
}
-
- override fun onCleared() {
- super.onCleared()
- }
}
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index 853882a5..c5e7900a 100644
--- a/build.gradle
+++ b/build.gradle
@@ -10,7 +10,7 @@ buildscript {
jcenter()
}
dependencies {
- classpath 'com.android.tools.build:gradle:3.3.0'
+ classpath 'com.android.tools.build:gradle:3.3.2'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "dk.nodes.nstack:translation:1.0.4"
classpath "com.github.gfx.ribbonizer:ribbonizer-plugin:2.1.0"
diff --git a/gradle.properties b/gradle.properties
deleted file mode 100644
index a5fc97b8..00000000
--- a/gradle.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-# Project-wide Gradle settings.
-
-# IDE (e.g. Android Studio) users:
-# Gradle settings configured through the IDE *will override*
-# any settings specified in this file.
-
-# For more details on how to configure your build environment visit
-# http://www.gradle.org/docs/current/userguide/build_environment.html
-
-# Specifies the JVM arguments used for the daemon process.
-# The setting is particularly useful for tweaking memory settings.
-org.gradle.jvmargs=-Xmx1536m
-
-# When configured, Gradle will run in incubating parallel mode.
-# This option should only be used with decoupled projects. More details, visit
-# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
-# org.gradle.parallel=true
-kotlin.coroutines=enable
-android.useAndroidX=true
-android.enableJetifier=true
\ No newline at end of file