Skip to content

Commit

Permalink
refactor: di
Browse files Browse the repository at this point in the history
  • Loading branch information
makeevrserg committed Oct 11, 2023
1 parent f7830d5 commit 1367a8e
Show file tree
Hide file tree
Showing 16 changed files with 138 additions and 113 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,24 +12,26 @@ import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.core.view.WindowCompat
import com.arkivanov.decompose.defaultComponentContext
import com.makeevrserg.empireprojekt.mobile.application.App.Companion.asEmpireApp
import com.makeevrserg.empireprojekt.mobile.core.ui.rememberSlotModalBottomSheetState
import com.makeevrserg.empireprojekt.mobile.core.ui.theme.AppTheme
import com.makeevrserg.empireprojekt.mobile.features.root.DefaultRootComponent
import com.makeevrserg.empireprojekt.mobile.features.root.di.RootModule
import com.makeevrserg.empireprojekt.mobile.features.root.modal.DefaultRootBottomSheetComponent
import com.makeevrserg.empireprojekt.mobile.features.ui.info.InfoScreen
import com.makeevrserg.empireprojekt.mobile.features.ui.root.ApplicationContent
import com.makeevrserg.empireprojekt.mobile.features.ui.root.ComposeApplication
import com.makeevrserg.empireprojekt.mobile.resources.R
import ru.astrainteractive.klibs.kdi.Provider
import ru.astrainteractive.klibs.kdi.getValue

@ExperimentalMaterialApi
@ExperimentalComposeUiApi
@ExperimentalAnimationApi
@ExperimentalFoundationApi
class MainActivity : ComponentActivity() {
private val rootModule by RootModule
private val servicesModule by rootModule.servicesModule
private val rootModule by Provider {
application.asEmpireApp().rootModule
}

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
package com.makeevrserg.empireprojekt.mobile.application

import android.app.Application
import android.content.Context
import androidx.work.ExistingPeriodicWorkPolicy
import androidx.work.PeriodicWorkRequest
import androidx.work.WorkManager
import com.google.android.horologist.annotations.ExperimentalHorologistApi
import com.google.android.horologist.data.WearDataLayerRegistry
import com.google.firebase.ktx.Firebase
import com.google.firebase.ktx.initialize
import com.makeevrserg.empireprojekt.mobile.features.root.di.RootModule
import com.makeevrserg.empireprojekt.mobile.services.core.CoroutineFeature
import com.makeevrserg.empireprojekt.mobile.features.root.di.impl.RootModuleImpl
import com.makeevrserg.empireprojekt.mobile.work.CheckStatusWork
import kotlinx.coroutines.cancel
import kotlinx.coroutines.delay
Expand All @@ -21,12 +21,13 @@ import java.util.concurrent.TimeUnit

@OptIn(ExperimentalHorologistApi::class)
class App : Application() {
private val servicesModule by RootModule.servicesModule
private val coroutineFeature = CoroutineFeature.Default()
val rootModule by lazy {
RootModuleImpl()
}
private val wearDataLayerRegistry by lazy {
WearDataLayerRegistry.fromContext(
application = applicationContext,
coroutineScope = coroutineFeature
coroutineScope = rootModule.servicesModule.mainScope.value
)
}
private val messageClient by lazy {
Expand All @@ -35,17 +36,17 @@ class App : Application() {

override fun onTerminate() {
super.onTerminate()
coroutineFeature.cancel()
rootModule.servicesModule.mainScope.value.cancel()
}

override fun onCreate() {
super.onCreate()
Firebase.initialize(this)
servicesModule.platformConfiguration.initialize(
rootModule.servicesModule.platformConfiguration.initialize {
DefaultAndroidPlatformConfiguration(
applicationContext
)
)
}
scheduleWork()
}

Expand All @@ -61,15 +62,20 @@ class App : Application() {
ExistingPeriodicWorkPolicy.CANCEL_AND_REENQUEUE,
statusWork
)
coroutineFeature.launch {
rootModule.servicesModule.mainScope.value.launch {
while (isActive) {
delay(5000L)
CheckStatusWork.sendMessageOnWear(
wearDataLayerRegistry = wearDataLayerRegistry,
rootModule = RootModule,
rootModule = rootModule,
messageClient = messageClient
)
}
}
}

companion object {
fun Application.asEmpireApp(): App = (this as App)
fun Context.asEmpireApp(): App = (applicationContext as App)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,21 +7,28 @@ import androidx.work.WorkerParameters
import com.google.android.gms.wearable.MessageClient
import com.google.android.horologist.annotations.ExperimentalHorologistApi
import com.google.android.horologist.data.WearDataLayerRegistry
import com.makeevrserg.empireprojekt.mobile.application.App.Companion.asEmpireApp
import com.makeevrserg.empireprojekt.mobile.features.root.di.RootModule
import com.makeevrserg.empireprojekt.mobile.features.status.StatusComponent
import kotlinx.coroutines.async
import kotlinx.coroutines.awaitAll
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.tasks.await
import ru.astrainteractive.klibs.kdi.Provider
import ru.astrainteractive.klibs.kdi.getValue

@OptIn(ExperimentalHorologistApi::class)
class CheckStatusWork(
context: Context,
params: WorkerParameters
) : CoroutineWorker(context, params) {
private val rootModule by RootModule
private val rootStatusComponent by rootModule.rootStatusComponent

private val rootModule by lazy {
applicationContext.asEmpireApp().rootModule
}
private val rootStatusComponent by Provider {
rootModule.rootStatusComponent.value
}

override suspend fun doWork(): Result = coroutineScope {
Log.d(TAG, "doWork: ")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,21 +1,19 @@
package com.makeevrserg.empireprojekt.mobile.features.root.di

import com.makeevrserg.empireprojekt.mobile.features.root.di.impl.root.RootModuleImpl
import com.makeevrserg.empireprojekt.mobile.features.logic.splash.di.SplashComponentModule
import com.makeevrserg.empireprojekt.mobile.features.status.di.StatusModule
import com.makeevrserg.empireprojekt.mobile.features.status.root.RootStatusComponent
import com.makeevrserg.empireprojekt.mobile.features.theme.ThemeSwitcherComponent
import com.russhwolf.settings.Settings
import kotlinx.coroutines.CoroutineScope
import ru.astrainteractive.klibs.kdi.Module
import ru.astrainteractive.klibs.kdi.Single
import ru.astrainteractive.klibs.mikro.core.dispatchers.KotlinDispatchers

interface RootModule : Module {

val servicesModule: ServicesModule
val statusModule: StatusModule
val splashModule: SplashComponentModule

val settings: Single<Settings>
val dispatchers: Single<KotlinDispatchers>
val mainScope: Single<CoroutineScope>
val themeSwitcherComponent: Single<ThemeSwitcherComponent>
// Global components
val rootStatusComponent: Single<RootStatusComponent>
companion object : RootModule by RootModuleImpl
val themeSwitcherComponent: Single<ThemeSwitcherComponent>
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,23 @@
package com.makeevrserg.empireprojekt.mobile.features.root.di

import com.makeevrserg.empireprojekt.mobile.services.core.LinkBrowser
import com.russhwolf.settings.Settings
import io.ktor.client.HttpClient
import kotlinx.coroutines.CoroutineScope
import kotlinx.serialization.json.Json
import ru.astrainteractive.klibs.kdi.Lateinit
import ru.astrainteractive.klibs.kdi.Module
import ru.astrainteractive.klibs.kdi.Single
import ru.astrainteractive.klibs.mikro.core.dispatchers.KotlinDispatchers
import ru.astrainteractive.klibs.mikro.platform.PlatformConfiguration

interface ServicesModule : Module {

val platformConfiguration: Lateinit<PlatformConfiguration>
val jsonConfiguration: Single<Json>
val httpClient: Single<HttpClient>
val linkBrowser: Single<LinkBrowser>
val settings: Single<Settings>
val dispatchers: Single<KotlinDispatchers>
val mainScope: Single<CoroutineScope>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package com.makeevrserg.empireprojekt.mobile.features.root.di.impl

import com.makeevrserg.empireprojekt.mobile.features.logic.splash.di.SplashComponentModule
import com.makeevrserg.empireprojekt.mobile.features.root.di.RootModule
import com.makeevrserg.empireprojekt.mobile.features.root.di.ServicesModule
import com.makeevrserg.empireprojekt.mobile.features.status.di.StatusModule
import com.makeevrserg.empireprojekt.mobile.features.status.root.DefaultRootStatusComponent
import com.makeevrserg.empireprojekt.mobile.features.status.root.RootStatusComponent
import com.makeevrserg.empireprojekt.mobile.features.theme.DefaultThemeSwitcherComponentComponent
import com.makeevrserg.empireprojekt.mobile.features.theme.ThemeSwitcherComponent
import ru.astrainteractive.klibs.kdi.Provider
import ru.astrainteractive.klibs.kdi.Single
import ru.astrainteractive.klibs.kdi.getValue

class RootModuleImpl : RootModule {

override val servicesModule: ServicesModule by Single {
ServicesModuleImpl()
}

override val statusModule: StatusModule by Provider {
StatusModule.Default(
dispatchers = servicesModule.dispatchers.value,
httpClient = servicesModule.httpClient.value
)
}

override val splashModule: SplashComponentModule by Provider {
SplashComponentModule.Default(
mainScope = servicesModule.mainScope.value,
dispatchers = servicesModule.dispatchers.value
)
}

override val rootStatusComponent: Single<RootStatusComponent> = Single {
DefaultRootStatusComponent(statusModule)
}

override val themeSwitcherComponent: Single<ThemeSwitcherComponent> = Single {
DefaultThemeSwitcherComponentComponent(servicesModule.settings.value)
}
}
Original file line number Diff line number Diff line change
@@ -1,18 +1,23 @@
package com.makeevrserg.empireprojekt.mobile.features.root.di.impl.root
package com.makeevrserg.empireprojekt.mobile.features.root.di.impl

import com.makeevrserg.empireprojekt.mobile.features.root.di.ServicesModule
import com.makeevrserg.empireprojekt.mobile.features.root.di.factory.LinkBrowserFactory
import com.makeevrserg.empireprojekt.mobile.features.root.di.factory.SettingsFactory
import com.makeevrserg.empireprojekt.mobile.services.core.LinkBrowser
import io.ktor.client.HttpClient
import io.ktor.client.plugins.contentnegotiation.ContentNegotiation
import io.ktor.serialization.kotlinx.json.json
import kotlinx.coroutines.MainScope
import kotlinx.serialization.json.Json
import ru.astrainteractive.klibs.kdi.Lateinit
import ru.astrainteractive.klibs.kdi.Single
import ru.astrainteractive.klibs.kdi.getValue
import ru.astrainteractive.klibs.mikro.core.dispatchers.DefaultKotlinDispatchers
import ru.astrainteractive.klibs.mikro.core.dispatchers.KotlinDispatchers
import ru.astrainteractive.klibs.mikro.platform.PlatformConfiguration

internal class ServicesModuleImpl : ServicesModule {

override val platformConfiguration = Lateinit<PlatformConfiguration>()

override val jsonConfiguration = Single {
Expand All @@ -35,4 +40,17 @@ internal class ServicesModuleImpl : ServicesModule {
override val linkBrowser: Single<LinkBrowser> = Single {
LinkBrowserFactory(platformConfiguration.value).create()
}

override val settings = Single {
val configuration by platformConfiguration
SettingsFactory(configuration).create()
}

override val dispatchers = Single<KotlinDispatchers> {
DefaultKotlinDispatchers
}

override val mainScope = Single {
MainScope()
}
}

This file was deleted.

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package com.makeevrserg.empireprojekt.mobile.features.root.screen.di.factory
import com.arkivanov.decompose.ComponentContext
import com.makeevrserg.empireprojekt.mobile.features.logic.splash.DefaultSplashComponent
import com.makeevrserg.empireprojekt.mobile.features.root.di.RootModule
import com.makeevrserg.empireprojekt.mobile.features.root.di.impl.splash.SplashComponentModuleImpl
import com.makeevrserg.empireprojekt.mobile.features.root.screen.DefaultRootScreenComponent
import com.makeevrserg.empireprojekt.mobile.features.root.screen.RootScreenComponent
import ru.astrainteractive.klibs.kdi.Factory
Expand All @@ -18,10 +17,7 @@ class RootScreenComponentChildFactory(
RootScreenComponent.Child.Splash -> DefaultRootScreenComponent.Configuration.Splash(
splashComponent = DefaultSplashComponent(
context = context,
module = SplashComponentModuleImpl(
rootModule = rootModule,
servicesModule = rootModule.servicesModule
)
module = rootModule.splashModule
)
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,15 @@ package com.makeevrserg.empireprojekt.mobile.features.status.di

import io.ktor.client.HttpClient
import ru.astrainteractive.klibs.kdi.Module
import ru.astrainteractive.klibs.kdi.getValue
import ru.astrainteractive.klibs.mikro.core.dispatchers.KotlinDispatchers

interface StatusModule : Module {
val dispatchers: KotlinDispatchers
val httpClient: HttpClient

class Default(
override val dispatchers: KotlinDispatchers,
override val httpClient: HttpClient
) : StatusModule
}
Loading

0 comments on commit 1367a8e

Please sign in to comment.