MrOzOn 5 years ago
parent
commit
99158e2f89

+ 6 - 0
app/build.gradle

@@ -36,6 +36,12 @@ android {
 dependencies {
     implementation project(':core')
     implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
+    //DAGGER
+    def dagger_version = "2.21"
+    implementation "com.google.dagger:dagger:$dagger_version"
+    kapt "com.google.dagger:dagger-compiler:$dagger_version"
+    implementation "com.google.dagger:dagger-android-support:$dagger_version"
+    kapt "com.google.dagger:dagger-android-processor:$dagger_version"
     //NAVIGATION
     def nav_version = "2.3.0"
     implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"

+ 1 - 0
app/src/main/AndroidManifest.xml

@@ -8,6 +8,7 @@
         android:label="@string/app_name"
         android:roundIcon="@mipmap/ic_launcher_round"
         android:supportsRtl="true"
+        android:name=".App"
         android:theme="@style/AppTheme">
         <activity android:name=".presentation.main.MainActivity">
             <intent-filter>

+ 32 - 0
app/src/main/java/com/mrozon/healthdiary/App.kt

@@ -0,0 +1,32 @@
+package com.mrozon.healthdiary
+
+import android.app.Activity
+import android.app.Application
+import com.mrozon.healthdiary.di.component.DaggerAppComponent
+import dagger.android.AndroidInjector
+import dagger.android.DispatchingAndroidInjector
+import dagger.android.HasActivityInjector
+import javax.inject.Inject
+
+class App: Application(), HasActivityInjector {
+
+    @Inject
+    lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Activity>
+
+    override fun activityInjector(): AndroidInjector<Activity> {
+        return dispatchingAndroidInjector
+    }
+
+    override fun onCreate() {
+        super.onCreate()
+        initDagger()
+    }
+
+    private fun initDagger() {
+        DaggerAppComponent.builder()
+            .application(this)
+            .build()
+            .inject(this)
+    }
+}
+

+ 13 - 0
app/src/main/java/com/mrozon/healthdiary/di/builder/ActivityBuilder.kt

@@ -0,0 +1,13 @@
+package com.mrozon.healthdiary.di.builder
+
+import com.mrozon.healthdiary.presentation.main.MainActivity
+import com.mrozon.healthdiary.presentation.main.MainActivityModule
+import dagger.Module
+import dagger.android.ContributesAndroidInjector
+
+@Module
+abstract class ActivityBuilder {
+
+    @ContributesAndroidInjector(modules = [(MainActivityModule::class)])
+    abstract fun bindMainActivity(): MainActivity
+}

+ 25 - 0
app/src/main/java/com/mrozon/healthdiary/di/component/AppComponent.kt

@@ -0,0 +1,25 @@
+package com.mrozon.healthdiary.di.component
+
+import com.mrozon.healthdiary.App
+import com.mrozon.healthdiary.di.module.AppModule
+import dagger.BindsInstance
+import dagger.Component
+import dagger.android.AndroidInjectionModule
+import javax.inject.Singleton
+
+@Singleton
+@Component(modules = [AppModule::class])
+interface AppComponent {
+
+    @Component.Builder
+    interface Builder {
+
+        @BindsInstance
+        fun application(application: App): Builder
+
+        fun build(): AppComponent
+    }
+
+    fun inject(app: App)
+
+}

+ 19 - 0
app/src/main/java/com/mrozon/healthdiary/di/module/AppModule.kt

@@ -0,0 +1,19 @@
+package com.mrozon.healthdiary.di.module
+
+import com.mrozon.healthdiary.di.ActivityScope
+import com.mrozon.healthdiary.presentation.main.MainActivity
+import com.mrozon.healthdiary.presentation.main.MainActivityModule
+import dagger.Binds
+import dagger.Module
+import dagger.android.ContributesAndroidInjector
+import dagger.android.support.AndroidSupportInjectionModule
+import javax.inject.Singleton
+
+
+@Module(includes = [AndroidSupportInjectionModule::class])
+interface AppModule {
+
+    @ActivityScope
+    @ContributesAndroidInjector(modules = [MainActivityModule::class])
+    fun provideMainActivity(): MainActivity
+}

+ 11 - 0
app/src/main/java/com/mrozon/healthdiary/di/scopes.kt

@@ -0,0 +1,11 @@
+package com.mrozon.healthdiary.di
+
+import javax.inject.Scope
+
+@Scope
+@Retention(AnnotationRetention.RUNTIME)
+annotation class ActivityScope
+
+@Scope
+@Retention(AnnotationRetention.RUNTIME)
+annotation class FragmentScope

+ 8 - 0
app/src/main/java/com/mrozon/healthdiary/presentation/main/MainActivity.kt

@@ -1,6 +1,7 @@
 package com.mrozon.healthdiary.presentation.main
 
 import android.os.Bundle
+import androidx.fragment.app.Fragment
 import androidx.navigation.findNavController
 import androidx.navigation.ui.AppBarConfiguration
 import androidx.navigation.ui.navigateUp
@@ -8,11 +9,18 @@ import androidx.navigation.ui.setupActionBarWithNavController
 import com.mrozon.core.base.BaseActivity
 import com.mrozon.healthdiary.R
 import com.mrozon.healthdiary.databinding.ActivityMainBinding
+import dagger.android.AndroidInjector
+import dagger.android.DispatchingAndroidInjector
+import javax.inject.Inject
 
 class MainActivity : BaseActivity<ActivityMainBinding>() {
 
+    @Inject
     lateinit var viewModel: MainActivityViewModel
 
+    @Inject
+    lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Fragment>
+
     override fun getLayoutId(): Int = R.layout.activity_main
 
 

+ 16 - 0
app/src/main/java/com/mrozon/healthdiary/presentation/main/MainActivityModule.kt

@@ -0,0 +1,16 @@
+package com.mrozon.healthdiary.presentation.main
+
+import com.mrozon.healthdiary.di.FragmentScope
+import com.mrozon.healthdiary.presentation.showperson.ShowPersonFragment
+import com.mrozon.healthdiary.presentation.showperson.ShowPersonFragmentModule
+import dagger.Module
+import dagger.android.ContributesAndroidInjector
+
+
+@Module
+interface MainActivityModule {
+
+    @FragmentScope
+    @ContributesAndroidInjector(modules = [ ShowPersonFragmentModule::class])
+    fun provideShowPersonFragment(): ShowPersonFragment
+}

+ 2 - 1
app/src/main/java/com/mrozon/healthdiary/presentation/main/MainActivityViewModel.kt

@@ -1,5 +1,6 @@
 package com.mrozon.healthdiary.presentation.main
 
 import com.mrozon.core.base.BaseViewModel
+import javax.inject.Inject
 
-class MainActivityViewModel: BaseViewModel()
+class MainActivityViewModel @Inject constructor(): BaseViewModel()

+ 6 - 0
app/src/main/java/com/mrozon/healthdiary/presentation/showperson/ShowPersonFragmentModule.kt

@@ -0,0 +1,6 @@
+package com.mrozon.healthdiary.presentation.showperson
+
+import dagger.Module
+
+@Module
+interface ShowPersonFragmentModule

+ 2 - 1
core/build.gradle

@@ -39,9 +39,10 @@ dependencies {
     implementation "io.reactivex.rxjava2:rxjava:2.2.10"
     implementation "io.reactivex.rxjava2:rxandroid:2.1.1"
     //DAGGER
-    def dagger_version = "2.21"
+    def dagger_version = "2.24"
     implementation "com.google.dagger:dagger:$dagger_version"
     kapt "com.google.dagger:dagger-compiler:$dagger_version"
+    implementation "com.google.dagger:dagger-android-support:2.21"
     kapt "com.google.dagger:dagger-android-processor:$dagger_version"
 
     implementation fileTree(dir: 'libs', include: ['*.jar'])

+ 20 - 1
core/src/main/java/com/mrozon/core/base/BaseActivity.kt

@@ -5,15 +5,26 @@ import androidx.annotation.LayoutRes
 import androidx.appcompat.app.AppCompatActivity
 import androidx.databinding.DataBindingUtil
 import androidx.databinding.ViewDataBinding
+import androidx.fragment.app.Fragment
+import dagger.android.AndroidInjection
+import dagger.android.AndroidInjector
+import dagger.android.DispatchingAndroidInjector
+import dagger.android.support.HasSupportFragmentInjector
+import javax.inject.Inject
 
-abstract class BaseActivity<T : ViewDataBinding>: AppCompatActivity() {
+
+abstract class BaseActivity<T : ViewDataBinding>: AppCompatActivity(), HasSupportFragmentInjector {
 
     lateinit var binding: T
 
     @LayoutRes
     protected abstract fun getLayoutId(): Int
 
+    @Inject
+    lateinit var fragmentInjector: DispatchingAndroidInjector<Fragment>
+
     override fun onCreate(savedInstanceState: Bundle?) {
+        performDI()
         super.onCreate(savedInstanceState)
         performDataBinding()
     }
@@ -22,4 +33,12 @@ abstract class BaseActivity<T : ViewDataBinding>: AppCompatActivity() {
         binding = DataBindingUtil.setContentView(this, getLayoutId())
         binding.executePendingBindings()
     }
+
+    private fun performDI() {
+        AndroidInjection.inject(this)
+    }
+
+    override fun supportFragmentInjector(): AndroidInjector<Fragment> {
+        return fragmentInjector
+    }
 }

+ 18 - 0
core/src/main/java/com/mrozon/core/base/BaseFragment.kt

@@ -1,5 +1,7 @@
 package com.mrozon.core.base
 
+import android.app.Activity
+import android.content.Context
 import android.os.Bundle
 import android.view.LayoutInflater
 import android.view.View
@@ -10,6 +12,8 @@ import androidx.annotation.LayoutRes
 import androidx.databinding.DataBindingUtil
 import androidx.databinding.ViewDataBinding
 import androidx.fragment.app.Fragment
+import dagger.android.AndroidInjection
+import dagger.android.support.AndroidSupportInjection
 
 abstract class BaseFragment<T : ViewDataBinding>: Fragment(),
     ViewTreeObserver.OnGlobalLayoutListener {
@@ -24,6 +28,16 @@ abstract class BaseFragment<T : ViewDataBinding>: Fragment(),
         rootView!!.viewTreeObserver.removeOnGlobalLayoutListener(this)
     }
 
+//    override fun onCreate(savedInstanceState: Bundle?) {
+//        performDI()
+//        super.onCreate(savedInstanceState)
+//    }
+
+    override fun onAttach(context: Context) {
+        performDI()
+        super.onAttach(context)
+    }
+
     override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
         val layoutId = getLayoutId()
         if (rootView != null) {
@@ -47,4 +61,8 @@ abstract class BaseFragment<T : ViewDataBinding>: Fragment(),
         return rootView
     }
 
+    private fun performDI() {
+        AndroidSupportInjection.inject(this)
+    }
+
 }

+ 1 - 1
core/src/main/java/com/mrozon/core/base/BaseViewModel.kt

@@ -5,7 +5,7 @@ import io.reactivex.disposables.CompositeDisposable
 import io.reactivex.disposables.Disposable
 
 abstract class BaseViewModel: ViewModel() {
-    var compositeDisposable: CompositeDisposable = CompositeDisposable()
+    private var compositeDisposable: CompositeDisposable = CompositeDisposable()
 
     override fun onCleared() {
         compositeDisposable.dispose()