Continue setting up dagger

This commit is contained in:
ganfra 2022-12-14 16:11:04 +01:00
parent cb92ff5d3b
commit 05dc3b636c
14 changed files with 177 additions and 31 deletions

View file

@ -1,32 +1,31 @@
package io.element.android.x
import android.app.Application
import coil.ImageLoader
import coil.ImageLoaderFactory
import com.airbnb.mvrx.Mavericks
import androidx.startup.AppInitializer
import io.element.android.x.core.di.DaggerComponentOwner
import io.element.android.x.di.DaggerAppComponent
import io.element.android.x.initializer.CoilInitializer
import io.element.android.x.initializer.MavericksInitializer
import io.element.android.x.initializer.TimberInitializer
import io.element.android.x.matrix.MatrixInstance
import kotlinx.coroutines.CoroutineName
import kotlinx.coroutines.MainScope
import kotlinx.coroutines.plus
import timber.log.Timber
class ElementXApplication : Application(), ImageLoaderFactory {
class ElementXApplication : Application(), DaggerComponentOwner {
override lateinit var daggerComponent: Any
private val applicationScope = MainScope() + CoroutineName("ElementX Scope")
override fun onCreate() {
super.onCreate()
Timber.plant(Timber.DebugTree())
daggerComponent = DaggerAppComponent.factory().create(this)
MatrixInstance.init(this, applicationScope)
Mavericks.initialize(this)
AppInitializer.getInstance(this).apply {
initializeComponent(TimberInitializer::class.java)
initializeComponent(CoilInitializer::class.java)
initializeComponent(MavericksInitializer::class.java)
}
}
override fun newImageLoader(): ImageLoader {
return ImageLoader
.Builder(this)
.components {
MatrixInstance.getInstance().registerComponents(this)
}
.build()
}
}
}

View file

@ -32,8 +32,11 @@ import com.google.accompanist.navigation.material.ExperimentalMaterialNavigation
import com.ramcosta.composedestinations.DestinationsNavHost
import com.ramcosta.composedestinations.animations.defaults.RootNavGraphDefaultAnimations
import com.ramcosta.composedestinations.animations.rememberAnimatedNavHostEngine
import com.ramcosta.composedestinations.manualcomposablecalls.animatedComposable
import com.ramcosta.composedestinations.navigation.dependency
import com.ramcosta.composedestinations.spec.Route
import io.element.android.x.core.compose.OnLifecycleEvent
import io.element.android.x.core.di.DaggerComponentOwner
import io.element.android.x.designsystem.ElementXTheme
import io.element.android.x.destinations.OnBoardingScreenNavigationDestination
import kotlinx.coroutines.runBlocking
@ -147,7 +150,10 @@ class MainActivity : ComponentActivity() {
engine = engine,
navController = navController,
navGraph = NavGraphs.root,
startRoute = startRoute
startRoute = startRoute,
dependenciesContainerBuilder = {
}
)
}

View file

@ -0,0 +1,12 @@
package io.element.android.x.di
import com.squareup.anvil.annotations.ContributesTo
import io.element.android.x.di.AppScope
import io.element.android.x.matrix.Matrix
import kotlinx.coroutines.CoroutineScope
@ContributesTo(AppScope::class)
interface AppBindings {
fun coroutineScope(): CoroutineScope
fun matrix(): Matrix
}

View file

@ -0,0 +1,16 @@
package io.element.android.x.di
import android.app.Application
import com.squareup.anvil.annotations.MergeComponent
import dagger.BindsInstance
import dagger.Component
@SingleIn(AppScope::class)
@MergeComponent(AppScope::class)
interface AppComponent {
@Component.Factory
interface Factory {
fun create(@BindsInstance application: Application): AppComponent
}
}

View file

@ -0,0 +1,20 @@
package io.element.android.x.di
import com.squareup.anvil.annotations.ContributesTo
import dagger.Module
import dagger.Provides
import kotlinx.coroutines.CoroutineName
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.MainScope
import kotlinx.coroutines.plus
@Module
@ContributesTo(AppScope::class)
object AppModule {
@Provides
@SingleIn(AppScope::class)
fun providesAppCoroutineScope(): CoroutineScope {
return MainScope() + CoroutineName("ElementX Scope")
}
}

View file

@ -0,0 +1,36 @@
package io.element.android.x.initializer
import android.content.Context
import androidx.startup.Initializer
import coil.Coil
import coil.ImageLoader
import coil.ImageLoaderFactory
import io.element.android.x.core.di.DaggerComponentOwner
import io.element.android.x.core.di.bindings
import io.element.android.x.di.AppBindings
import io.element.android.x.di.AppComponent
class CoilInitializer : Initializer<Unit> {
override fun create(context: Context) {
Coil.setImageLoader(ElementImageLoaderFactory(context))
}
override fun dependencies(): MutableList<Class<out Initializer<*>>> = mutableListOf()
}
private class ElementImageLoaderFactory(
private val context: Context
) :
ImageLoaderFactory {
override fun newImageLoader(): ImageLoader {
return ImageLoader
.Builder(context)
.components {
context.bindings<AppBindings>().matrix().registerCoilComponents(this)
}
.build()
}
}

View file

@ -0,0 +1,16 @@
package io.element.android.x.initializer
import android.content.Context
import androidx.startup.Initializer
import com.airbnb.mvrx.Mavericks
class MavericksInitializer : Initializer<Unit> {
override fun create(context: Context) {
Mavericks.initialize(context)
}
override fun dependencies(): MutableList<Class<out Initializer<*>>> = mutableListOf()
}

View file

@ -0,0 +1,14 @@
package io.element.android.x.initializer
import android.content.Context
import androidx.startup.Initializer
import timber.log.Timber
class TimberInitializer: Initializer<Unit> {
override fun create(context: Context) {
Timber.plant(Timber.DebugTree())
}
override fun dependencies(): MutableList<Class<out Initializer<*>>> = mutableListOf()
}