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