Răsfoiți Sursa

code improvements

Milan Jurkulak 3 ani în urmă
părinte
comite
ffe67adc1c

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

@@ -66,7 +66,7 @@ class MainPage : Page() {
         val onItemClick: (item: Any?) -> Unit = { item ->
             val dataId = (item as? ItemWithId)?.id
             if (dataId != null) {
-                viewModel.findMovie(dataId)?.let { movie ->
+                viewModel.findMovie(dataId) { movie ->
                     navController?.startActivity<IPTVActivity>(IPTV_DATA to movie)
                 }
             } else if (item is Serializable) {

+ 5 - 12
app/src/main/kotlin/org/mjdev/tvapp/ui/screens/DetailScreen.kt

@@ -14,17 +14,14 @@ import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.material.icons.Icons
 import androidx.compose.material.icons.filled.Info
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.vector.ImageVector
 import androidx.navigation.navArgument
 import org.mjdev.tvapp.R
-import org.mjdev.tvapp.data.local.Movie
 import org.mjdev.tvapp.viewmodel.DetailViewModel
 import org.mjdev.tvlib.annotations.TvPreview
 import org.mjdev.tvlib.extensions.HiltExt.appViewModel
-import org.mjdev.tvlib.interfaces.ItemAudio
-import org.mjdev.tvlib.interfaces.ItemPhoto
-import org.mjdev.tvlib.interfaces.ItemVideo
 import org.mjdev.tvlib.navigation.AnyType
 import org.mjdev.tvlib.screen.Screen
 import org.mjdev.tvlib.ui.components.gallery.Gallery
@@ -54,17 +51,13 @@ class DetailScreen : Screen() {
             DetailViewModel.mockDetailViewModel(context)
         }
 
-        val data: Any? = args[data]
+        val data: Any? = remember { args[data] }
 
-        val dataList: List<Any?> = when (data) {
-            is ItemAudio -> viewModel.localAudioCursor
-            is ItemVideo -> viewModel.localVideoCursor
-            is ItemPhoto -> viewModel.localPhotoCursor
-            is Movie -> viewModel.mediaItems
-            else -> listOf(data)
+        val dataList = remember(data) {
+            viewModel.mediaItemsFor(data)
         }
 
-        Gallery (
+        Gallery(
             modifier = Modifier.fillMaxSize(),
             list = dataList,
             index = dataList.indexOf(data)

+ 5 - 23
app/src/main/kotlin/org/mjdev/tvapp/viewmodel/DetailViewModel.kt

@@ -52,32 +52,14 @@ class DetailViewModel @Inject constructor() : BaseViewModel() {
         }
     }
 
-    val localMediaItemsAudio by lazy {
-        localAudioCursor.map { item ->
-            item.mediaItem
-        }
-    }
-
-    val localMediaItemsVideo by lazy {
-        localVideoCursor.map { item ->
-            item.mediaItem
-        }
-    }
-
-    val localMediaItemsPhoto by lazy {
-        localPhotoCursor.map { item ->
-            item.mediaItem
-        }
-    }
-
     fun mediaItemsFor(
         data: Any?
-    ): List<MediaItem> = when (data) {
-        is ItemAudio -> localMediaItemsAudio
-        is ItemVideo -> localMediaItemsVideo
-        is ItemPhoto -> localMediaItemsPhoto
+    ): List<Any?> = when (data) {
+        is ItemAudio -> localAudioCursor
+        is ItemVideo -> localVideoCursor
+        is ItemPhoto -> localPhotoCursor
         is Movie -> mediaItems
-        else -> listOf(data).map { item -> item.mediaItem }
+        else -> listOf(data)
     }
 
     companion object {

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

@@ -110,9 +110,14 @@ class MainViewModel @Inject constructor(
         }
     }.stateInViewModel()
 
-    fun findMovie(id: Long?): Movie? = dao.movieDao.query()
+    fun findMovie(
+        id: Long?,
+        findBlock: (movie: Movie?) -> Unit
+    ): Movie? = dao.movieDao.query()
         .equal(Movie_.id, id ?: -1)
-        .build().findFirst()
+        .build()
+        .findFirst()
+        .apply(findBlock)
 
     companion object {
 

+ 1 - 1
app/src/main/kotlin/org/mjdev/tvapp/widget/MainAppWidget.kt

@@ -9,7 +9,6 @@
 package org.mjdev.tvapp.widget
 
 import android.content.Context
-import androidx.compose.foundation.layout.Column
 import androidx.compose.runtime.Composable
 import androidx.compose.ui.tooling.preview.Preview
 import androidx.glance.Button
@@ -21,6 +20,7 @@ import androidx.glance.action.clickable
 import androidx.glance.appwidget.GlanceAppWidget
 import androidx.glance.appwidget.action.actionRunCallback
 import androidx.glance.appwidget.provideContent
+import androidx.glance.layout.Column
 import androidx.glance.text.Text
 import org.mjdev.tvapp.activity.MainActivity
 

+ 13 - 0
tvlib/src/main/kotlin/org/mjdev/tvlib/viewmodel/BaseViewModel.kt

@@ -8,14 +8,17 @@
 
 package org.mjdev.tvlib.viewmodel
 
+import androidx.lifecycle.MutableLiveData
 import androidx.lifecycle.ViewModel
 import androidx.lifecycle.viewModelScope
+import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.flow.SharingStarted
 import kotlinx.coroutines.flow.StateFlow
 import kotlinx.coroutines.flow.onEach
 import kotlinx.coroutines.flow.stateIn
+import kotlinx.coroutines.launch
 import timber.log.Timber
 
 @Suppress("unused")
@@ -74,4 +77,14 @@ open class BaseViewModel : ViewModel() {
         initial
     )
 
+    fun <T> async(
+        block: suspend CoroutineScope.() -> T
+    )  : MutableLiveData<T>  {
+        val result = MutableLiveData<T>()
+        viewModelScope.launch {
+            result.postValue(block())
+        }
+        return result
+    }
+
 }