From 64c579ea274771163eca67129a1dd21811098ced Mon Sep 17 00:00:00 2001 From: anstaendig Date: Sat, 14 Oct 2017 11:37:03 +0300 Subject: [PATCH 1/2] Update Kotlin, gradle plugin and built tools --- build.gradle | 4 ++-- dependencies.gradle | 2 +- .../boilerplate/ui/injection/module/ApplicationModule.kt | 1 - 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/build.gradle b/build.gradle index 914dfd7..dd44077 100644 --- a/build.gradle +++ b/build.gradle @@ -1,13 +1,13 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.1.4-3' + ext.kotlin_version = '1.1.51' repositories { google() jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.0.0-beta6' + classpath 'com.android.tools.build:gradle:3.0.0-beta7' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "com.dicedmelon.gradle:jacoco-android:0.1.1" diff --git a/dependencies.gradle b/dependencies.gradle index 384f575..7ef6334 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -7,7 +7,7 @@ allprojects { ext { //Android - androidBuildToolsVersion = "26.0.0" + androidBuildToolsVersion = "26.0.2" androidMinSdkVersion = 15 androidTargetSdkVersion = 26 androidCompileSdkVersion = 26 diff --git a/mobile-ui/src/main/java/org/buffer/android/boilerplate/ui/injection/module/ApplicationModule.kt b/mobile-ui/src/main/java/org/buffer/android/boilerplate/ui/injection/module/ApplicationModule.kt index 427e3e7..6e1ae7b 100755 --- a/mobile-ui/src/main/java/org/buffer/android/boilerplate/ui/injection/module/ApplicationModule.kt +++ b/mobile-ui/src/main/java/org/buffer/android/boilerplate/ui/injection/module/ApplicationModule.kt @@ -44,7 +44,6 @@ open class ApplicationModule { return PreferencesHelper(context) } - @Provides @PerApplication internal fun provideBufferooRepository(factory: BufferooDataStoreFactory, From 7124bac2e49f812a5c53b6ddb54e792cd449f88f Mon Sep 17 00:00:00 2001 From: anstaendig Date: Mon, 16 Oct 2017 14:57:52 +0300 Subject: [PATCH 2/2] Refactor DI to match packages --- build.gradle | 2 +- .../data/BufferooDataRepository.kt | 2 +- .../component/TestApplicationComponent.kt | 18 +++-- .../injection/module/TestApplicationModule.kt | 53 ++------------ .../ui/injection/module/TestCacheModule.kt | 39 ++++++++++ .../ui/injection/module/TestDataModule.kt | 28 ++++++++ .../ui/injection/module/TestRemoteModule.kt | 26 +++++++ .../boilerplate/ui/browse/BrowseActivity.kt | 15 ++-- .../ui/injection/ApplicationComponent.kt | 23 ++++-- .../component/BrowseActivitySubComponent.kt | 13 ---- .../injection/module/ActivityBindingModule.kt | 15 ---- .../ui/injection/module/ApplicationModule.kt | 71 ++----------------- .../injection/module/BrowseActivityModule.kt | 23 ------ .../ui/injection/module/CacheModule.kt | 37 ++++++++++ .../ui/injection/module/DataModule.kt | 18 +++++ .../ui/injection/module/DomainModule.kt | 9 +++ .../ui/injection/module/PresentationModule.kt | 35 +++++++++ .../ui/injection/module/RemoteModule.kt | 33 +++++++++ .../ui/injection/module/UiModule.kt | 21 ++++++ .../presentation/ViewModelFactory.kt | 34 +++++++++ .../browse/BrowseBufferoosViewModelFactory.kt | 18 ----- 21 files changed, 325 insertions(+), 208 deletions(-) create mode 100644 mobile-ui/src/androidTest/java/org/buffer/android/boilerplate/ui/injection/module/TestCacheModule.kt create mode 100644 mobile-ui/src/androidTest/java/org/buffer/android/boilerplate/ui/injection/module/TestDataModule.kt create mode 100644 mobile-ui/src/androidTest/java/org/buffer/android/boilerplate/ui/injection/module/TestRemoteModule.kt delete mode 100644 mobile-ui/src/main/java/org/buffer/android/boilerplate/ui/injection/component/BrowseActivitySubComponent.kt delete mode 100644 mobile-ui/src/main/java/org/buffer/android/boilerplate/ui/injection/module/ActivityBindingModule.kt delete mode 100755 mobile-ui/src/main/java/org/buffer/android/boilerplate/ui/injection/module/BrowseActivityModule.kt create mode 100644 mobile-ui/src/main/java/org/buffer/android/boilerplate/ui/injection/module/CacheModule.kt create mode 100644 mobile-ui/src/main/java/org/buffer/android/boilerplate/ui/injection/module/DataModule.kt create mode 100644 mobile-ui/src/main/java/org/buffer/android/boilerplate/ui/injection/module/DomainModule.kt create mode 100644 mobile-ui/src/main/java/org/buffer/android/boilerplate/ui/injection/module/PresentationModule.kt create mode 100644 mobile-ui/src/main/java/org/buffer/android/boilerplate/ui/injection/module/RemoteModule.kt create mode 100644 mobile-ui/src/main/java/org/buffer/android/boilerplate/ui/injection/module/UiModule.kt create mode 100644 presentation/src/main/java/org/buffer/android/boilerplate/presentation/ViewModelFactory.kt delete mode 100644 presentation/src/main/java/org/buffer/android/boilerplate/presentation/browse/BrowseBufferoosViewModelFactory.kt diff --git a/build.gradle b/build.gradle index dd44077..a262f4d 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.0.0-beta7' + classpath 'com.android.tools.build:gradle:3.0.0-rc1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "com.dicedmelon.gradle:jacoco-android:0.1.1" diff --git a/data/src/main/java/org/buffer/android/boilerplate/data/BufferooDataRepository.kt b/data/src/main/java/org/buffer/android/boilerplate/data/BufferooDataRepository.kt index 15d23a3..6c2d89e 100644 --- a/data/src/main/java/org/buffer/android/boilerplate/data/BufferooDataRepository.kt +++ b/data/src/main/java/org/buffer/android/boilerplate/data/BufferooDataRepository.kt @@ -14,7 +14,7 @@ import javax.inject.Inject * data sources */ class BufferooDataRepository @Inject constructor(private val factory: BufferooDataStoreFactory, - private val bufferooMapper: BufferooMapper): + private val bufferooMapper: BufferooMapper) : BufferooRepository { override fun clearBufferoos(): Completable { diff --git a/mobile-ui/src/androidTest/java/org/buffer/android/boilerplate/ui/injection/component/TestApplicationComponent.kt b/mobile-ui/src/androidTest/java/org/buffer/android/boilerplate/ui/injection/component/TestApplicationComponent.kt index 31628b0..75e625e 100644 --- a/mobile-ui/src/androidTest/java/org/buffer/android/boilerplate/ui/injection/component/TestApplicationComponent.kt +++ b/mobile-ui/src/androidTest/java/org/buffer/android/boilerplate/ui/injection/component/TestApplicationComponent.kt @@ -7,14 +7,20 @@ import dagger.android.support.AndroidSupportInjectionModule import org.buffer.android.boilerplate.domain.executor.PostExecutionThread import org.buffer.android.boilerplate.domain.repository.BufferooRepository import org.buffer.android.boilerplate.ui.injection.ApplicationComponent -import org.buffer.android.boilerplate.ui.injection.module.ActivityBindingModule -import org.buffer.android.boilerplate.ui.injection.module.TestApplicationModule +import org.buffer.android.boilerplate.ui.injection.module.* import org.buffer.android.boilerplate.ui.injection.scopes.PerApplication import org.buffer.android.boilerplate.ui.test.TestApplication - -@Component(modules = arrayOf(TestApplicationModule::class, ActivityBindingModule::class, - AndroidSupportInjectionModule::class)) -@PerApplication +import javax.inject.Singleton + +@Singleton +@Component(modules = arrayOf( + TestApplicationModule::class, + AndroidSupportInjectionModule::class, + TestCacheModule::class, + TestRemoteModule::class, + TestDataModule::class, + PresentationModule::class, + UiModule::class)) interface TestApplicationComponent : ApplicationComponent { fun bufferooRepository(): BufferooRepository diff --git a/mobile-ui/src/androidTest/java/org/buffer/android/boilerplate/ui/injection/module/TestApplicationModule.kt b/mobile-ui/src/androidTest/java/org/buffer/android/boilerplate/ui/injection/module/TestApplicationModule.kt index 893706b..676024a 100644 --- a/mobile-ui/src/androidTest/java/org/buffer/android/boilerplate/ui/injection/module/TestApplicationModule.kt +++ b/mobile-ui/src/androidTest/java/org/buffer/android/boilerplate/ui/injection/module/TestApplicationModule.kt @@ -3,6 +3,7 @@ package org.buffer.android.boilerplate.ui.injection.module import android.app.Application import android.content.Context import com.nhaarman.mockito_kotlin.mock +import dagger.Binds import dagger.Module import dagger.Provides import org.buffer.android.boilerplate.cache.PreferencesHelper @@ -17,54 +18,8 @@ import org.buffer.android.boilerplate.ui.UiThread import org.buffer.android.boilerplate.ui.injection.scopes.PerApplication @Module -class TestApplicationModule { - - @Provides - @PerApplication - fun provideContext(application: Application): Context { - return application - } - - @Provides - @PerApplication - internal fun providePreferencesHelper(): PreferencesHelper { - return mock() - } - - @Provides - @PerApplication - internal fun provideBufferooRepository(): BufferooRepository { - return mock() - } - - @Provides - @PerApplication - internal fun provideBufferooCache(): BufferooCache { - return mock() - } - - @Provides - @PerApplication - internal fun provideBufferooRemote(): BufferooRemote { - return mock() - } - - @Provides - @PerApplication - internal fun provideThreadExecutor(jobExecutor: JobExecutor): ThreadExecutor { - return jobExecutor - } - - @Provides - @PerApplication - internal fun providePostExecutionThread(uiThread: UiThread): PostExecutionThread { - return uiThread - } - - @Provides - @PerApplication - internal fun provideBufferooService(): BufferooService { - return mock() - } +abstract class TestApplicationModule { + @Binds + abstract fun bindContext(application: Application): Context } \ No newline at end of file diff --git a/mobile-ui/src/androidTest/java/org/buffer/android/boilerplate/ui/injection/module/TestCacheModule.kt b/mobile-ui/src/androidTest/java/org/buffer/android/boilerplate/ui/injection/module/TestCacheModule.kt new file mode 100644 index 0000000..21f645c --- /dev/null +++ b/mobile-ui/src/androidTest/java/org/buffer/android/boilerplate/ui/injection/module/TestCacheModule.kt @@ -0,0 +1,39 @@ +package org.buffer.android.boilerplate.ui.injection.module + +import android.app.Application +import android.arch.persistence.room.Room +import com.nhaarman.mockito_kotlin.mock +import dagger.Module +import dagger.Provides +import org.buffer.android.boilerplate.cache.PreferencesHelper +import org.buffer.android.boilerplate.cache.db.BufferoosDatabase +import org.buffer.android.boilerplate.data.repository.BufferooCache +import javax.inject.Singleton + +@Module +object TestCacheModule { + + @Provides + @JvmStatic + fun provideBufferoosDatabase(application: Application): BufferoosDatabase { + return Room.databaseBuilder( + application.applicationContext, + BufferoosDatabase::class.java, "bufferoos.db") + .build() + } + + @Provides + @JvmStatic + @Singleton + fun provideBufferooCache(): BufferooCache { + return mock() + } + + @Provides + @JvmStatic + @Singleton + fun providePreferencesHelper(): PreferencesHelper { + return mock() + } + +} \ No newline at end of file diff --git a/mobile-ui/src/androidTest/java/org/buffer/android/boilerplate/ui/injection/module/TestDataModule.kt b/mobile-ui/src/androidTest/java/org/buffer/android/boilerplate/ui/injection/module/TestDataModule.kt new file mode 100644 index 0000000..5067bfd --- /dev/null +++ b/mobile-ui/src/androidTest/java/org/buffer/android/boilerplate/ui/injection/module/TestDataModule.kt @@ -0,0 +1,28 @@ +package org.buffer.android.boilerplate.ui.injection.module + +import com.nhaarman.mockito_kotlin.mock +import dagger.Binds +import dagger.Module +import dagger.Provides +import org.buffer.android.boilerplate.data.executor.JobExecutor +import org.buffer.android.boilerplate.domain.executor.ThreadExecutor +import org.buffer.android.boilerplate.domain.repository.BufferooRepository +import javax.inject.Singleton + +@Module +abstract class TestDataModule { + + @Module + companion object { + + @Provides + @JvmStatic + @Singleton + fun provideBufferooRepository(): BufferooRepository { + return mock() + } + } + + @Binds + abstract fun bindThreadExecutor(jobExecutor: JobExecutor): ThreadExecutor +} diff --git a/mobile-ui/src/androidTest/java/org/buffer/android/boilerplate/ui/injection/module/TestRemoteModule.kt b/mobile-ui/src/androidTest/java/org/buffer/android/boilerplate/ui/injection/module/TestRemoteModule.kt new file mode 100644 index 0000000..963b253 --- /dev/null +++ b/mobile-ui/src/androidTest/java/org/buffer/android/boilerplate/ui/injection/module/TestRemoteModule.kt @@ -0,0 +1,26 @@ +package org.buffer.android.boilerplate.ui.injection.module + +import com.nhaarman.mockito_kotlin.mock +import dagger.Module +import dagger.Provides +import org.buffer.android.boilerplate.data.repository.BufferooRemote +import org.buffer.android.boilerplate.remote.BufferooService +import javax.inject.Singleton + +@Module +object TestRemoteModule { + + @Provides + @JvmStatic + @Singleton + fun provideBufferooRemote(): BufferooRemote { + return mock() + } + + @Provides + @JvmStatic + @Singleton + fun provideBufferooService(): BufferooService { + return mock() + } +} \ No newline at end of file diff --git a/mobile-ui/src/main/java/org/buffer/android/boilerplate/ui/browse/BrowseActivity.kt b/mobile-ui/src/main/java/org/buffer/android/boilerplate/ui/browse/BrowseActivity.kt index 0949b30..922382d 100644 --- a/mobile-ui/src/main/java/org/buffer/android/boilerplate/ui/browse/BrowseActivity.kt +++ b/mobile-ui/src/main/java/org/buffer/android/boilerplate/ui/browse/BrowseActivity.kt @@ -8,10 +8,9 @@ import android.support.v7.widget.LinearLayoutManager import android.view.View import dagger.android.AndroidInjection import kotlinx.android.synthetic.main.activity_browse.* +import org.buffer.android.boilerplate.presentation.ViewModelFactory import org.buffer.android.boilerplate.presentation.browse.BrowseBufferoosViewModel -import org.buffer.android.boilerplate.presentation.browse.BrowseBufferoosViewModelFactory import org.buffer.android.boilerplate.presentation.data.ResourceState -import org.buffer.android.boilerplate.presentation.data.Resource import org.buffer.android.boilerplate.presentation.model.BufferooView import org.buffer.android.boilerplate.ui.R import org.buffer.android.boilerplate.ui.mapper.BufferooMapper @@ -19,11 +18,11 @@ import org.buffer.android.boilerplate.ui.widget.empty.EmptyListener import org.buffer.android.boilerplate.ui.widget.error.ErrorListener import javax.inject.Inject -class BrowseActivity: AppCompatActivity() { +class BrowseActivity : AppCompatActivity() { @Inject lateinit var browseAdapter: BrowseAdapter @Inject lateinit var mapper: BufferooMapper - @Inject lateinit var viewModelFactory: BrowseBufferoosViewModelFactory + @Inject lateinit var viewModelFactory: ViewModelFactory private lateinit var browseBufferoosViewModel: BrowseBufferoosViewModel override fun onCreate(savedInstanceState: Bundle?) { @@ -40,9 +39,9 @@ class BrowseActivity: AppCompatActivity() { override fun onStart() { super.onStart() - browseBufferoosViewModel.getBufferoos().observe(this, - Observer>> { - if (it != null) this.handleDataState(it.status, it.data, it.message) }) + browseBufferoosViewModel.getBufferoos().observe(this, Observer { + if (it != null) this.handleDataState(it.status, it.data, it.message) + }) } private fun setupBrowseRecycler() { @@ -69,7 +68,7 @@ class BrowseActivity: AppCompatActivity() { private fun setupScreenForSuccess(data: List?) { view_error.visibility = View.GONE progress.visibility = View.GONE - if (data!= null && data.isNotEmpty()) { + if (data != null && data.isNotEmpty()) { updateListView(data) recycler_browse.visibility = View.VISIBLE } else { diff --git a/mobile-ui/src/main/java/org/buffer/android/boilerplate/ui/injection/ApplicationComponent.kt b/mobile-ui/src/main/java/org/buffer/android/boilerplate/ui/injection/ApplicationComponent.kt index 9e499f9..5c9b9b5 100644 --- a/mobile-ui/src/main/java/org/buffer/android/boilerplate/ui/injection/ApplicationComponent.kt +++ b/mobile-ui/src/main/java/org/buffer/android/boilerplate/ui/injection/ApplicationComponent.kt @@ -5,18 +5,27 @@ import dagger.BindsInstance import dagger.Component import dagger.android.support.AndroidSupportInjectionModule import org.buffer.android.boilerplate.ui.BufferooApplication -import org.buffer.android.boilerplate.ui.injection.module.ActivityBindingModule -import org.buffer.android.boilerplate.ui.injection.module.ApplicationModule -import org.buffer.android.boilerplate.ui.injection.scopes.PerApplication +import org.buffer.android.boilerplate.ui.injection.module.* +import javax.inject.Singleton -@PerApplication -@Component(modules = arrayOf(ActivityBindingModule::class, ApplicationModule::class, - AndroidSupportInjectionModule::class)) +@Singleton +@Component(modules = arrayOf( + ApplicationModule::class, + AndroidSupportInjectionModule::class, + CacheModule::class, + DataModule::class, + DomainModule::class, + PresentationModule::class, + RemoteModule::class, + UiModule::class) +) interface ApplicationComponent { @Component.Builder interface Builder { - @BindsInstance fun application(application: Application): Builder + @BindsInstance + fun application(application: Application): Builder + fun build(): ApplicationComponent } diff --git a/mobile-ui/src/main/java/org/buffer/android/boilerplate/ui/injection/component/BrowseActivitySubComponent.kt b/mobile-ui/src/main/java/org/buffer/android/boilerplate/ui/injection/component/BrowseActivitySubComponent.kt deleted file mode 100644 index 406f1f5..0000000 --- a/mobile-ui/src/main/java/org/buffer/android/boilerplate/ui/injection/component/BrowseActivitySubComponent.kt +++ /dev/null @@ -1,13 +0,0 @@ -package org.buffer.android.boilerplate.ui.injection.component - -import dagger.Subcomponent -import dagger.android.AndroidInjector -import org.buffer.android.boilerplate.ui.browse.BrowseActivity - -@Subcomponent -interface BrowseActivitySubComponent : AndroidInjector { - - @Subcomponent.Builder - abstract class Builder : AndroidInjector.Builder() - -} \ No newline at end of file diff --git a/mobile-ui/src/main/java/org/buffer/android/boilerplate/ui/injection/module/ActivityBindingModule.kt b/mobile-ui/src/main/java/org/buffer/android/boilerplate/ui/injection/module/ActivityBindingModule.kt deleted file mode 100644 index 585c6b0..0000000 --- a/mobile-ui/src/main/java/org/buffer/android/boilerplate/ui/injection/module/ActivityBindingModule.kt +++ /dev/null @@ -1,15 +0,0 @@ -package org.buffer.android.boilerplate.ui.injection.module - -import dagger.Module -import dagger.android.ContributesAndroidInjector -import org.buffer.android.boilerplate.ui.browse.BrowseActivity -import org.buffer.android.boilerplate.ui.injection.scopes.PerActivity - -@Module -abstract class ActivityBindingModule { - - @PerActivity - @ContributesAndroidInjector(modules = arrayOf(BrowseActivityModule::class)) - abstract fun bindMainActivity(): BrowseActivity - -} \ No newline at end of file diff --git a/mobile-ui/src/main/java/org/buffer/android/boilerplate/ui/injection/module/ApplicationModule.kt b/mobile-ui/src/main/java/org/buffer/android/boilerplate/ui/injection/module/ApplicationModule.kt index 6e1ae7b..92c9861 100755 --- a/mobile-ui/src/main/java/org/buffer/android/boilerplate/ui/injection/module/ApplicationModule.kt +++ b/mobile-ui/src/main/java/org/buffer/android/boilerplate/ui/injection/module/ApplicationModule.kt @@ -4,6 +4,7 @@ import android.app.Application import android.arch.lifecycle.ViewModelProvider import android.arch.persistence.room.Room import android.content.Context +import dagger.Binds import dagger.Module import dagger.Provides import org.buffer.android.boilerplate.cache.BufferooCacheImpl @@ -30,72 +31,8 @@ import org.buffer.android.boilerplate.ui.injection.scopes.PerApplication * Module used to provide dependencies at an application-level. */ @Module -open class ApplicationModule { - - @Provides - @PerApplication - fun provideContext(application: Application): Context { - return application - } - - @Provides - @PerApplication - internal fun providePreferencesHelper(context: Context): PreferencesHelper { - return PreferencesHelper(context) - } - - @Provides - @PerApplication - internal fun provideBufferooRepository(factory: BufferooDataStoreFactory, - mapper: BufferooMapper): BufferooRepository { - return BufferooDataRepository(factory, mapper) - } - - @Provides - @PerApplication - internal fun provideBufferooCache(database: BufferoosDatabase, - entityMapper: BufferooEntityMapper, - helper: PreferencesHelper): BufferooCache { - return BufferooCacheImpl(database, entityMapper, helper) - } - - @Provides - @PerApplication - internal fun provideBufferooRemote(service: BufferooService, - factory: org.buffer.android.boilerplate.remote.mapper.BufferooEntityMapper): BufferooRemote { - return BufferooRemoteImpl(service, factory) - } - - @Provides - @PerApplication - internal fun provideThreadExecutor(jobExecutor: JobExecutor): ThreadExecutor { - return jobExecutor - } - - @Provides - @PerApplication - internal fun providePostExecutionThread(uiThread: UiThread): PostExecutionThread { - return uiThread - } - - @Provides - @PerApplication - internal fun provideBufferooService(): BufferooService { - return BufferooServiceFactory.makeBuffeoorService(BuildConfig.DEBUG) - } - - @Provides - @PerApplication - internal fun provideViewModelFactory(): ViewModelProvider.Factory { - return ViewModelProvider.NewInstanceFactory() - } - - @Provides - @PerApplication - internal fun provideBufferoosDatabase(application: Application): BufferoosDatabase { - return Room.databaseBuilder(application.applicationContext, - BufferoosDatabase::class.java, "bufferoos.db") - .build() - } +abstract class ApplicationModule { + @Binds + abstract fun bindContext(application: Application): Context } diff --git a/mobile-ui/src/main/java/org/buffer/android/boilerplate/ui/injection/module/BrowseActivityModule.kt b/mobile-ui/src/main/java/org/buffer/android/boilerplate/ui/injection/module/BrowseActivityModule.kt deleted file mode 100755 index c8f0312..0000000 --- a/mobile-ui/src/main/java/org/buffer/android/boilerplate/ui/injection/module/BrowseActivityModule.kt +++ /dev/null @@ -1,23 +0,0 @@ -package org.buffer.android.boilerplate.ui.injection.module - -import dagger.Module -import dagger.Provides -import org.buffer.android.boilerplate.domain.interactor.browse.GetBufferoos -import org.buffer.android.boilerplate.presentation.browse.BrowseBufferoosViewModelFactory -import org.buffer.android.boilerplate.presentation.mapper.BufferooMapper - - -/** - * Module used to provide dependencies at an activity-level. - */ -@Module -open class BrowseActivityModule { - - @Provides - fun provideBrowseBufferoosViewModelFactory(getBufferoos: GetBufferoos, - bufferooMapper: BufferooMapper): - BrowseBufferoosViewModelFactory { - return BrowseBufferoosViewModelFactory(getBufferoos, bufferooMapper) - } - -} diff --git a/mobile-ui/src/main/java/org/buffer/android/boilerplate/ui/injection/module/CacheModule.kt b/mobile-ui/src/main/java/org/buffer/android/boilerplate/ui/injection/module/CacheModule.kt new file mode 100644 index 0000000..731f3fe --- /dev/null +++ b/mobile-ui/src/main/java/org/buffer/android/boilerplate/ui/injection/module/CacheModule.kt @@ -0,0 +1,37 @@ +package org.buffer.android.boilerplate.ui.injection.module + +import android.app.Application +import android.arch.persistence.room.Room +import dagger.Binds +import dagger.Module +import dagger.Provides +import org.buffer.android.boilerplate.cache.BufferooCacheImpl +import org.buffer.android.boilerplate.cache.db.BufferoosDatabase +import org.buffer.android.boilerplate.data.repository.BufferooCache + +/** + * Module that provides all dependencies from the cache package/layer. + */ +@Module +abstract class CacheModule { + + /** + * This companion object annotated as a module is necessary in order to provide dependencies + * statically in case the wrapping module is an abstract class (to use binding) + */ + @Module + companion object { + + @Provides + @JvmStatic + fun provideBufferoosDatabase(application: Application): BufferoosDatabase { + return Room.databaseBuilder( + application.applicationContext, + BufferoosDatabase::class.java, "bufferoos.db") + .build() + } + } + + @Binds + abstract fun bindBufferooCache(bufferooCacheImpl: BufferooCacheImpl): BufferooCache +} diff --git a/mobile-ui/src/main/java/org/buffer/android/boilerplate/ui/injection/module/DataModule.kt b/mobile-ui/src/main/java/org/buffer/android/boilerplate/ui/injection/module/DataModule.kt new file mode 100644 index 0000000..6448fc9 --- /dev/null +++ b/mobile-ui/src/main/java/org/buffer/android/boilerplate/ui/injection/module/DataModule.kt @@ -0,0 +1,18 @@ +package org.buffer.android.boilerplate.ui.injection.module + +import dagger.Binds +import dagger.Module +import org.buffer.android.boilerplate.data.BufferooDataRepository +import org.buffer.android.boilerplate.data.executor.JobExecutor +import org.buffer.android.boilerplate.domain.executor.ThreadExecutor +import org.buffer.android.boilerplate.domain.repository.BufferooRepository + +@Module +abstract class DataModule { + + @Binds + abstract fun bindBufferooRepository(bufferooDataRepository: BufferooDataRepository): BufferooRepository + + @Binds + abstract fun bindThreadExecutor(jobExecutor: JobExecutor): ThreadExecutor +} \ No newline at end of file diff --git a/mobile-ui/src/main/java/org/buffer/android/boilerplate/ui/injection/module/DomainModule.kt b/mobile-ui/src/main/java/org/buffer/android/boilerplate/ui/injection/module/DomainModule.kt new file mode 100644 index 0000000..4d170fe --- /dev/null +++ b/mobile-ui/src/main/java/org/buffer/android/boilerplate/ui/injection/module/DomainModule.kt @@ -0,0 +1,9 @@ +package org.buffer.android.boilerplate.ui.injection.module + +import dagger.Module + +/** + * Module that provides all dependencies from the domain package/layer. + */ +@Module +abstract class DomainModule \ No newline at end of file diff --git a/mobile-ui/src/main/java/org/buffer/android/boilerplate/ui/injection/module/PresentationModule.kt b/mobile-ui/src/main/java/org/buffer/android/boilerplate/ui/injection/module/PresentationModule.kt new file mode 100644 index 0000000..3667acb --- /dev/null +++ b/mobile-ui/src/main/java/org/buffer/android/boilerplate/ui/injection/module/PresentationModule.kt @@ -0,0 +1,35 @@ +package org.buffer.android.boilerplate.ui.injection.module + +import android.arch.lifecycle.ViewModel +import android.arch.lifecycle.ViewModelProvider +import dagger.Binds +import dagger.MapKey +import dagger.Module +import dagger.multibindings.IntoMap +import org.buffer.android.boilerplate.presentation.ViewModelFactory +import org.buffer.android.boilerplate.presentation.browse.BrowseBufferoosViewModel +import kotlin.reflect.KClass + +/** + * Annotation class to identify view models by classname. + */ +@MustBeDocumented +@Target(AnnotationTarget.FUNCTION) +@Retention(AnnotationRetention.RUNTIME) +@MapKey +annotation class ViewModelKey(val value: KClass) + +/** + * Module that provides all dependencies from the presentation package/layer. + */ +@Module +abstract class PresentationModule { + @Binds + @IntoMap + @ViewModelKey(BrowseBufferoosViewModel::class) + abstract fun bindBrowseBufferoosViewModel(viewModel: BrowseBufferoosViewModel): ViewModel + + @Binds + abstract fun bindViewModelFactory(factory: ViewModelFactory): ViewModelProvider.Factory +} + diff --git a/mobile-ui/src/main/java/org/buffer/android/boilerplate/ui/injection/module/RemoteModule.kt b/mobile-ui/src/main/java/org/buffer/android/boilerplate/ui/injection/module/RemoteModule.kt new file mode 100644 index 0000000..4a1be0b --- /dev/null +++ b/mobile-ui/src/main/java/org/buffer/android/boilerplate/ui/injection/module/RemoteModule.kt @@ -0,0 +1,33 @@ +package org.buffer.android.boilerplate.ui.injection.module + +import dagger.Binds +import dagger.Module +import dagger.Provides +import org.buffer.android.boilerplate.data.repository.BufferooRemote +import org.buffer.android.boilerplate.remote.BufferooRemoteImpl +import org.buffer.android.boilerplate.remote.BufferooService +import org.buffer.android.boilerplate.remote.BufferooServiceFactory +import org.buffer.android.boilerplate.ui.BuildConfig + +/** + * Module that provides all dependencies from the repository package/layer. + */ +@Module +abstract class RemoteModule { + + /** + * This companion object annotated as a module is necessary in order to provide dependencies + * statically in case the wrapping module is an abstract class (to use binding) + */ + @Module + companion object { + @Provides + @JvmStatic + fun provideBufferooService(): BufferooService { + return BufferooServiceFactory.makeBuffeoorService(BuildConfig.DEBUG) + } + } + + @Binds + abstract fun bindBufferooRemote(bufferooRemoteImpl: BufferooRemoteImpl): BufferooRemote +} \ No newline at end of file diff --git a/mobile-ui/src/main/java/org/buffer/android/boilerplate/ui/injection/module/UiModule.kt b/mobile-ui/src/main/java/org/buffer/android/boilerplate/ui/injection/module/UiModule.kt new file mode 100644 index 0000000..672a0a9 --- /dev/null +++ b/mobile-ui/src/main/java/org/buffer/android/boilerplate/ui/injection/module/UiModule.kt @@ -0,0 +1,21 @@ +package org.buffer.android.boilerplate.ui.injection.module + +import dagger.Binds +import dagger.Module +import dagger.android.ContributesAndroidInjector +import org.buffer.android.boilerplate.domain.executor.PostExecutionThread +import org.buffer.android.boilerplate.ui.UiThread +import org.buffer.android.boilerplate.ui.browse.BrowseActivity + +/** + * Module that provides all dependencies from the mobile-ui package/layer and injects all activities. + */ +@Module +abstract class UiModule { + + @Binds + abstract fun bindPostExecutionThread(uiThread: UiThread): PostExecutionThread + + @ContributesAndroidInjector + abstract fun contributeMainActivity(): BrowseActivity +} \ No newline at end of file diff --git a/presentation/src/main/java/org/buffer/android/boilerplate/presentation/ViewModelFactory.kt b/presentation/src/main/java/org/buffer/android/boilerplate/presentation/ViewModelFactory.kt new file mode 100644 index 0000000..b0e720b --- /dev/null +++ b/presentation/src/main/java/org/buffer/android/boilerplate/presentation/ViewModelFactory.kt @@ -0,0 +1,34 @@ +package org.buffer.android.boilerplate.presentation + +import android.arch.lifecycle.ViewModel +import android.arch.lifecycle.ViewModelProvider +import javax.inject.Inject +import javax.inject.Provider +import javax.inject.Singleton + +@Singleton +class ViewModelFactory +@Inject constructor(private val creators: MutableMap, Provider>) + : ViewModelProvider.Factory { + + @Suppress("UNCHECKED_CAST") + override fun create(modelClass: Class): T { + var creator: Provider? = creators[modelClass] + if (creator == null) { + for ((key, value) in creators.entries) { + if (modelClass.isAssignableFrom(key)) { + creator = value + break + } + } + } + if (creator == null) { + throw IllegalArgumentException("unknown model class " + modelClass) + } + try { + return creator.get() as T + } catch (e: Exception) { + throw RuntimeException(e) + } + } +} diff --git a/presentation/src/main/java/org/buffer/android/boilerplate/presentation/browse/BrowseBufferoosViewModelFactory.kt b/presentation/src/main/java/org/buffer/android/boilerplate/presentation/browse/BrowseBufferoosViewModelFactory.kt deleted file mode 100644 index 62f11b3..0000000 --- a/presentation/src/main/java/org/buffer/android/boilerplate/presentation/browse/BrowseBufferoosViewModelFactory.kt +++ /dev/null @@ -1,18 +0,0 @@ -package org.buffer.android.boilerplate.presentation.browse - -import android.arch.lifecycle.ViewModel -import android.arch.lifecycle.ViewModelProvider -import org.buffer.android.boilerplate.domain.interactor.browse.GetBufferoos -import org.buffer.android.boilerplate.presentation.mapper.BufferooMapper - -open class BrowseBufferoosViewModelFactory( - private val getBufferoos: GetBufferoos, - private val bufferooMapper: BufferooMapper) : ViewModelProvider.Factory { - - override fun create(modelClass: Class): T { - if (modelClass.isAssignableFrom(BrowseBufferoosViewModel::class.java)) { - return BrowseBufferoosViewModel(getBufferoos, bufferooMapper) as T - } - throw IllegalArgumentException("Unknown ViewModel class") - } -} \ No newline at end of file