Explorar el Código

kodein improvements

milan jurkulák hace 2 años
padre
commit
da881a6690

+ 9 - 11
app/src/main/kotlin/org/mjdev/tvapp/app/Application.kt

@@ -13,27 +13,17 @@ import org.kodein.di.DI
 import org.kodein.di.DIAware
 import org.kodein.di.android.x.androidXContextTranslators
 import org.kodein.di.bind
-import org.kodein.di.instance
 import org.kodein.di.singleton
 import org.mjdev.tvapp.BuildConfig
 import org.mjdev.tvapp.cast.CastService
-import org.mjdev.tvapp.database.DAO
 import org.mjdev.tvapp.module.ApplicationModule
 import org.mjdev.tvapp.sync.SyncService.Companion.createAccountAndSync
 import org.mjdev.tvlib.application.TvApplication
 import timber.log.Timber
 
-@Suppress("PropertyName")
 class Application : TvApplication(), DIAware {
 
-    override val di by DI.lazy {
-        import(androidXContextTranslators)
-        bind<Application>() with singleton { applicationContext as Application }
-        bind<Context>() with singleton { applicationContext }
-        import(ApplicationModule)
-    }
-
-    val DAO : DAO by instance()
+    override val di by lazy { getDI(this) }
 
     override fun onCreate() {
         super.onCreate()
@@ -44,4 +34,12 @@ class Application : TvApplication(), DIAware {
         CastService.start(this)
     }
 
+    companion object {
+        fun getDI(context: Context): DI = DI.lazy {
+            import(androidXContextTranslators)
+            bind<Context>() with singleton { context }
+            import(ApplicationModule)
+        }
+    }
+
 }

+ 5 - 1
app/src/main/kotlin/org/mjdev/tvapp/ui/pages/MainPage.kt

@@ -25,11 +25,13 @@ import androidx.compose.runtime.remember
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.vector.ImageVector
+import androidx.compose.ui.platform.LocalContext
 import org.mjdev.tvapp.BuildConfig
 import org.mjdev.tvapp.R
 import org.mjdev.tvapp.activity.IPTVActivity
 import org.mjdev.tvapp.activity.IPTVActivity.Companion.IPTV_DATA
 import org.mjdev.tvapp.activity.MainActivity
+import org.mjdev.tvapp.app.Application
 import org.mjdev.tvapp.data.events.SyncEvent
 import org.mjdev.tvapp.sync.SyncAdapter.Companion.pauseSync
 import org.mjdev.tvlib.data.local.User
@@ -62,7 +64,9 @@ class MainPage : Page() {
     @Composable
     override fun Content() {
         val navController = rememberNavControllerEx()
-        val viewModel: MainViewModel by rememberInstance()
+        val viewModel: MainViewModel by rememberInstance {
+            Application.getDI(LocalContext.current)
+        }
         val syncEvents by observedEvents<SyncEvent>()
         // refresh every 32 items, todo improve
         val needRefresh by remember {

+ 5 - 1
app/src/main/kotlin/org/mjdev/tvapp/ui/screens/GalleryScreen.kt

@@ -17,9 +17,11 @@ import androidx.compose.runtime.Composable
 import androidx.compose.runtime.remember
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.vector.ImageVector
+import androidx.compose.ui.platform.LocalContext
 import androidx.navigation.navArgument
 import org.mjdev.tvlib.extensions.KodeinExt.rememberInstance
 import org.mjdev.tvapp.R
+import org.mjdev.tvapp.app.Application
 import org.mjdev.tvapp.sync.SyncAdapter.Companion.pauseSyncUntilGone
 import org.mjdev.tvapp.viewmodel.DetailViewModel
 import org.mjdev.tvlib.annotations.Previews
@@ -49,7 +51,9 @@ class GalleryScreen : Screen() {
     @Previews
     @Composable
     override fun Content() {
-        val viewModel: DetailViewModel by rememberInstance()
+        val viewModel: DetailViewModel by rememberInstance {
+            Application.getDI(LocalContext.current)
+        }
         val data: Any? = remember(args) { args[data] }
         val dataList = remember(data) {
             viewModel.mediaItemsFor(data)

+ 5 - 1
app/src/main/kotlin/org/mjdev/tvapp/ui/screens/IPTVScreen.kt

@@ -17,10 +17,12 @@ import androidx.compose.runtime.Composable
 import androidx.compose.runtime.remember
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.vector.ImageVector
+import androidx.compose.ui.platform.LocalContext
 import androidx.media3.common.MediaItem
 import androidx.navigation.navArgument
 import org.mjdev.tvlib.extensions.KodeinExt.rememberInstance
 import org.mjdev.tvapp.R
+import org.mjdev.tvapp.app.Application
 import org.mjdev.tvapp.sync.SyncAdapter.Companion.pauseSyncUntilGone
 import org.mjdev.tvapp.viewmodel.IPTVViewModel
 import org.mjdev.tvlib.annotations.Previews
@@ -53,7 +55,9 @@ class IPTVScreen : Screen() {
     @Previews
     @Composable
     override fun Content() {
-        val viewModel: IPTVViewModel by rememberInstance()
+        val viewModel: IPTVViewModel by rememberInstance {
+            Application.getDI(LocalContext.current)
+        }
         val data: Any? = args[data]
         val dataList: List<MediaItem> = remember(data) {
             viewModel.mediaItemsFor(data)

+ 2 - 8
app/src/main/kotlin/org/mjdev/tvapp/viewmodel/DetailViewModel.kt

@@ -10,16 +10,14 @@ package org.mjdev.tvapp.viewmodel
 
 import android.content.Context
 import org.kodein.di.DI
-import org.kodein.di.bind
 import org.kodein.di.instance
-import org.kodein.di.singleton
+import org.mjdev.tvapp.app.Application
 import org.mjdev.tvapp.data.local.Media
 import org.mjdev.tvlib.helpers.cursor.AudioCursor
 import org.mjdev.tvlib.helpers.cursor.PhotoCursor
 import org.mjdev.tvlib.helpers.cursor.VideoCursor
 import org.mjdev.tvlib.viewmodel.BaseViewModel
 import org.mjdev.tvapp.database.DAO
-import org.mjdev.tvapp.module.MainModule
 import org.mjdev.tvlib.extensions.MediaItemExt.mediaItem
 import org.mjdev.tvlib.interfaces.ItemAudio
 import org.mjdev.tvlib.interfaces.ItemPhoto
@@ -58,10 +56,6 @@ class DetailViewModel(
         else -> listOf(data.mediaItem)
     }
 
-    override fun mockDI(context: Context): DI = DI.lazy(allowSilentOverride = true) {
-        bind<Context>() with singleton { context }
-        bind<DAO>() with singleton { DAO(context) }
-        import(MainModule)
-    }
+    override fun mockDI(context: Context): DI = Application.getDI(context)
 
 }

+ 2 - 8
app/src/main/kotlin/org/mjdev/tvapp/viewmodel/IPTVViewModel.kt

@@ -13,16 +13,14 @@ package org.mjdev.tvapp.viewmodel
 import android.content.Context
 import androidx.media3.common.MediaItem
 import org.kodein.di.DI
-import org.kodein.di.bind
 import org.kodein.di.instance
-import org.kodein.di.singleton
+import org.mjdev.tvapp.app.Application
 import org.mjdev.tvapp.data.local.Media
 import org.mjdev.tvlib.helpers.cursor.AudioCursor
 import org.mjdev.tvlib.helpers.cursor.PhotoCursor
 import org.mjdev.tvlib.helpers.cursor.VideoCursor
 import org.mjdev.tvlib.viewmodel.BaseViewModel
 import org.mjdev.tvapp.database.DAO
-import org.mjdev.tvapp.module.MainModule
 import org.mjdev.tvlib.extensions.MediaItemExt.mediaItem
 import org.mjdev.tvlib.interfaces.ItemAudio
 import org.mjdev.tvlib.interfaces.ItemPhoto
@@ -68,10 +66,6 @@ class IPTVViewModel (
         return cache[T::class] ?: emptyList()
     }
 
-    override fun mockDI(context: Context): DI = DI.lazy(allowSilentOverride = true) {
-        bind<Context>() with singleton { context }
-        bind<DAO>() with singleton { DAO(context) }
-        import(MainModule)
-    }
+    override fun mockDI(context: Context): DI = Application.getDI(context)
 
 }

+ 2 - 8
app/src/main/kotlin/org/mjdev/tvapp/viewmodel/MainViewModel.kt

@@ -14,15 +14,13 @@ import kotlinx.coroutines.flow.channelFlow
 import kotlinx.coroutines.flow.flow
 import kotlinx.coroutines.flow.flowOn
 import org.kodein.di.DI
-import org.kodein.di.bind
 import org.kodein.di.instance
-import org.kodein.di.singleton
+import org.mjdev.tvapp.app.Application
 import org.mjdev.tvlib.helpers.cursor.AudioCursor
 import org.mjdev.tvlib.helpers.cursor.PhotoCursor
 import org.mjdev.tvlib.helpers.cursor.VideoCursor
 import org.mjdev.tvlib.viewmodel.BaseViewModel
 import org.mjdev.tvapp.database.DAO
-import org.mjdev.tvapp.module.MainModule
 import org.mjdev.tvlib.extensions.ListExt.asMap
 import org.mjdev.tvlib.extensions.ListExt.takeIf
 import org.mjdev.tvlib.interfaces.ItemWithImage.Companion.hasImage
@@ -77,10 +75,6 @@ class MainViewModel(context: Context) : BaseViewModel(context) {
             emit(dao.countriesDao.all)
         }.flowOn(Dispatchers.IO).stateInViewModel()
 
-    override fun mockDI(context: Context): DI = DI.lazy(allowSilentOverride = true) {
-        bind<Context>() with singleton { context }
-        bind<DAO>() with singleton { DAO(context) }
-        import(MainModule)
-    }
+    override fun mockDI(context: Context): DI = Application.getDI(context)
 
 }